温馨提示×

Ubuntu MongoDB数据压缩方法有哪些

小樊
34
2025-12-24 14:27:56
栏目: 云计算

Ubuntu上MongoDB数据压缩方法

一 内置压缩机制 WiredTiger

  • 适用引擎与范围:自 MongoDB 3.2 起默认使用 WiredTiger,支持对集合数据块压缩索引前缀压缩,无需额外组件即可生效。集合默认算法为 snappy,索引默认启用前缀压缩。压缩在写入磁盘时进行,WiredTiger 缓存中保留未压缩页以提升访问速度。常见算法与取舍:
    • snappy:压缩率中等、CPU 开销低,适合写入密集或通用场景(默认)。
    • zlib:压缩率更高、CPU 开销更高,适合存储敏感、读取频率较低的场景。
    • zstd:压缩率通常高于 zlib、解压更快,适合读取密集且希望节省存储的场景(MongoDB 3.4+ 支持)。
    • none:对已压缩/不可压缩数据(如图片、音视频)避免二次压缩浪费 CPU。
    • 索引压缩默认使用前缀压缩(B-tree 前缀消除),通常无需关闭。

二 配置方式与示例

  • 全局配置(mongod.conf,Ubuntu 常见路径:/etc/mongod.conf,YAML 格式):
    • 设置集合块压缩算法(实例级生效,新建集合将继承):
      • storage:
        • wiredTiger:
          • collectionConfig:
            • blockCompressor: snappy|zlib|zstd|none
    • 设置 WiredTiger 引擎缓存(避免与系统内存争用,示例为 8GB):
      • storage:
        • wiredTiger:
          • engineConfig:
            • cacheSizeGB: 8
    • 说明:修改配置后需重启 mongod;已有集合的压缩算法保持创建时配置,后续新建集合才会继承新全局设置。
  • 按集合配置(创建集合时指定,优先级高于全局默认):
    • 示例:创建使用 zlib 压缩的集合
      • db.createCollection(“email”, { storageEngine: { wiredTiger: { configString: “block_compressor=zlib” } } })
    • 示例:创建使用 snappy 压缩的集合
      • db.createCollection(“userActivities”, { storageEngine: { wiredTiger: { configString: “block_compressor=snappy” } } })
    • 提示:如需对历史集合变更压缩算法,通常做法是迁移数据(如导出/导入或重建集合)。

三 压缩效果评估与监控

  • 查看集合与索引占用(评估压缩收益):
    • 总占用(MB):db.stats(1024*1024).dataSize + db.stats(1024*1024).indexSize
  • 查看集合级统计(含压缩后大小、压缩比等):
    • db.runCommand({ collStats: “” })
  • 观察 WiredTiger 缓存与命中情况(判断是否因缓存不足导致频繁读盘):
    • db.serverStatus().wiredTiger.cache
  • 实践要点:压缩主要减少磁盘占用与 I/O,对 CPU 有一定消耗;写入密集优先 snappy,读取密集且存储紧张可选 zstd,已压缩数据用 none

四 空间回收与维护

  • 删除文档/集合后,WiredTiger 会在数据文件中保留空闲记录以便重用,可能导致磁盘碎片与空间不立即归还给操作系统。
  • 使用 compact 命令重建集合与索引、回收未使用空间(会加锁阻塞其他操作,建议在维护窗口执行):
    • db.runCommand({ compact: “” })
  • 注意:compact 是对单个集合的操作;如需全库回收,通常需对逐个集合执行。

0