RocksDB模块结构图

storm 如何看日志_数据

模块功能说明

Log文件

Log文件位于磁盘上,如果配置了写Log会在写Memtable之前将KV值通过写WAL的方式写到Log文件中,用于写Mentable中出现故障时恢复数据。

Log是一个通用的日志流文件,提供一个只能追加写的方式,文件内部分解成很多个Block,每个Blocksize为32kb,每个Block由多条record组成,当一个Block剩余空间不足以放下一个新的record时,剩下的空间会用\0填充,即下图中的P空间。

storm 如何看日志_数据块_02


Log文件结构图

Memtable

Memtable位于内存中,内部结构为SkipList,分为Active MemTable和Immutable MemTable。

当Active MemTable达到设置阈值(write_buffer_size)后会转换成Immutable MemTable(只读的)。

当累积4个Immutable MemTable,每个256M,4个即1G后,会强制flush刷到磁盘上,其内部结构为跳表,设计出发点为当前链表已经是有序的,但是不能使用二分法查找。

storm 如何看日志_RocksDB_03

BlockCache

RocksDB默认使用8MB容量的基于LRU算法的BlockCache.

BlockCache存储的是非压缩的数据块,用户可以选择性的设置第二个BlockCache用来存储压缩的数据块。

读数据过程当读到BlockCache时,首先从非压缩的BlockCache中读取数据,然后是压缩BlockCache。

SST

SST文件位于磁盘上,存放着Key-Value的持久文件。

这些文件中的Key一般都是按照排列好的顺序组织以便通过二分查找法识别。当文件较大时,还可以为其建一个Key-Value位置的索引,指明每个Key在SST File中的偏移距离,这样可以加速在SST File中的查询。

当Immutable Memtable达到设置阈值后会由后台线程Flush到磁盘上即形成SST文件,目前设置阈值为4*256M=1G,后续的Compaction操作也是在SST文件中进行。

RocksDB将SST文件切割成一个一个块,每个块都是由数据+类型+CRC码(循环冗余校验码)SST文件打开格式都是如下图所示:

storm 如何看日志_元数据_04


RocksDB根据用途将这些Block又分为数据块Data Block,元数据块Meta Block,元数据索引块Meta Block Index,数据索引块Index Block和文件尾Footer。

1、数据块主要就是存储数据的地方,Immutable Memtable中的键值对就是存储在数据块;

2、元数据块主要就是用于过滤,加快检索速度。

3、元数据索引块,RocksDB默认一个过滤器,所以元数据块索引块就一条记录;

4、数据索引块,存储每一个数据块的偏移和大小,用于定位数据块。

5、文件尾,存储了数据索引块和元数据索引块,用于读取这两个块;整个模型图如下:

storm 如何看日志_元数据_05


在读取SST文件的Data Block时,一般先读取出Footer,然后根据Footer读取出Index Block,由于Index Block中存储各个数据块的偏移和大小,就可以读取出对应的Data Block。