Nodejs环境下mongodb 存储占用 硬盘空间太大了

Nodejs环境下mongodb 存储占用 硬盘空间太大了

我用的是 ubuntu-64 版的mongodb ,想发布时才发现 大部分 虚拟主机 提供的 存储空间 都是 10G以内, 而单纯的创建 一个数据库 mongodb 就能 占用 3.5GB,且不到 几十兆 的测试数据 在使用 了 一段时间后存储空间就高达 8G 左右。 请问是否有什么配置方法可以将mongodb 占用的存储空间尽量的降低? 或者有没有什么适合小型网站 搭建的 数据库可以推荐,估计纯数据大小在1G 左右.

4 回复

在 Node.js 环境下使用 MongoDB 时,如果发现 MongoDB 占用了大量的硬盘空间,可以通过一些配置和优化措施来减少存储空间的占用。以下是一些具体的建议和示例代码,帮助你更好地管理和优化 MongoDB 的存储空间。

1. 使用 WiredTiger 存储引擎

MongoDB 默认使用 WiredTiger 存储引擎,它比之前的 MMAPv1 引擎更高效,但如果你希望进一步压缩数据,可以考虑启用压缩功能。

示例配置文件(mongod.conf):

storage:
  engine: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 2  # 设置缓存大小
      journalCompressor: snappy  # 日志压缩
      directoryForIndexes: true  # 索引存储目录

2. 启用压缩

WiredTiger 支持多种压缩算法,如 Snappy、Zlib 和 LZ4。你可以通过配置文件启用这些压缩算法。

示例配置文件(mongod.conf):

storage:
  engine: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 2
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: snappy  # 数据块压缩

3. 删除无用索引

确保你的数据库中没有不必要的索引,因为索引会占用额外的空间。可以定期检查并删除无用的索引。

示例代码:

const MongoClient = require('mongodb').MongoClient;

async function dropUnusedIndexes() {
  const uri = "your_mongodb_connection_string";
  const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });

  try {
    await client.connect();
    const db = client.db("your_database_name");
    
    // 获取所有集合
    const collections = await db.collections();
    
    for (let col of collections) {
      const indexes = await col.indexes();
      
      // 删除无用索引
      for (let index of indexes) {
        if (!index.unique && index.name !== 'id_1') {
          await col.dropIndex(index.name);
          console.log(`Dropped index: ${index.name}`);
        }
      }
    }
  } finally {
    await client.close();
  }
}

dropUnusedIndexes().catch(console.error);

4. 定期清理和归档

对于不再需要的数据,可以定期进行归档或删除操作,以释放空间。

示例代码:

async function cleanOldData() {
  const uri = "your_mongodb_connection_string";
  const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });

  try {
    await client.connect();
    const db = client.db("your_database_name");
    
    // 假设有一个 `logs` 集合,我们只保留最近一个月的数据
    const result = await db.collection('logs').deleteMany({ createdAt: { $lt: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000) } });
    console.log(`Deleted ${result.deletedCount} old logs`);
  } finally {
    await client.close();
  }
}

cleanOldData().catch(console.error);

5. 考虑其他数据库

如果你的应用对存储空间有严格限制,可以考虑使用轻量级的数据库,如 SQLite 或 LevelDB,它们占用的空间通常较小。

通过以上措施,你可以有效地管理 MongoDB 的存储空间,并为你的 Node.js 应用提供更好的性能和资源利用。


mongodb 是有这个缺点。可以用mysql或sqlite。

谢谢,我试下。

MongoDB 在默认情况下会为数据文件预留大量的空间以提高写入性能,这可能会导致存储空间占用较大。以下是一些方法来优化 MongoDB 在 Node.js 环境下的存储空间使用:

1. 调整 WiredTiger 缓存大小

MongoDB 使用 WiredTiger 作为默认存储引擎,可以通过调整缓存大小来优化磁盘使用。在 mongod.conf 文件中添加或修改以下配置:

storage:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1  # 设置缓存大小为1GB

2. 启用压缩

启用数据压缩可以减少存储空间占用。在 mongod.conf 中设置压缩参数:

storage:
  wiredTiger:
    engineConfig:
      configString: "block_compressor=zlib"

3. 定期运行 compact 命令

定期对集合进行 compaction 可以释放未使用的空间。可以在 Node.js 中通过 MongoDB Driver 执行 compact 命令:

const MongoClient = require('mongodb').MongoClient;
const uri = "your_mongodb_connection_string";

async function run() {
  const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });
  try {
    await client.connect();
    const db = client.db("your_database_name");
    await db.command({ compact: 'your_collection_name' });
  } finally {
    await client.close();
  }
}

run().catch(console.error);

4. 选择合适的数据类型

确保在设计数据库模型时选择适当的数据类型。例如,使用 Int32 而不是 Int64,除非确实需要更大的范围。

5. 考虑其他数据库

如果 MongoDB 依然占用太多空间,可以考虑其他轻量级的数据库,如 SQLite 或 LevelDB。对于小型网站,SQLite 是一个不错的选择:

npm install sqlite3

使用示例:

const sqlite3 = require('sqlite3').verbose();
let db = new sqlite3.Database(':memory:', (err) => {
  if (err) {
    console.error(err.message);
  }
  console.log('Connected to the in-memory SQlite database.');
});
db.serialize(() => {
  db.run("CREATE TABLE lorem (info TEXT)");
  const stmt = db.prepare("INSERT INTO lorem VALUES (?)");
  for (let i = 0; i < 10; i++) {
    stmt.run("Ipsum");
  }
  stmt.finalize();
  db.each("SELECT rowid AS id, info FROM lorem", (err, row) => {
    console.log(row.id + ": " + row.info);
  });
});
db.close();

这些方法可以帮助你更好地管理 MongoDB 在 Node.js 环境下的存储空间。

回到顶部