这篇文章是levelDB官方文档的译文,原文地址:Format of an immutable Table file
文件格式概览:
<beginning_of_file>
[data block 1]
[data block 2]
...
[data block N]
[meta block 1]
...
[meta block K]
[metaindex block]
[index block]
[Footer] (固定大小; starts at file_size - sizeof(Footer))
<end_of_file>
文件包含内部指针,每一个这样的指针是一个BlockHandle,包含下面的内容:
offset: varint64
size: varint64
可以到varints 了解更多关于varint64格式的更多内容。
格式逐一说明:
- key/value序列是以有序的方式存储在文件中,并分成一系列的数据块(data block)。从文件文件的开头开始这些数据块一次排列。数据块都是block_builder.cc中指定的格式,并且可以选择是否进行压缩。
- 在数据块后面存储的是一些meta块(meta blocks),支持的meta block的类型在后文会说明,以后也会增加更多的meta blocks.每一个meta block也是block_builder.cc中指定的格式,并可选是否压缩。
- 一个”metaindex”块。它为(2)中的每一个meta block存储一个entry,其中key是meta block的名称,value是一个指向meta block的BlockHandle指针。
- 一个索引块(index block)。它为(1)中的每一个数据块(data block),entry的key是一个大于等于所指向的数据块中的所有数据key,并且小于后一个数据块中数据key的值。value是指向按数据块的BlockHandle指针。
- 文件的最后是一个固定长度的Footer。包含metadindex的BlockHandle指针,index Block的BlockHandle指针,还有一个magic number.
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; // == 0xdb4775248b80fb57 (little-endian)
“filter” Meta Block
-如果数据库打开的时候指定了FilterPolicy,那么就会在每个immutable Table里面存储一个filter block。并且metaindex块也会包含一个entry。key是filter.<N>
,value是这个fliter block的Block Handle,其中<N>
是filter policy的Name()
方法返回值。
-filter block存储了一系列的filters,filter i包含了FilterPolicy::CreateFilter()
在一个block中偏移在[ i*base … (i+1)*base-1 ]这个范围的所有key的输出。目前,”base”是2KB。所以在例子中,如果block X和block Y在[ 0KB .. 2KB-1 ]这个范围里面,那么X和Y里面的所有key通过调用FilterPolicy::CreateFilter()
被转换成一个filter,然后存储在filter block的第一个filter中。
-filter block的格式:
[filter 0]
[filter 1]
[filter 2]
...
[filter N-1]
[offset of filter 0] : 4 bytes
[offset of filter 1] : 4 bytes
[offset of filter 2] : 4 bytes
...
[offset of filter N-1] : 4 bytes
[offset of beginning of offset array] : 4 bytes
lg(base) : 1 byte
block末尾的offset数组是一个从数据块偏移量到相应filter的有效映射。
“stats” Meta Block
meta block包含了很多的stats信息。key是静态信息的name,value包含了相应的信息。
TODO(postrelease): record following stats.
data size
index size
key size (uncompressed)
value size (uncompressed)
number of entries
number of data blocks