- 首页 >
- 问答 >
-
云计算 >
- MongoDB在Linux上的数据压缩方法
MongoDB在Linux上的数据压缩方法
小樊
40
2025-11-22 21:08:37
MongoDB 在 Linux 上的数据压缩方法
一 存储引擎层压缩 WiredTiger
- 适用对象:集合数据与索引数据在落盘时压缩,WiredTiger 默认启用压缩,集合默认算法为 snappy,索引默认启用 前缀压缩 prefixCompression。可选算法为:none、snappy、zlib、zstd(MongoDB 4.2+ 支持 zstd)。压缩在写入磁盘时完成,缓存中保留未压缩页,因此主要影响写路径的 CPU 与磁盘占用。一般经验压缩率:snappy≈2:1、zlib≈3:1、zstd≈4:1(实际取决于数据特征)。建议:写密集优先 snappy;读密集且存储紧张优先 zstd;已加密或已压缩的二进制数据(如图片、视频)设为 none 以避免无效 CPU 消耗。配置示例(mongod 配置文件或启动参数):
storage:
engine: wiredTiger
wiredTiger:
collectionConfig:
blockCompressor: zstd # 集合块压缩算法
indexConfig:
prefixCompression: true # 索引前缀压缩(默认开启)
也可在创建集合时指定:
db.createCollection(“email”, {
storageEngine: { wiredTiger: { configString: “block_compressor=zlib” } }
})。
二 网络传输压缩
- 适用对象:mongos 与 mongod、副本集成员、分片集群节点之间的网络流量。配置项:net.compression.compressors,可选 snappy、zlib、zstd。版本规则:MongoDB 3.6/4.0 默认 snappy;MongoDB 4.2+ 默认 snappy,zstd,zlib(按优先级协商)。两端需至少共享一种算法才可启用。建议:云环境或跨机房优先 zstd;低延迟内网可用 snappy 降低 CPU 开销。配置示例:
net:
compression:
compressors: snappy,zstd,zlib。
三 备份与导出压缩
- 适用对象:mongodump/mongorestore 生成的备份文件。自 MongoDB 3.2 起支持 –gzip 直接在导出时压缩,减少磁盘占用与额外压缩步骤。示例:
mongodump --host 127.0.0.1 --port 27017 --gzip --out /data/backup_20251122
mongorestore --host 127.0.0.1 --port 27017 --gzip --dir /data/backup_20251122
提示:压缩备份会额外消耗 CPU,但通常显著节省存储空间与网络传输量。
四 压缩效果评估与空间回收
- 评估方法:
- 查看数据库级数据+索引占用(单位 MB):
db.stats(10241024).dataSize + db.stats(10241024).indexSize
- 查看集合级压缩与存储细节:
db.runCommand({ collStats: “” })
- 空间回收:删除文档/集合后,WiredTiger 不会立即把磁盘空间归还给操作系统,而是将空间放入 Empty Records 列表供后续复用,可能产生碎片。可使用 compact 整理碎片并释放未使用空间(会重写集合数据,建议在低峰期执行,并确保磁盘空间充足):
db.runCommand({ compact: “” })。
五 实践建议与注意事项
- 工作负载匹配:写密集选 snappy;读密集且存储紧张选 zstd;不可压缩数据选 none。压缩是“CPU 换磁盘/网络”的权衡。
- 版本与兼容性:使用 zstd 需 MongoDB 4.2+;网络压缩需客户端/驱动支持所选算法,否则协商失败不启用。
- 监控与资源:WiredTiger 默认使用系统物理内存的约一半作为内部缓存(可通过 –wiredTigerCacheSizeGB 调整);可用 db.serverStatus().mem 观察内存使用。
- 生效时机:部分存储配置在实例初始化后难以变更,或变更后需迁移/重建才能完全生效;变更前在测试环境验证,变更中做好完整备份与维护窗口规划。