RocksDB是一个嵌入式的键值存储,其中键和值是任意的字节流。
RocksDB组织所有数据的排序顺序和常用操作Get(key),Put(key),Delete(key)和NewIterator()。
RocksDB的三个基本结构是memtable,sstfile和logfile。memTable是一个存储器内数据结构-新的写入被插入的memTable和任选地写入到日志文件。该日志文件是存储顺序排列的文件。当memtable填满时,它被刷新到存储上的sstfile,相应的日志文件可以被安全的删除。
ssfile的默认格式:
BlockBasedTable是RocksDB中默认的SST表格式。
[data block 1]
[data block 2]
...
[data block N]
[meta block 1: filter block]
[meta block 2: stats block]
[meta block 3: compression dictionary block]
...
[meta block K: future extended block]
[metaindex block]
[index block]
[Footer] (fixed size; starts at file_size - sizeof(Footer))
该文件包含调用的内部指针BlockHandles,其中包含以下信息:
offset: varint64
size: varint64
varint64的可以参考http://blog.csdn.net/YANG_Gang2017/article/details/79309581
(1)文件中键/值对的顺序按排序顺序存储,并划分为一系列数据块。这些块在文件的开始处接连出现。每个数据块根据其中的代码进行格式化block_builder.cc(请参阅文件中的代码注释),然后可以选择压缩。
(2)在数据块之后,我们存储了一堆元块。下面介绍支持的元块类型。未来可能会添加更多元块类型。每个元块再次格式化block_builder.cc,然后可选地压缩。
(3)一个metaindex块为每个其他元块包含一个入口,其中关键是元块的名称,并且该值是BlockHandle指向该元块的值。
(4)一个index块每个数据块包含一个条目,其中该键是该数据块中的一个字符串>=最后一个键,并且在连续数据块中的第一个键之前。该值是BlockHandle数据块的值。如果使用kTwoLevelIndexSearch作为IndexType,则该index块是索引分区上的第二级索引,即每个条目指向另一个index包含每个数据块一个条目的块。在这种情况下,格式将会是
[index block - 1st level]
[index block - 1st level]
...
[index block - 1st level]
[index block - 2nd level]
(5)在该文件的最末端是包含固定长度页脚BlockHandle的的metaindex和索引块以及一个幻数。
metaindex_handle: char[p]; // Block handle for metaindex
index_handle: char[q]; // Block handle for index
padding: char[40-p-q]; // zeroed bytes to make fixed length
// (40==2*BlockHandle::kMaxEncodedLength)
magic: fixed64; // 0x88e241b785f4cff7 (little-endian)
注意:下面解释了基于块的过滤器,这已被弃用。
如果在打开数据库时指定了“FilterPolicy”,则每个表中都会存储一个过滤器块。“metaindex”块包含一个从“过滤器”映射的条目。到过滤块的BlockHandle,其中“”是过滤策略Name()方法返回的字符串。
过滤器块存储一系列过滤器,其中过滤器i包含所有存储在文件偏移量落入范围内的块上的FilterPolicy :: CreateFilter()输出
[ i*base ... (i+1)*base-1 ]
目前“base”是2KB。因此,例如,如果块X和Y在[0KB .. 2KB-1]范围内开始,则通过调用FilterPolicy :: CreateFilter()将X和Y中的所有键转换为过滤器,并且生成的过滤器将作为过滤器块中的第一个过滤器存储。
过滤器块的格式如下:
[filter 0]
[filter 1]
[filter 2]
...
[filter N-1]
[offset of filter 0] : 4 bytes[offset of filter N-1] : 4 bytes
[offset of beginning of offset array] : 4 bytes过滤器块末尾的偏移量数组允许从数据块偏移量高效地映射到相应的滤波器。
这个元块包含一堆属性。key是属性名,value是属性值。
统计块格式如下: