这是《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 使用文档级并发控制。写操作默认持有文档级写意向锁,读操作使用快照。
收益:
- 不同文档可以并行写入;
- 读写冲突范围小;
- 高并发 OLTP 表现更好。
仍会阻塞的场景:
| 操作 | 冲突 |
|---|---|
| 同一文档并发写 | 写冲突 |
| 唯一索引冲突 | 键冲突 |
| 多文档事务 | 范围和依赖冲突 |
| DDL | 元数据锁 |
| 后台索引 | 资源影响 |
应用仍应避免热点文档。
13.3 Cache 与脏页
WiredTiger cache 保存常用集合页和索引页。默认大小通常约为 (RAM - 1GB) / 2,具体随版本和环境变化。
查看:
db.serverStatus().wiredTiger.cache
关注:
bytes currently in the cache;- 脏页字节数;
- 未命中读;
- 淘页数量;
- 应用线程等待 evict;
- 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
影响:
- 磁盘 IO 峰值;
- 写延迟波动;
- 脏页累积;
- 恢复起点。
大量写入、大事务或过多索引都会增加 checkpoint 压力。
13.6 压缩
WiredTiger 支持块压缩和索引前缀压缩,常见算法包括 snappy、zstd、zlib。具体可用算法和默认配置随版本与构建有关。
查看集合:
db.orders.stats()
权衡:
| 维度 | 压缩更强 | 压缩更弱 |
|---|---|---|
| 磁盘 | 更省 | 更耗 |
| CPU | 更多 | 更少 |
| 网络传输 | 存储层压缩不直接减少 | 不直接减少 |
| 恢复 | 时间可能更长 | 更短 |
13.7 记录与页
MongoDB 文档保存在 B+Tree 页中。超大文档会带来:
- 页分裂;
- 缓存占用;
- 拷贝和复制成本;
- 更新放大;
- 查询网络成本。
建议:
- 控制文档大小;
- 大字段拆分;
- 历史数据归档;
- 列表页投影;
- 避免频繁重写大数组。
13.8 磁盘布局
查看存储路径:
db.serverCmdLineOpts()
常见文件:
collection-*.wt
index-*.wt
Journal/
WiredTiger
WiredTiger.wt
生产建议:
- 数据目录使用独立盘;
- 监控磁盘空间;
- 不手工删除
.wt文件; - 备份使用官方工具或快照;
- 保留足够 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 参数与治理
常见治理项:
- cache size;
- journal 提交间隔;
- 并发读写线程;
- 压缩算法;
- checkpoint 时间;
- 磁盘类型;
- 索引数量;
- 文档大小;
- 冷热分离;
- 分片分散写入。
参数调优必须基于指标和压测,不应直接照抄网络配置。
本章小结
WiredTiger 通过 MVCC、文档级并发和缓存管理支撑高并发读写。生产性能常由工作集、脏页、checkpoint、磁盘和热点文档决定。优化方向是控制文档和索引规模,让常用工作集留在内存,并避免单点热点。
思考题
- 文档级并发是否意味着没有写冲突?
- Journal 与 checkpoint 各解决什么问题?
- 工作集大于 cache 会表现为什么?
- 为什么超大文档会造成写放大?
- 压缩一定能提升整体性能吗?