站内已经把服务器行存(PostgreSQL / InnoDB)、嵌入式行存(SQLite)、写优化 LSM(RocksDB)和分布式 KV(FoundationDB / TiKV)钉在各自的源码路径上;数据库 MVCC 与 InnoDB Undo 又把「堆内多版本」和「undo 旁路」写成对照轴。还缺一角:文档库默认引擎 WiredTiger——MongoDB 生产路径上真正扛 Cache、Eviction、B-Tree update chain、Reconciliation、History Store 与 Checkpoint 的那一层。
既有 History Store 专章 已经回答「第三种 MVCC 落点」;读者仍不知道一次更新如何挂上 update chain、脏页为何必须 reconcile 才能 evict、checkpoint 与 journal 如何分工。本文是「WiredTiger 内核」系列第 1 篇,只做三件事:
- 画出相对 PG / InnoDB / SQLite / RocksDB / FDB 的生态位地图,以及 MongoDB 嵌入 WT 的分工。
- 用 Architecture Guide 钉住「Session · Cache · Evict/Reconcile · Timestamps/HS · Checkpoint」五条坐标系,并交代谱系与开放问题。
- 给出与站内系列的分工,以及 17 篇阅读路线。
本文是「WiredTiger 内核」系列第 1 篇(共 17 篇)。→ 系列目录
篇目 核心内容 第 1 篇 · 文档库存储引擎全景 生态位、主线坐标系、系列路线 第 2 篇 · Connection / Session / Cursor 连接、会话、游标与线程边界 第 3 篇 · Cache 与 WT_REF clean/dirty 计量、按需读页 第 8 篇 · History Store 旁路历史、LAS→HS(已发布)
版本锚定:WiredTiger Architecture Guide(文档树 Version 12.0.0 /
develop;自身声明不与发版锁步)+ 源码wiredtiger/wiredtigermongodb-8.0。MongoDB 手册参数以 8.0 为准。本篇以定位与路线为主,不粘贴未执行的mongod/wt输出;机制结论来自 Architecture Guide、MongoDB Manual 与已发布第 08 篇。
一、生态位:文档库默认引擎补哪一角
关系型 OLTP、嵌入式 SQL、LSM KV、分布式事务层面对的不是同一组瓶颈。把站内已有内核系列与 WiredTiger 并排放,便于选型与阅读路径对齐——格子不是互斥,而是默认优化方向与嵌入形态不同。
flowchart TB
subgraph row ["Row-oriented"]
PG["PostgreSQL / InnoDB<br/>server row store"]
SQL["SQLite<br/>embedded SQL B-Tree"]
WT["WiredTiger<br/>doc-store B-Tree + HS"]
end
subgraph other ["Other paradigms"]
RK["RocksDB<br/>LSM KV embed"]
FDB["FoundationDB / TiKV<br/>distributed KV"]
end
PG -.->|"need document API"| WT
SQL -.->|"need multi-writer server"| PG
WT -.->|"raw LSM no BSON txn model"| RK
WT -.->|"need distributed txn layer"| FDB
| 形态 | 接口层 | 存储范式 | MVCC 落点(本站口径) | 站内入口 |
|---|---|---|---|---|
| 服务器行存 | SQL + 网络 | 堆 / 聚簇 B-Tree | 堆版本或 undo | postgresql-kernel、mysql-innodb |
| 嵌入式 SQL | SQL / C API | 单文件页式 B-Tree | 页内版本 + WAL/journal | sqlite-kernel |
| WiredTiger(MongoDB) | 文档 API(MongoDB)+ WT KV/表 | Row-store B-Tree + History Store | 用户表最新 + 旁路 HS | 本系列 |
| LSM 嵌入 KV | Put/Get |
WAL + MemTable + SST | 常靠上层时间戳编码 | rocksdb |
| 分布式 KV | 事务 / 复制层 | 本地引擎可换 | 取决于本地引擎 | foundationdb、tikv-htap |
一句话:WiredTiger 占住的是「文档库默认、页式 B-Tree、旁路 History Store、由 MongoDB 嵌入并调 cache/checkpoint」那一格——不是替代 PG 的 SQL 服务器,也不是 RocksDB 那种无 schema 的纯 LSM API。
Architecture Guide Reference 首页写明:WiredTiger 由 MongoDB, Inc. 开发维护,并作为其主存储引擎;支持 row-oriented 与 column-oriented、ACID 事务与 checkpoint / commit 粒度的持久化。本系列默认跟随 MongoDB 生产路径上的 row-store B-Tree;WT 自带的 LSM 表模式只在选型篇点边界,不展开全书。
二、MongoDB 嵌入 WiredTiger:谁管什么
MongoDB 进程对外暴露文档模型、查询、复制集与分片;对内默认打开 WiredTiger 作为存储引擎。官方 WiredTiger Storage Engine 手册钉住与本系列直接相关的契约:
- MVCC 快照:操作开始时 WiredTiger 提供 point-in-time 快照,读看到一致内存视图。
- 落盘形态:checkpoint 把某一快照以跨文件一致的方式写到数据文件;journal 覆盖 checkpoint 之间的修改。
- 历史文件:旁路历史落在
dbPath下的WiredTigerHS.wt(MongoDB 4.4+ Durable History);窗口参数见minSnapshotHistoryWindowInSeconds(5.0+)。
本系列的分工边界:
| 层 | 谁负责 | 本系列是否展开 |
|---|---|---|
| 文档 API、聚合、查询计划 | MongoDB | 否(只作场景句) |
| 复制集 / 分片 / Change Stream / oplog | MongoDB | 否;第 14 篇只写边界 |
| Connection / Session / Cursor、Cache、B-Tree、Reconcile、HS、Checkpoint、Journal、RTS | WiredTiger | 是(01–13、15) |
cacheSizeGB、checkpoint 间隔、HS
窗口、排障口径 |
MongoDB 配置 × WT 机制 | 第 14–15 篇 |
| 与 PG / InnoDB / RocksDB 对照选型 | 机制对照,不做延迟排名 | 第 16–17 篇 |
Architecture Guide Connection:一个 connection 通过文件锁独占数据库实例,进程内通常只开一个;CRUD 几乎都在 session 上下文中执行;打开时会拉起 eviction / checkpoint / logging 等内部线程,并在初始化末尾跑 rollback to stable。MongoDB 把这些旋钮映射成运维参数——第 2、14 篇分别钉 API 边界与参数边界。
三、五条坐标系(后续章节回指)
Architecture Guide 与第 08 篇反复出现的不变量,可收成五条。本系列每一篇都应能回指其中至少一条。
3.1 Connection / Session / Cursor
- Connection:
wiredtiger_open打开的数据库句柄;独占实例;持有全局WT_CACHE与内部服务线程(Connection)。 - Session:几乎所有操作的上下文;一 session 同时最多一个运行中事务;可开多个 cursor,共享该 session 的事务上下文(Session)。
- Cursor:定位、迭代、读写的入口;文件
cursor 实现为
WT_CURSOR_BTREE,由所属 session 拥有,不可跨 session 共用(Cursor)。
线程边界:session 按单线程使用(Guide Multithreading);connection 句柄可在线程间共享。把「MongoDB 连接池」心智直接映射成「每个线程一个 WT connection」会错——第 2 篇展开。
3.2 Cache 与 WT_REF
Cache 保存最近访问或修改的 B-Tree
页;按需从块管理器读页;用量按 clean /
dirty 分别计量。每个页经 WT_REF
寻址——可表示「尚未加载」或已加载的
WT_PAGE。首次修改页时分配
WT_PAGE_MODIFY;更新挂在 WT_UPDATE
链上,新键走 WT_INSERT
skiplist(Cache)。
关键工程后果:dhandle、cursor、session
本身不计入 cache_size;驱逐
clean 页只需释放内存,驱逐 dirty 页必须先 reconcile
再写存储。
3.3 Eviction 与 Reconciliation
Eviction 把 cache 压回用户设定的总量与 dirty 上限:server 线程按近似 LRU 挑页入队,worker(或高压下的应用线程)执行驱逐。Dirty eviction 路径:reconcile → 最新已提交值进用户表磁盘镜像,更旧版本进 History Store(Eviction;与第 08 篇一致)。
Reconciliation 是「内存页布局 → on-disk
image」的转换;分裂边界与 HS 写入契约在第 6
篇钉源码路径(src/reconcile/、__wt_hs_insert_updates)。
3.4 Timestamps / Snapshot / History Store
时间戳与快照决定可见性;用户表 reconcile
时只持久化最新已提交版本,旧版本进全局
History
Store(WiredTigerHS.wt)。读路径:update chain
→ on-disk → HS(第 07–08 篇)。这不是新的隔离理论——Berenson
et al., SIGMOD 1995
给出异常词汇;各引擎用不同物理落点兑现其中子集。
3.5 Checkpoint / Journal / Rollback-to-Stable
- Checkpoint:跨文件一致快照;用户数据文件 reconcile 之后再 checkpoint History Store(因 reconcile 会向 HS 追加写);元数据最后切换(Checkpoint)。
- Journal / Logging:覆盖 checkpoint 之间的修改;崩溃后从最近 checkpoint 回放日志(与 MongoDB journaling 配置衔接,第 10、14 篇)。
- Rollback-to-Stable:打开/关闭等路径把状态收到 stable;可读 HS 写回用户表(第 11 篇)。
flowchart LR
api["MongoDB / WT API"] --> sess["Session + Cursor"]
sess --> cache["Cache WT_REF / update chain"]
cache --> evict["Eviction"]
evict --> rec["Reconciliation"]
rec --> userDisk["User table newest"]
rec --> hsDisk["History Store"]
sess --> ts["Timestamps / Snapshot"]
ts --> hsDisk
rec --> ckpt["Checkpoint"]
ckpt --> journal["Journal between ckpts"]
ckpt --> rts["Rollback to Stable"]
四、与站内系列的分工
| 话题 | 已有内容 | 本系列怎么用 |
|---|---|---|
| 快照隔离语义 / Write Skew | mvcc | 第 07–08、16 篇回链 Berenson,不重写 PG SSI |
| Undo / Read View | mysql-innodb | 第 08、16 篇对照旁路历史 |
| 服务器行存缓冲池 / WAL | postgresql-kernel | 第 03、09–10、16 篇对照 |
| 嵌入式行存 | sqlite-kernel | 第 01、17 篇边界:无文档服务器模型 |
| LSM 写放大 | rocksdb | 第 01、16–17 篇:B-Tree+HS vs LSM |
| COW / 持久化结构谱系 | persistent-ds | 第 08 篇一句回链,不混为一谈 |
| 旁路历史机制 | 第 08 篇 | 已发布;本篇只定位,不重写 |
一句话:MVCC 文回答「隔离了什么」;InnoDB/PG 回答「服务器行存如何兑现」;第 08 篇回答「WT 第三种落点」;本系列回答「从 Session 到 Checkpoint 的全路径如何组织」。
常见误解
「History Store 就是 undo log。」
目标相近(旧版本旁路),表结构、回收与 eviction 契约不同。第 08、16 篇对照表;禁止把 InnoDB purge 经验原样平移到WiredTigerHS.wt。「cacheSizeGB 调大就能消灭 HS 膨胀。」
Cache 管的是页缓存压力;HS 体积主要由更新速率 × 历史窗口(及 oldest 推进)决定。第 14–15 篇。「可以手工删
WiredTigerHS.wt腾空间。」
官方明确禁止;空间问题应查窗口、长游标、复制延迟,而不是删文件(第 08、15 篇)。「WiredTiger 等于 MongoDB。」
WT 是可嵌入的存储库;MongoDB 是其上的文档服务器。复制/分片不在 WT Architecture Guide 主线里——第 14 篇只标边界。「脏页可以直接 evict。」
Guide Cache / Eviction:dirty 页必须先 reconcile(并可能写 HS)才能离开 cache。第 4、6 篇。
五、学术谱系、工程间隙与开放问题
5.1 谱系(奠基 → 工程分叉 → 本系列落点)
| 阶段 | 代表 work | 与本系列关系 |
|---|---|---|
| 隔离异常词汇 | Berenson et al., A Critique of ANSI SQL Isolation Levels, SIGMOD 1995 | 第 07–08、16 篇;与 mvcc 同一锚点 |
| 有序索引范式 | Bayer & McCreight, 1972 | 第 05、12 篇 B-Tree / 页格式 |
| 日志结构写优化分叉 | O’Neil et al., LSM-Tree, 1996 | 与 rocksdb 对照轴;本系列站在页式 + HS 一侧 |
| 工程规范(A 级) | WT Architecture Guide Cache / Eviction / B-Trees / History Store / Checkpoint / Timestamps 等 | 第 02–13 篇机制正文直接来源 |
| Durable History 分叉 | MongoDB 4.4:LAS →
WiredTigerHS.wt |
第 08 篇;运维痛点从 swap 膨胀变为窗口×更新率 |
5.2 工程间隙
- Architecture Guide 不与发版锁步;排障以
MongoDB 所带 WiredTiger 标签与
mongodb-8.0源码为准。 - 论文/Guide 描述的是存储库不变量;生产还叠了 MongoDB 复制延迟、prepared 事务、运维窗口参数——第 14–15 篇写耦合,不假装「只调 WT 配置」即可关闭所有故障。
- 本环境未跑跨引擎 benchmark;不写未实测的延迟排名。
5.3 开放问题(有文献/运维线索,系列不关闭)
- 局部更新与全量历史载荷:高频小字段更新时,HS 是否仍常落整份旧值?入口见第 08 篇开放问题 1。
- 窗口参数与复制延迟 / prepared 的耦合:oldest 推进卡在哪一层?第 11、14 篇。
- HS 页与用户热页抢同一 cache 池:是否存在可复现的主路径变慢阈值?第 04、15 篇;需实测才下性能结论。
六、17 篇阅读地图
flowchart TD
A["01 Overview"] --> B["02 Conn Session Cursor"]
B --> C["03 Cache WT_REF"]
C --> D["04 Eviction"]
D --> E["05 BTree update chain"]
E --> F["06 Reconciliation"]
F --> G["07 Timestamps Snapshot Txn"]
G --> H["08 History Store"]
H --> I["09 Checkpoint"]
I --> J["10 Journal Logging"]
G --> K["11 Rollback to Stable"]
F --> L["12 Block format compress"]
L --> M["13 Compaction Backup"]
I --> N["14 MongoDB embed boundary"]
H --> O["15 Ops troubleshoot"]
N --> O
O --> P["16 PG InnoDB RocksDB compare"]
P --> Q["17 Engine selection"]
| 路径 | 建议篇目 | 目标 |
|---|---|---|
| 必读核心 | 1 → 3 → 4 → 6 → 8 → 9 → 17 | 快速建立坐标系 |
| MVCC / 历史 | 7 → 8 → 11 → 16 | 从 undo/堆版本过来 |
| 持久化与恢复 | 9 → 10 → 11 → 15 | 崩溃恢复 / 运维 |
| 对照选型 | 1 → 8 → 16 → 17 | 多引擎选型 |
| 完整通读 | 1 … 17 | 系统掌握 |
系列规划与实验台账见 PLAN.md。实验:有环境再跑;未跑不伪造
WiredTigerHS.wt 体积曲线或 eviction 指标。
七、小结
三句话小结
- WiredTiger 补齐站内「文档库默认引擎」缺口:页式 B-Tree + 旁路 History Store,由 MongoDB 嵌入;与 PG/InnoDB 服务器行存、SQLite 嵌入式 SQL、RocksDB LSM 分工清晰。
- 后续篇章按 Session → Cache → Evict/Reconcile → Timestamps/HS → Checkpoint/Journal/RTS → 嵌入/排障 → 选型展开;第 08 篇已发布,不重复发明旁路历史结论。
- 学术锚点是 Berenson(隔离词汇)、Bayer/McCreight(B-Tree)、O’Neil LSM(对照分叉)、Architecture Guide(工程定义)、MongoDB 4.4 Durable History(LAS→HS);HS 与 cache 公平性、窗口与复制耦合仍是开放问题。
读完本篇后
把 WiredTiger 当成「小 InnoDB」或「带 BSON 的 RocksDB」都会在第 4–8、16–17 篇被机制打脸。下一步:第 2 篇钉 Connection / Session / Cursor 不变量;若你只关心旁路历史,可先读 第 08 篇。
参考资料
规范 / 官方文档(A 级)
- WiredTiger Architecture Guide(Version 12.0.0 /
develop):Cache、Eviction、B-Trees、Connection、Session、Cursor、History Store、Checkpoint — https://source.wiredtiger.com/develop/ - WiredTiger Reference Guide 首页(MongoDB 主存储引擎定位)
- MongoDB Manual, WiredTiger Storage
Engine(MVCC、checkpoint、journal、
WiredTigerHS.wt、窗口参数) - WiredTiger Upgrading(mongodb-4.4:LAS → HS)
论文
- Berenson, H., et al. A Critique of ANSI SQL Isolation Levels. SIGMOD, 1995。
- Bayer, R. & McCreight, E. Organization and Maintenance of Large Ordered Indexes. Acta Informatica, 1972。
- O’Neil, P., et al. The Log-Structured Merge-Tree (LSM-Tree). Acta Informatica, 1996。(对照分叉)
源码
wiredtiger/wiredtigermongodb-8.0:src/cache/、src/evict/、src/reconcile/、src/btree/、src/history/、src/txn/、src/conn/(后续篇按路径摘录)
站内
实验 / 工具
- 本篇无本地
mongod/wt实测。复现须自行准备 MongoDB 8.x 实例;输出须来自真实执行。
上一篇:系列目录
下一篇:Connection
/ Session / Cursor
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【WiredTiger 内核】Cache · Eviction · Reconciliation · History Store · Checkpoint
补齐文档库默认引擎内核层:从 Connection/Session、Cache/Eviction、B-Tree update chain、Reconciliation 到 Timestamps、History Store、Checkpoint/Journal 与 Rollback-to-Stable,并以 MongoDB 嵌入边界与 PG/InnoDB/RocksDB 对照收束。
【WiredTiger 内核】Eviction:脏页必须先 reconcile
拆解 WiredTiger Eviction 的 server/worker/队列、target/trigger 阈值,以及 dirty eviction 经 reconciliation 把最新值写入用户表、旧版本写入 History Store;说明应用线程被迫协助驱逐的条件。
【WiredTiger 内核】Reconciliation:内存页到 on-disk image
拆解 WiredTiger reconciliation:把 in-memory 页转为 on-disk image、按 leaf_page_max 与 split_pct 分裂,并在用户表 reconcile 时选出最新已提交值、将更旧更新写入 History Store;锚定 wiki 与 src/reconcile/。
【WiredTiger 内核】History Store 与 Durable History:文档库里的第三种 MVCC
拆解 MongoDB WiredTiger 如何把旧版本挪到 History Store(WiredTigerHS.wt),在 reconciliation / eviction 后仍服务快照读;对照 PostgreSQL 堆版本与 InnoDB undo,并交代 Lookaside 到 Durable History 的工程分叉。