MongoDB在Ubuntu上的数据压缩技巧
WiredTiger是MongoDB 3.2及以上版本的默认存储引擎,支持块压缩(对集合数据)和前缀压缩(对索引数据),是Ubuntu环境下最常用的数据压缩方式。
/etc/mongod.conf),在storage section下添加或修改wiredTiger配置,指定collectionConfig.blockCompressor(集合块压缩算法)和indexConfig.prefixCompression(索引前缀压缩开关)。示例如下:storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 1 # 根据系统内存调整(建议为物理内存的50%-70%)
collectionConfig:
blockCompressor: zstd # 可选snappy(默认,平衡速度与压缩比)、zlib(高压缩比,高CPU消耗)、zstd(高压缩比,低CPU消耗)
indexConfig:
prefixCompression: true # 开启索引前缀压缩(默认开启,减少索引内存占用)
保存后重启MongoDB服务使配置生效:sudo systemctl restart mongod
mongod时通过命令行参数指定压缩算法,适用于临时测试:mongod --dbpath /var/lib/mongodb --wiredTigerCollectionBlockCompressor zstd
WiredTiger支持多种压缩算法,需根据存储空间需求、CPU性能和MongoDB版本选择:
WiredTiger的块压缩不会自动回收删除数据后的磁盘空间,需通过compact命令重新组织数据文件并应用压缩:
mongo --eval 'db.getSiblingDB("yourDatabase").runCommand({compact: "yourCollection"})'
compact命令并传入1,压缩指定数据库下的所有集合:mongo --eval 'db.getSiblingDB("yourDatabase").runCommand({compact: 1})'
admin数据库执行compactAllDatabases命令,压缩实例中的所有数据库(需管理员权限):mongo --eval 'db.adminCommand({compactAllDatabases: 1})'
注意:compact命令会消耗大量CPU和I/O资源,建议在低峰时段执行;执行后磁盘空间不会立即释放,需等待MongoDB自动清理或重启服务。MongoDB 4.4及以上版本支持compactServer命令,可在后台异步压缩整个实例的数据,避免阻塞正常读写:
mongo --eval 'db.adminCommand({compactServer: true, compression: "zstd"})'
该命令会启动一个后台进程执行压缩,适合生产环境使用,但仍需注意CPU资源占用。
使用mongodump导出数据时,添加--gzip选项对备份文件进行压缩,节省备份存储空间:
# 导出并压缩数据库
mongodump --gzip --out /path/to/backup
# 导入压缩的备份文件
mongorestore --gzip /path/to/backup/yourDatabase
mongostat或serverStatus命令监控opcounters(操作次数)和cpuUsage(CPU使用率),确保系统资源充足。cacheSizeGB)应足够大,避免频繁读取磁盘(压缩后的数据读取时需解压缩),建议设置为物理内存的50%-70%(不超过系统总内存-1GB)。compact)可能导致数据损坏,执行前务必备份重要数据(使用mongodump)。prefixCompression: true)可减少索引内存占用(约30%-50%),提升索引查询性能。