RocksDB源码-0x0F-日志记录
在RocksDB世界,两个重要的文件
- wal RocksDB源码-0x05-WAL
- manifest RocksDB源码-0x08-MANIFEST文件
本质都是日志文件,因此抽象成统一的日志进行读写,和普通文本文件的区别在于,文本文件按行读取,RocksDB里面的日志文件按照record为单位读取。
1 几个概念
有几个概念是要先弄明白的
- chunk
- block
- record
- fragment
首先,block是硬件决定的读写单位,也就是操作系统每次跟磁盘交互的大小。其次磁盘存储的单位是扇区,这个不需要理解也不影响下文。
其次在操作系统层面chunk是包含多个block大小的软件概念。
RocksDB每次读文件的Block大小是32KB,RocksDB划分成多个fragment,每个fragment就是一个读写协议,包含协议头和协议体,这个协议是物理协议。
每个record由1个或多个fragment组成,record就是fragment物理协议体组成的,而record就是逻辑协议,当然也会有对应的协议设计,可能有协议头,也可能没有协议头。
比如
- VersionEdit协议就没有协议头,record直接就是VersionEdit
- WriteBatch协议有协议头,record包含12字节的协议头
2 读
2.1 按Block从操作系统读
1 | |
2.2 从Block里面处理fragment物理协议
1 | |
2.3 record逻辑协议
2.3.1 record就是一个fragment
1 | |
2.3.2 record由多个fragment组成
调用方给一个入参scratch用来当拼接fragment的缓冲区,最终拼好的record再丢到出参里面。
2.3.2.1 fragment是record头
1 | |
2.3.2.2 fragment是record中间部分
1 | |
2.3.2.3 fragment是record尾
1 | |
3 写
RocksDB源码-0x0F-日志记录
https://bannirui.github.io/2026/02/04/RocksDB/RocksDB源码-0x0F-日志记录/