MongoDBNotes

第 13 章:存储引擎 WiredTiger

zjc 于 2026-01-13 发布

这是《MongoDB 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 WiredTiger 是 MongoDB 默认存储引擎,提供文档级并发控制、MVCC 快照、B+Tree 索引、压缩和 checkpoint。理解 WiredTiger 有助于解释缓存压力、写放大、慢查询和磁盘增长。

13.1 整体结构

mongod
  WiredTiger
    cache
    B+Tree collection / index
    journal
    checkpoint
    compression

写入路径:

operation
  -> update cache
  -> write journal
  -> checkpoint flush dirty pages

13.2 文档级并发

WiredTiger 使用文档级并发控制。写操作默认持有文档级写意向锁,读操作使用快照。

收益:

  1. 不同文档可以并行写入;
  2. 读写冲突范围小;
  3. 高并发 OLTP 表现更好。

仍会阻塞的场景:

操作 冲突
同一文档并发写 写冲突
唯一索引冲突 键冲突
多文档事务 范围和依赖冲突
DDL 元数据锁
后台索引 资源影响

应用仍应避免热点文档。

13.3 Cache 与脏页

WiredTiger cache 保存常用集合页和索引页。默认大小通常约为 (RAM - 1GB) / 2,具体随版本和环境变化。

查看:

db.serverStatus().wiredTiger.cache

关注:

  1. bytes currently in the cache
  2. 脏页字节数;
  3. 未命中读;
  4. 淘页数量;
  5. 应用线程等待 evict;
  6. checkpoint 时间。

工作集大于缓存时,查询会更多读磁盘,延迟波动增加。

13.4 Journal

Journal 记录修改,用于异常崩溃后恢复未 checkpoint 的变更。

写入确认:

db.orders.insertOne(
  { _id: "o_1", status: "CREATED" },
  { writeConcern: { w: 1, j: true } }
)
参数 含义
j: true 等待 journal 持久化
j: false 不显式等待
majority 多数节点确认

关键交易建议显式使用持久化确认;性能与可靠性需要结合磁盘类型评估。

13.5 Checkpoint

Checkpoint 周期性将内存脏页落盘并生成一致点:

dirty pages
  -> checkpoint
  -> stable files
  -> clean metadata

影响:

  1. 磁盘 IO 峰值;
  2. 写延迟波动;
  3. 脏页累积;
  4. 恢复起点。

大量写入、大事务或过多索引都会增加 checkpoint 压力。

13.6 压缩

WiredTiger 支持块压缩和索引前缀压缩,常见算法包括 snappy、zstd、zlib。具体可用算法和默认配置随版本与构建有关。

查看集合:

db.orders.stats()

权衡:

维度 压缩更强 压缩更弱
磁盘 更省 更耗
CPU 更多 更少
网络传输 存储层压缩不直接减少 不直接减少
恢复 时间可能更长 更短

13.7 记录与页

MongoDB 文档保存在 B+Tree 页中。超大文档会带来:

  1. 页分裂;
  2. 缓存占用;
  3. 拷贝和复制成本;
  4. 更新放大;
  5. 查询网络成本。

建议:

  1. 控制文档大小;
  2. 大字段拆分;
  3. 历史数据归档;
  4. 列表页投影;
  5. 避免频繁重写大数组。

13.8 磁盘布局

查看存储路径:

db.serverCmdLineOpts()

常见文件:

collection-*.wt
index-*.wt
Journal/
WiredTiger
WiredTiger.wt

生产建议:

  1. 数据目录使用独立盘;
  2. 监控磁盘空间;
  3. 不手工删除 .wt 文件;
  4. 备份使用官方工具或快照;
  5. 保留足够 journal 和 checkpoint 空间。

13.9 性能信号

cache bytes
dirty pages
pages read into cache
pages written from cache
pages evicted
tracked dirty bytes
checkpoint duration
transaction conflicts
write conflicts

典型判断:

信号 可能原因
读未命中高 工作集大于 cache
脏页持续高 写入过快或 checkpoint 慢
evict waiting cache 压力大
写冲突高 热点文档
checkpoint 长 磁盘瓶颈或脏页过多

13.10 参数与治理

常见治理项:

  1. cache size;
  2. journal 提交间隔;
  3. 并发读写线程;
  4. 压缩算法;
  5. checkpoint 时间;
  6. 磁盘类型;
  7. 索引数量;
  8. 文档大小;
  9. 冷热分离;
  10. 分片分散写入。

参数调优必须基于指标和压测,不应直接照抄网络配置。

本章小结

WiredTiger 通过 MVCC、文档级并发和缓存管理支撑高并发读写。生产性能常由工作集、脏页、checkpoint、磁盘和热点文档决定。优化方向是控制文档和索引规模,让常用工作集留在内存,并避免单点热点。

思考题

  1. 文档级并发是否意味着没有写冲突?
  2. Journal 与 checkpoint 各解决什么问题?
  3. 工作集大于 cache 会表现为什么?
  4. 为什么超大文档会造成写放大?
  5. 压缩一定能提升整体性能吗?