1. 数据清理:删除无用数据释放空间
db.collection.drop()命令快速删除不再需要的集合(包含所有文档和索引),或用db.collection.deleteMany({条件})删除符合条件的文档。注意:删除后空间不会立即释放,需后续操作回收。cron设置定时任务,定期执行删除命令(如删除3个月前的历史消息):db.RawMessage.deleteMany({generatedTime: {$lte: new Date(Date.now() - 90 * 86400 * 1000)}})。db.RawMessage.createIndex({"generatedTime": 1}, {expireAfterSeconds: 31536000})。TTL索引依赖后台线程每60秒执行一次,适合定期清理场景。2. 空间回收:释放已删除数据占用的磁盘空间
db.runCommand({compact: 'collection_name'})对指定集合进行压缩,重组数据文件并释放未使用的空间。需管理员权限,执行期间可能阻塞写入(建议在低峰期操作)。db.new_collection.insertMany(db.old_collection.find())),然后删除旧集合并重命名新集合(db.old_collection.drop(); db.new_collection.renameCollection('old_collection', true))。此方法能彻底释放空间,但需预留足够磁盘空间容纳新集合。db.runCommand({repairDatabase: 1})修复数据库,回收损坏或未使用的空间。需停机操作,且需磁盘空间大于数据文件总大小(用于临时存储)。3. 存储引擎优化:提升空间利用率
storage.engine: wiredTiger(默认开启)。/etc/mongod.conf中设置更高的压缩级别(如Zstd-3),提升压缩率(Zstd比Snappy节省约50%空间):storage.wiredTiger.engineConfig.compressor: "zstd"。修改后需重启MongoDB生效。storage.wiredTiger.engineConfig.cacheSizeGB(如系统内存的50%),避免缓存过大占用过多磁盘空间(缓存用于存储热数据,减少磁盘IO)。4. 日志管理:减少日志文件占用
/etc/logrotate.d/mongodb文件,设置日志轮转规则(如每天轮转、保留7天、压缩旧日志):/var/log/mongodb/mongod.log {
daily
rotate 7
compress
missingok
notifempty
sharedscripts
copytruncate
dateext
size 200M
postrotate
/bin/kill -SIGUSR1 $(cat /var/log/mongodb/mongod.lock)
endscript
}
此配置每天轮转日志,保留最近7天的.gz压缩文件,当日志文件超过200M时触发轮转。db.runCommand({logRotate: 1})命令手动切割日志,无需重启服务。systemLog.verbosity: 1,默认值为1),减少不必要的日志输出(如调试信息)。5. 监控与预警:提前预防空间不足
df -h命令查看磁盘使用率(重点关注/var/lib/mongodb目录,MongoDB默认数据目录),或用du -sh /var/lib/mongodb/*查看MongoDB数据目录大小。