土法炼钢兴趣小组的算法知识备份

【WiredTiger 内核】文档库存储引擎全景:MongoDB 默认引擎的生态位

文章导航

分类入口
databasestorage
标签入口
#wiredtiger#mongodb#document-store#mvcc#history-store#cache#eviction#reconciliation#checkpoint#btree

目录

站内已经把服务器行存(PostgreSQL / InnoDB)、嵌入式行存(SQLite)、写优化 LSM(RocksDB)和分布式 KV(FoundationDB / TiKV)钉在各自的源码路径上;数据库 MVCCInnoDB 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 篇,只做三件事:

  1. 画出相对 PG / InnoDB / SQLite / RocksDB / FDB 的生态位地图,以及 MongoDB 嵌入 WT 的分工。
  2. 用 Architecture Guide 钉住「Session · Cache · Evict/Reconcile · Timestamps/HS · Checkpoint」五条坐标系,并交代谱系与开放问题。
  3. 给出与站内系列的分工,以及 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/wiredtiger mongodb-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-kernelmysql-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 事务 / 复制层 本地引擎可换 取决于本地引擎 foundationdbtikv-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 手册钉住与本系列直接相关的契约:

  1. MVCC 快照:操作开始时 WiredTiger 提供 point-in-time 快照,读看到一致内存视图。
  2. 落盘形态:checkpoint 把某一快照以跨文件一致的方式写到数据文件;journal 覆盖 checkpoint 之间的修改。
  3. 历史文件:旁路历史落在 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

线程边界: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 StoreEviction;与第 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

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 的全路径如何组织」。

常见误解

  1. 「History Store 就是 undo log。」
    目标相近(旧版本旁路),表结构、回收与 eviction 契约不同。第 08、16 篇对照表;禁止把 InnoDB purge 经验原样平移到 WiredTigerHS.wt

  2. 「cacheSizeGB 调大就能消灭 HS 膨胀。」
    Cache 管的是页缓存压力;HS 体积主要由更新速率 × 历史窗口(及 oldest 推进)决定。第 14–15 篇。

  3. 「可以手工删 WiredTigerHS.wt 腾空间。」
    官方明确禁止;空间问题应查窗口、长游标、复制延迟,而不是删文件(第 08、15 篇)。

  4. 「WiredTiger 等于 MongoDB。」
    WT 是可嵌入的存储库;MongoDB 是其上的文档服务器。复制/分片不在 WT Architecture Guide 主线里——第 14 篇只标边界。

  5. 「脏页可以直接 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 工程间隙

5.3 开放问题(有文献/运维线索,系列不关闭)

  1. 局部更新与全量历史载荷:高频小字段更新时,HS 是否仍常落整份旧值?入口见第 08 篇开放问题 1。
  2. 窗口参数与复制延迟 / prepared 的耦合:oldest 推进卡在哪一层?第 11、14 篇。
  3. 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 指标。


七、小结

三句话小结

  1. WiredTiger 补齐站内「文档库默认引擎」缺口:页式 B-Tree + 旁路 History Store,由 MongoDB 嵌入;与 PG/InnoDB 服务器行存、SQLite 嵌入式 SQL、RocksDB LSM 分工清晰。
  2. 后续篇章按 Session → Cache → Evict/Reconcile → Timestamps/HS → Checkpoint/Journal/RTS → 嵌入/排障 → 选型展开;第 08 篇已发布,不重复发明旁路历史结论。
  3. 学术锚点是 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 级)

论文

源码

站内

实验 / 工具


上一篇系列目录
下一篇Connection / Session / Cursor

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-07-22 · database / storage

【WiredTiger 内核】Eviction:脏页必须先 reconcile

拆解 WiredTiger Eviction 的 server/worker/队列、target/trigger 阈值,以及 dirty eviction 经 reconciliation 把最新值写入用户表、旧版本写入 History Store;说明应用线程被迫协助驱逐的条件。

2026-07-22 · database / storage

【WiredTiger 内核】Reconciliation:内存页到 on-disk image

拆解 WiredTiger reconciliation:把 in-memory 页转为 on-disk image、按 leaf_page_max 与 split_pct 分裂,并在用户表 reconcile 时选出最新已提交值、将更旧更新写入 History Store;锚定 wiki 与 src/reconcile/。


By .