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