RocksDB源码-0x05-WAL
1 wal机制的作用
wal机制的作用是防crash,在crash发生后可以进行恢复。这个机制几乎在各个数据库都能见到。
2 wal文件目录和文件
1 | |
wal目录下放的是当前正在使用或者刚切换下来的wal
指定了wal目录就用指定的,没有指定就用db顶层目录放wal日志文件
wal下archive目录里面放着的是已经不再写但是暂时还不能删除的wal
3 wal文件格式
rocksdb_ldb dump_wal --walfile=wal/000004.log --header --print_value命令dump文件
1 | |
这几列内容分别表示
- 第1列 1 Sequence Number: 这是该记录的全局序列号。RocksDB里的每一条数据修改都有一个唯一的递增的序列号。它是实现快照读Snapshot Read和数据版本控制MVCC的核心。
- 第2列 1 Count: 这个记录里包含的操作数量。因为是一次Put一个Key,所以这里是1。如果用了WriteBatch批量写入,这里会显示批次内操作的总数。
- 第3列 27 Type: RocksDB内部的操作类型枚举值。27对应kTypeValue是普通的Put操作。
- 第4列 0 Offset: 该记录在WAL文件中的字节偏移量。第一条在0,第二条在34,说明每条记录含头部占用了34字节。
- 第5列 PUT(0): PUT是操作动作,括号里的0表示Column Family ID。没有创建多列族,数据默认都写在ID为0的default列族里。
- 第6列 key的16进制
- 第7列 value的16进制
4 wal的过程
4.1 wal回放前置准备
4.1.1 准备全量CF的VersionEdit容器
1 | |
4.1.2 wal日志最小的文件编号要求
4.1.2.1 系统级的wal要求下限
1 | |
4.1.2.2 数据安全级的wal要求下限
1 | |
4.2 处理一个wal record
4.2.1 拿到WriteBatch逻辑协议
一旦从wal文件里面读到内容,就涉及到两层协议的解析
- 1 物理层协议 这个就是RocksDB源码-0x0F-日志记录
- 2 逻辑层协议 RocksDB源码-0x10-wal的WriteBatch协议
1 | |
4.2.2 跳过协议头
1 | |
4.2.3 put record的批量处理
1 | |
怎么保证原子性和可见性的请见RocksDB源码-0x11-MVCC
4.2.4 怎么处理每个put record的
4.2.4.1 TLV解码
RocksDB源码-0x0D-协议设计TLV所有的逻辑都在这个函数里面
1 | |
以其中一段为例
1 | |
4.2.4.2 任务派发
怎么往memory table里面写数据会根据不同的put record类型进行分发
1 | |
真正的处理逻辑实现在RocksDB源码-0x12-WAL的PutRecord到MemoryTable
4.2.5 看看有没有刷盘任务要处理
1 | |
关于内存刷盘持久化看RocksDB源码-0x13-内存数据刷盘SST0
至此,在启动时候从WAL恢复内存的流程就结束了。
RocksDB源码-0x05-WAL
https://bannirui.github.io/2026/01/30/RocksDB/RocksDB源码-0x05-WAL/