第 6、9 篇 产出 on-disk page image 之后,真正决定「写到文件哪里、如何校验、如何按 checkpoint 回收」的是 Block Manager。Architecture Guide Block Manager:子系统负责磁盘读写,目标是高性能、省空间与可定制。
本文钉住:块与 address cookie、无覆盖分配、descriptor、extent list、与 checkpoint/eviction 的写出路径。压缩算法细节不做手册式罗列(系列边界)。
本文是「WiredTiger 内核」系列第 12 篇(共 17 篇)。→ 系列目录
先修:第 6、9 篇。续读:第 13 篇 Compaction / Backup。
版本锚定:Architecture Guide Version 12.0.0 /
developBlock Manager;源码mongodb-8.0的src/block/、src/include/block.h。
一、什么是 block
- 每个
.wt数据文件由若干 block 组成;一块 = page header + block header + 一页 B-Tree 内容。 - 块大小必须是创建文件时
allocation_size(默认常为 4KB)的整数倍。 - WiredTiger 是 no-overwrite:重写内容时写到文件新位置;旧块在所属 checkpoint 删除后才可复用。崩溃时正在覆盖的半写块因此被避开。
写出后返回 address
cookie(对上层不透明),存在对应
WT_REF 的 addr 上。Cookie
含:offset(按 allocation_size 缩放)、可选
object_id(tiered
storage)、size(同样缩放)、checksum。
Block header
字段(size、checksum、flags、padding)用于校验与
salvage;page header 见
btmem.h,本篇不逐字段抄写。
二、分配策略与 descriptor
| 模式 | 行为 |
|---|---|
| Best fit(默认) | 在按 size 排序的 avail extent skiplist 上找精确或下一更大空闲段,减少碎片 |
| First fit | 放进第一个可用 extent;所有 root 页用 first fit;compaction 期间也切到 first fit(第 13 篇) |
文件第一块是 descriptor block:含 WT 主/次版本、checksum、magic——用于确认「这是兼容版本的 WT 数据文件」且整文件未彻底损坏。
三、Extent list 与 Checkpoint
每个 checkpoint 维护三张 extent
list(WT_EXTLIST):
| 列表 | 含义 |
|---|---|
alloc |
本 checkpoint 新分配的文件区间 |
avail |
未使用、可分配 |
discard |
本 checkpoint 释放的区间 |
Avail 额外按 size 建 skiplist 以加速分配。Checkpoint 删除/合并时:若某块同时出现在某代的 alloc 与更后代的 discard,则可进入 avail(Guide 用多代 checkpoint 例子说明合并;读原文 Checkpoint deletion and merging)。
写出后的 checkpoint
cookie(不透明字节串)含:root / alloc list / avail
list / discard list 的 address cookie,以及文件大小与
checkpoint 数据大小等。可用
tools/wt_ckpt_decode.py 解码(Guide)。
典型文件保留至少两个
checkpoint;打开时读最新。Checkpoint 按深度优先:先 leaf
块,再 parent(parent 需持有 leaf
地址)。bm->write
不保证立刻 durable;checkpoint
路径在全部写出后还会 bm->sync。Eviction 调用
bm->write 但不要求
sync(耐久仍靠后续 checkpoint / journal,第 9–10 篇)。
四、Checksum 与压缩入口
checksum=on(创建时,默认常开):对写入缓冲做全长 checksum;关闭时仍可能只校验缓冲前 64 字节(Guide)。读时 cookie 内 checksum 与内容计算值须一致。- 压缩:reconcile 生成逻辑镜像后、块写出路径上可压缩(见官方 Tuning page size and compression)。MongoDB 可配置表/journal 压缩算法(第 14 篇参数边界)。本篇不展开 snappy/zstd 等实现细节。
五、收束
- Block = 无覆盖写入的磁盘页单元;
WT_REF用 address cookie 寻址。 - Checkpoint 用 alloc/avail/discard 管理空间;旧 checkpoint 删除后块才真正可复用。
- 下一篇:Compaction 与 Backup——文件为何删了数据还不缩小、备份期间日志为何不删。
参考资料
- WiredTiger Architecture Guide, Block Manager:https://source.wiredtiger.com/develop/arch-block.html
- Tuning page size and compression;Checkpoint
mongodb-8.0:src/block/- 系列索引
上一篇:Rollback
to Stable
下一篇:Compaction
与 Backup
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【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 的耐久分工。
【WiredTiger 内核】Journal / Logging:Checkpoint 之间的 WAL
拆解 WiredTiger write-ahead log:WiredTigerLog 文件、LSN、slot 无锁写入、checkpoint 之后自动删日志,以及崩溃恢复时从最近 checkpoint 回放;并标出与 MongoDB journaling 配置的边界。