【WiredTiger 内核】文档库存储引擎全景:MongoDB 默认引擎的生态位
内容提要
本文介绍WiredTiger作为MongoDB默认存储引擎的内核机制,定位为文档库页式B-Tree加旁路History Store,与PG/InnoDB、SQLite、RocksDB等分工明确。文章规划17篇系列,涵盖Session、Cache、Eviction、Reconciliation、Timestamps、Checkpoint等核心流程,并指出脏页须先reconcile才能驱逐,HS体积受更新率与窗口影响,为后续深入解析奠定框架。
延伸解读
生态位:不是“小 InnoDB”也不是“带 BSON 的 RocksDB”
文章明确 WiredTiger 的定位是“文档库默认、页式 B-Tree、旁路 History Store”,由 MongoDB 嵌入并管理 cache/checkpoint。它与 PG/InnoDB 的服务器行存、SQLite 的嵌入式 SQL、RocksDB 的 LSM 在接口层、存储范式、MVCC 落点上均不同。读者应避免用 InnoDB 或 RocksDB 的经验直接套用,否则会在后续机制篇(如脏页驱逐、HS 回收)产生误解。
脏页驱逐与 HS 体积:两个常见误解的澄清
文章指出两个常见误解:一是“脏页可以直接 evict”,实际必须先 reconcile 才能离开 cache;二是“调大 cacheSizeGB 就能消灭 HS 膨胀”,实际 HS 体积主要由更新速率 × 历史窗口决定,与页缓存压力无关。理解这两点有助于运维排障,避免错误调参或误删 WiredTigerHS.wt 文件。
MVCC 落点的第三种形态:旁路历史
WiredTiger 的 MVCC 落点既不是堆内多版本(PG/InnoDB),也不是页内版本(SQLite),而是“用户表最新 + 旁路 HS”。reconcile 时只持久化最新已提交版本,旧版本写入全局 History Store(WiredTigerHS.wt)。这种设计在服务快照读的同时,也带来 HS 与用户热页争抢 cache 等开放问题,值得后续关注。
Q&A
WiredTiger 在存储引擎生态中处于什么位置?
WiredTiger 是 MongoDB 的默认存储引擎,属于文档库默认引擎,采用页式 B-Tree 加旁路 History Store 的存储范式,由 MongoDB 嵌入并负责缓存、检查点等管理。它与 PostgreSQL/InnoDB 的服务器行存、SQLite 的嵌入式 SQL、RocksDB 的 LSM KV 以及 FoundationDB/TiKV 的分布式 KV 形成分工,各自面向不同的瓶颈和嵌入形态。
WiredTiger 的脏页为什么必须先 reconcile 才能驱逐?
因为脏页包含未持久化的修改,驱逐时若直接释放内存会丢失数据。必须先通过 reconciliation 将最新已提交值写入用户表的磁盘镜像,并将更旧版本写入 History Store,然后才能安全地释放内存页。
WiredTiger 的 History Store 和 InnoDB 的 undo log 有什么区别?
History Store 和 undo log 目标相近,都是保存旧版本数据,但表结构、回收机制和驱逐契约不同。History Store 是旁路历史,存储在 WiredTigerHS.wt 文件中,由 MongoDB 4.4+ 引入;而 InnoDB 的 undo log 是堆内多版本的一部分。不能将 InnoDB 的 purge 经验直接平移到 WiredTigerHS.wt。
WiredTiger 的 checkpoint 和 journal 是如何分工的?
Checkpoint 将某一快照以跨文件一致的方式写入数据文件,提供持久化的基础;journal 则覆盖 checkpoint 之间的修改,崩溃后从最近的 checkpoint 回放日志以恢复数据。两者配合确保数据持久性和崩溃恢复。
WiredTiger 的 History Store 体积受什么因素影响?
History Store 的体积主要由更新速率和历史窗口决定,以及 oldest 时间戳的推进情况。调大 cacheSizeGB 并不能直接控制 HS 膨胀,因为 cache 管理的是页缓存压力,而 HS 体积与更新频率和保留窗口相关。
WiredTiger 的 Session 和 Cursor 有什么线程使用限制?
Session 按单线程使用,一个 session 同时最多运行一个事务,可开多个 cursor 共享事务上下文;Cursor 由所属 session 拥有,不可跨 session 共用。Connection 句柄可在线程间共享,但 MongoDB 连接池不能直接映射为每个线程一个 WT connection。
WiredTiger 的 Reconciliation 过程具体做了什么?
Reconciliation 是将内存页布局转换为 on-disk image 的过程。它会把最新已提交值写入用户表的磁盘镜像,并将更旧版本写入 History Store,同时处理页分裂边界。相关源码位于 src/reconcile/ 和 __wt_hs_insert_updates。
WiredTiger 的 MVCC 快照是如何实现的?
WiredTiger 在操作开始时提供 point-in-time 快照,读操作看到一致的内存视图。旧版本通过 update chain 和 History Store 保存,用户表 reconcile 时只持久化最新已提交版本,旧版本进入全局 History Store(WiredTigerHS.wt)。