第 9 篇 说明 checkpoint 是可恢复的已知点。Architecture Guide Logging:启用时,logging 子系统实现 write-ahead log,把不同表、不同线程的修改记入磁盘文件,使得自最近 checkpoint 以来的修改在崩溃后仍可恢复。
本文钉住:日志文件形态、记录与 LSN、slot 写入路径、内部线程、恢复回放,以及与 backup cursor 的契约。MongoDB 侧 journaling 开关与间隔见第 14 篇。
本文是「WiredTiger 内核」系列第 10 篇(共 17 篇)。→ 系列目录
先修:第 9 篇。续读:第 11 篇 RTS;第 14 篇嵌入边界。
版本锚定:Architecture Guide Version 12.0.0 /
developLogging;源码mongodb-8.0的src/log/。
一、目录里能看见的文件
| 前缀 | 角色 |
|---|---|
WiredTigerLog. + 十位编号 |
真正的 WAL 文件,如
WiredTigerLog.0000000001 |
WiredTigerPreplog.* |
预分配、已写好头、待改名启用的日志文件 |
WiredTigerTmplog.* |
预分配过程中的临时文件;写满头、sync、关闭后改名为 Preplog |
只有 WiredTigerLog.* 的编号有语义(对应 LSN
中的文件号)。预分配文件编号与正式日志号无对应关系。启动时临时/预分配文件会被立刻删掉——旧预分配文件不能跨版本复用(格式/软件可能已变)。
二、配置含义
Logging 启用后,细项包括:
| 配置 | 含义 |
|---|---|
remove=true(常见) |
自动删除早于最近完成 checkpoint 的日志文件 |
prealloc=true(默认) |
预分配,避免应用线程在热路径上付建文件 + sync 头/目录的成本 |
自动删除与预分配都会在 backup cursor 打开时禁用:backup 契约要求 cursor 打开时已存在(或可能返回)的文件名在 cursor 生命周期内继续存在;预分配改名也会破坏「拷目录」类备份假设。Log cursor 打开时同样禁用自动删除。
三、记录、操作与 LSN
- 写入单位是 log
record(
WT_LOG_RECORD);部分记录由 log operations 组成。 - 最常见含 operation 的记录是 transaction commit:事务活跃期间把修改收集在内存缓冲,提交时整包交给 logging 写成一条 commit 记录。回滚则释放缓冲,无需写回滚日志记录。
- 记录含 16 字节头(磁盘/内存长度、checksum、是否压缩/加密等);数据对齐为 128 字节的倍数(降低 false sharing)。
- LSN:64 位 = 32 位文件号 + 32
位文件内偏移;文件号映射到
WiredTigerLog.文件名中的数字。
WT_LOG 维护多组
LSN,其中包括:alloc_lsn(下一分配)、ckpt_lsn(上次
checkpoint)、sync_lsn / write_lsn
/ write_start_lsn(写出与 sync 进度)。
压缩与加密:小记录可能不压缩(已低于 128 字节下限无收益);启用加密时用户记录均加密;两者皆开时先压缩后加密,再对齐到 128 字节。
四、热路径:slot 池
常见路径用 lock-free slot 池:线程用原子操作在某 slot 的内存缓冲中预约一段、拷入记录;该 slot 上所有写者完成后释放并刷到文件系统。Slot 保持开放直到强制 flush、缓冲满或定时器到期。
默认同步语义为 memory-only 时,提交写日志的热路径可收成「两次原子操作 + 内存拷贝」,不在热路径抢锁(Guide)。
内部线程分工(摘要):
| 线程 | 职责 |
|---|---|
log_server |
周期性 flush slot(如每 50ms,防空闲滞留)、按 ckpt LSN 删旧日志、预分配 |
log_file_server |
代劳 close/fsync 文件句柄,更新 close/sync LSN |
| (写 LSN 推进线程) | 按序推进 write_lsn,合并相邻
slot,避免应用线程在此单点串行 |
五、恢复时怎么用
重启时 WT 总会跑 recovery。若上次干净关机,可判定无需回放;否则从最近 checkpoint 的 LSN 起回放。启用时间戳时,recovery 还会对非 logged 表做 rollback to stable(第 11 篇)。
查看手段:wt printlog;或打开 log cursor
向前遍历(运行中系统)。
WT_SESSION::log_printf 可把应用字符串以
message 类型写入 WAL(调试/审计边界,本系列不展开)。
六、与 MongoDB / 其它引擎对照(机制)
| 维度 | WiredTiger Logging | 常见对照 |
|---|---|---|
| 覆盖范围 | Checkpoint 之间 | 与 PG WAL「持续记录 + checkpoint/redo」同族,文件与配置不同 |
| 回滚 | 不写 undo 记录,丢弃缓冲 | 与 InnoDB undo 职责不同 |
| 与 HS | Logged 表可走 commit 级耐久;RTS 对 logged 表可跳过(第 11 篇) | 第 08、16 篇 |
MongoDB journaling 是否启用、如何映射到 WT logging,以手册为准(第 14 篇);本篇只钉 WT 机制。
七、收束
- WAL 文件是
WiredTigerLog.*;预分配用 Tmplog/Preplog。 - 提交时写 commit 记录;checkpoint 之后旧日志可删(backup/log cursor 期间例外)。
- 崩溃恢复 = 最近 checkpoint + 自
ckpt_lsn回放;下一篇 RTS 处理时间戳表上「不稳定」的修改。
参考资料
- WiredTiger Architecture Guide, Logging:https://source.wiredtiger.com/develop/arch-logging.html
- Checkpoint、Recovery
mongodb-8.0:src/log/- 第 9 篇;系列索引
上一篇:Checkpoint
下一篇:Rollback
to Stable
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【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 内核】文档库存储引擎全景:MongoDB 默认引擎的生态位
定位文档库默认引擎 WiredTiger 相对 PG/InnoDB/SQLite/RocksDB 的生态位;钉住 Session→Cache→Reconcile→HS→Checkpoint 主线、站内分工与 17 篇阅读路线,并以 Berenson 隔离词汇与 Durable History 为学术/工程锚点。
【WiredTiger 内核】Reconciliation:内存页到 on-disk image
拆解 WiredTiger reconciliation:把 in-memory 页转为 on-disk image、按 leaf_page_max 与 split_pct 分裂,并在用户表 reconcile 时选出最新已提交值、将更旧更新写入 History Store;锚定 wiki 与 src/reconcile/。
【WiredTiger 内核】Checkpoint:跨文件一致快照
拆解 WiredTiger checkpoint 算法:先借 eviction 减压,再按用户表→History Store→元数据顺序 reconcile 并原子切换;说明 checkpoint generation 与 eviction 的可见性约束,以及与 journal 的耐久分工。