MongoDB在Linux中的数据压缩方法主要围绕WiredTiger存储引擎的内置压缩功能及手动压缩命令实现,以下是具体方案:
WiredTiger是MongoDB 3.2及以上版本的默认存储引擎,支持块级压缩,可在存储数据时直接减少磁盘空间占用,且不影响查询性能(需权衡CPU负载)。
编辑MongoDB主配置文件(通常位于/etc/mongod.conf),在storage.wiredTiger section中设置collectionConfig.blockCompressor参数,选择压缩算法(支持snappy、zlib、zstd):
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 根据服务器内存调整,避免占用过多内存
collectionConfig:
blockCompressor: zstd # 可选snappy(默认,平衡速度与压缩比)、zlib(高压缩比,高CPU消耗)、zstd(高性能压缩,推荐)
保存后重启MongoDB服务使配置生效:
sudo systemctl restart mongod
若不想修改配置文件,可在启动mongod时通过命令行参数直接指定压缩算法:
mongod --dbpath /var/lib/mongodb --wiredTigerCollectionBlockCompressor zstd
此方式适用于临时测试或无需持久化配置的场景。
连接到MongoDB shell,执行serverStatus命令,查看wiredTiger.collectionStats中的blockCompressor字段,确认当前使用的压缩算法:
mongo --eval 'db.runCommand({ serverStatus: 1 })'
输出示例:
"storageEngine": {
"wiredTiger": {
"collectionStats": {
"your_collection_name": {
"options": {
"blockCompressor": "zstd" // 表示压缩已启用
}
}
}
}
}
WiredTiger的块压缩仅在新增数据时生效,对于已有数据(如频繁更新、删除后产生的碎片),需通过compact命令重组数据文件并释放未使用空间(不会缩小文件大小,但会整理碎片,后续可通过文件系统压缩进一步释放空间)。
mongo --eval 'db.getSiblingDB("your_database").runCommand({ compact: "your_collection" })'
mongo --eval 'db.getSiblingDB("your_database").runCommand({ compact: 1 })'
需使用admin数据库权限:
mongo --eval 'db.adminCommand({ compactAllDatabases: 1 })'
注意事项:
compact命令会消耗大量CPU和I/O资源,建议在低峰时段执行;若无法修改MongoDB配置或需要更极致的压缩比,可使用Linux文件系统自带的压缩工具(如gzip、btrfs、zfs)压缩MongoDB数据目录(/var/lib/mongodb)。但此方法需停止MongoDB服务,且会影响读写性能(每次读写需解压/压缩),仅适用于归档场景。
gzip为例):sudo systemctl stop mongod
sudo gzip -r /var/lib/mongodb
/var/lib/mongodb.gz),但需修改应用连接配置,实际使用较少。通过上述方法,可根据业务需求选择合适的压缩策略,在存储空间与性能之间取得平衡。