【WiredTiger 内核】Journal / Logging:Checkpoint 之间的 WAL
内容提要
本文介绍WiredTiger日志系统:WAL文件为WiredTigerLog.*,预分配用Tmplog/Preplog;提交时写commit记录,崩溃恢复从最近checkpoint回放;热路径用lock-free slot池,内部线程分工;backup cursor打开时禁用自动删除和预分配。
延伸解读
预分配文件的版本陷阱
WiredTiger 启动时会立即删除旧的临时/预分配日志文件(Tmplog/Preplog),因为预分配文件格式可能随版本变化,不能跨版本复用。这意味着预分配文件编号与正式日志编号无对应关系,仅 WiredTigerLog.* 的编号具有语义。运维时若手动拷贝或保留预分配文件,重启后可能被清理,需注意其临时性。
backup cursor 对日志管理的约束
backup cursor 打开时,自动删除和预分配都会被禁用。这是因为备份契约要求 cursor 打开时已存在的文件名在生命周期内持续存在,而预分配改名会破坏“拷目录”类备份假设。因此,长时间打开 backup cursor 可能导致日志文件堆积,需评估磁盘空间影响。
热路径的锁优化设计
日志写入热路径采用 lock-free slot 池,线程通过原子操作预约内存缓冲并拷贝记录,避免抢锁。默认 memory-only 同步语义下,提交写日志可简化为两次原子操作加内存拷贝。内部线程如 log_server 和 log_file_server 分工处理 flush、fsync 和 LSN 推进,避免应用线程在单点串行,从而提升并发性能。
崩溃恢复的起点与回放范围
恢复时从最近 checkpoint 的 LSN 开始回放日志,而非从头扫描。若上次干净关机,可跳过回放。启用时间戳时,recovery 还会对非 logged 表执行 rollback to stable。理解这一机制有助于评估恢复时间与 checkpoint 频率的关系:checkpoint 越频繁,回放日志越少,但 checkpoint 本身有成本。