leveldb源码剖析-sstable

来源:互联网 发布:如何创建js函数 编辑:程序博客网 时间:2024/06/03 17:45

leveldb中存储数据的文件格式称为sstable。它的存储格式如下图所示


这里写图片描述

从sstable的格式可以看出,在一个sstable文件中,除了包含核心的key-value数据的data block区域外,还有其他几个数据区。这些额外的数据区域主要是用于组织data block,使得在读的时候可以快速地从sstable中找到所查找的key对应的value。下面我们来分析一下sstable中的各个数据区所代表的含义,亦即所存储的数据的意义。位于图中顶部对应的是sstable文件的起始位置。在写入数据的过程中,sstable文件自顶向底部增长。


data block

data block区域存储的就是数据库的有效数据,也就是一系列的key/value组合。当然这些key/value在data block中是按key值的大小顺序排列的。在编码一节我们曾经提到过存储过程中对key-value的编码模型。一般是下面这样的形式:

key_len|key|value_len|value

这就是一个键值对的存储方式。在sstable中的格式大体也是这样的,只是在sstable,我们的key对应的不再是单纯的键的值,它还包括了加入键的sequence number和type。因此在sstable的data block中,每个键值对的存储形式是下面这样的:


这里写图片描述

leveldb里面把这里的Key成为internal_key。前面的Key_size对应的也是这个internal_key的大小了。至于internal key中其他两个域(sequence number,type)的具体含义后面会详细介绍,这里只是讲一下键值对的具体存储格式。


meta block

meta block是存储关于data block的一些其他信息,每个meta block存储一种信息。比如有filter meta block信息,stats meta block信息。这里需要注意的是,每个meta block是对所有的data block的信息描述,切不可理解为每个meta block对应一个data block


metaindex block

再往后面是metaindex block。一个sstable只有一个metaindex block。正如字面意思所表达的那样,metaindex block包含了各个meta block的索引信息,简单地可以理解为从metaindex block可以找到每个meta block。它里面主要包含了meta block在文件中的偏移位置和大小。它也是key/value对的形式存储元素。其中key是meta block的名称,value是BlockHandle。BlockHanle是一个结构体,包含了相应的meta
block的offset和size。


index block

和metaindex block一样,每个sstable只含有一个index block。index block包含的是data block的索引信息。index block中每个元素指向一个data block。它也是键值对的形式存储数据。它的key是一个字符串,这个字符串大于等于这个元素指向的data block的(最后)最大元素的key,小于下一个data block的(第一个)最小key值。它的value是一个BlockHandle,表示所指向的data block在sstable文件中的偏移位置(offset)和大小(size).


footer
sstable中的最后一项是footer,它位于文件的末尾。和前面的所有数据区不同,footer的大小是固定(fixed size)的。他包含了metaindex block和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)

所以,我们根据footer可以找到index block和metaindex block,根据index block可以找到所有的data block;根据metaindex block可以找到data block的各种状态信息(meta block)。


总结

这篇博文主要是剖析了sstable的文件格式。还是很清晰明了的。sstable主要包括 data block,meta block,metaindex block,index block,footer五个部分。其中data block和meta block在每个文件中有多个,而其他几种block在每个文件中只能有一个,并且metaindex block和index block以及data block都是以键值对序列的形式存储数据的。其中footer块大小是固定的。在剖析的过程中,我们还顺带分析了以下各个block中存储的数据内容已经含义。有些数据的意义现在可能还不理解,随着后面的讲解会逐渐清晰。

晚上去听学长职业分享,祝自己求职顺利啦!

2 0
原创粉丝点击