1. 启用高效的存储引擎与压缩配置
MongoDB默认的WiredTiger存储引擎是优化存储空间的核心选择(相比MMAPv1,它支持文档级压缩且性能更优)。通过配置压缩算法,可显著减少数据占用的磁盘空间:
/etc/mongod.conf,添加或修改以下参数,启用WiredTiger的块压缩(支持snappy、zstd等算法,其中zstd压缩比更高但CPU消耗略大,snappy则平衡了速度与压缩率):storage:
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 根据服务器内存调整(建议为物理内存的50%-75%)
collectionConfig:
blockCompressor: zstd # 或snappy
mongod --dbpath /var/lib/mongodb --wiredTigerCollectionBlockCompressor zstd
compact命令重新压缩(需停机或锁定集合):mongo --eval 'db.runCommand({compact: "yourCollectionName", compression: "zstd"})'
注意:压缩操作会增加CPU负载,建议在低峰时段执行。2. 定期执行碎片整理与空间回收
MongoDB的删除或更新操作会产生碎片,导致磁盘空间未被有效释放。需通过以下命令整理碎片并回收空间:
compact命令,重组数据文件并释放未使用空间:mongo yourDatabaseName --eval 'db.runCommand({compact: "yourCollectionName"})'
compactAllDatabases命令(需管理员权限):mongo admin --eval 'db.adminCommand({compactAllDatabases: 1})'
repairDatabase命令回收无效空间(需停机并备份数据):mongo --eval 'db.repairDatabase()'
注意:repairDatabase会锁定数据库,建议在维护窗口执行。3. 优化数据模型与索引设计
不合理的数据模型和过度索引会占用大量存储空间,需遵循以下原则优化:
_id、常用查询条件字段),避免过度索引(每个索引都会占用存储空间且降低写入性能)。可通过db.collection.getIndexes()查看现有索引,删除无用索引。db.yourCollection.createIndex({ "expireAt": 1 }, { expireAfterSeconds: 604800 }) // 7天后自动删除
注意:TTL索引需配合expireAt字段(日期类型)使用。4. 管理日志文件以释放空间
MongoDB的日志文件(默认路径/var/log/mongodb/mongod.log)会随时间增长占用大量磁盘空间,需通过以下方式管理:
/etc/mongod.conf,设置日志滚动策略(如按天切割、保留7份、压缩旧日志):systemLog:
destination: file
path: /var/log/mongodb/mongod.log
logAppend: true
logRotate: reopen # 日志轮转时重新打开文件
同时,创建/etc/logrotate.d/mongodb文件,添加以下内容(自动切割日志):/var/log/mongodb/mongod.log {
daily
rotate 7
compress
missingok
notifempty
sharedscripts
postrotate
/bin/kill -SIGUSR1 $(cat /var/run/mongodb.pid 2>/dev/null) 2>/dev/null || true
endscript
}
logRotate命令或MongoDB内置命令:# 使用logRotate手动切割
logrotate -f /etc/logrotate.d/mongodb
# 使用MongoDB命令触发切割
mongo --eval 'db.runCommand({logRotate: 1})'
注意:日志轮转后,旧日志文件会被压缩(如.gz格式),需定期清理过期日志。5. 使用分片技术水平扩展存储
当单机磁盘空间无法满足数据增长需求时,可通过**分片(Sharding)**将数据分布到多个服务器(分片)上,实现水平扩展:
sh.enableSharding("yourDatabaseName")
user_id、order_id,需保证高基数和低频率变化),将数据均匀分布到各个分片:sh.shardCollection("yourDatabaseName.yourCollectionName", { "user_id": 1 })
注意:分片需提前规划,避免后期重构带来的性能影响。6. 扩容磁盘或迁移数据
若上述方法仍无法满足存储需求,可通过以下方式扩展存储容量:
/var/lib/mongodb所在的逻辑卷扩展),或添加新硬盘并挂载到MongoDB数据目录。/new/data/mongodb),修改/etc/mongod.conf中的dbPath参数,重启服务即可:mongod --dbpath /new/data/mongodb --wiredTigerCollectionBlockCompressor zstd
注意:迁移前需备份数据,避免数据丢失。