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

【WiredTiger 内核】Journal / Logging:Checkpoint 之间的 WAL

文章导航

分类入口
databasestorage
标签入口
#wiredtiger#journal#logging#wal#lsn#recovery#checkpoint#mongodb

目录

第 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 / develop Logging;源码 mongodb-8.0src/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

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 机制。


七、收束

  1. WAL 文件是 WiredTigerLog.*;预分配用 Tmplog/Preplog。
  2. 提交时写 commit 记录;checkpoint 之后旧日志可删(backup/log cursor 期间例外)。
  3. 崩溃恢复 = 最近 checkpoint + 自 ckpt_lsn 回放;下一篇 RTS 处理时间戳表上「不稳定」的修改。

参考资料


上一篇Checkpoint
下一篇Rollback to Stable

同主题继续阅读

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

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/。

2026-07-22 · database / storage

【WiredTiger 内核】Checkpoint:跨文件一致快照

拆解 WiredTiger checkpoint 算法:先借 eviction 减压,再按用户表→History Store→元数据顺序 reconcile 并原子切换;说明 checkpoint generation 与 eviction 的可见性约束,以及与 journal 的耐久分工。


By .