leveldb研究系列五——Ssttable组件

来源:互联网 发布:java io流怎么用 编辑:程序博客网 时间:2024/06/02 04:44

Sstable 是leveldb数据库的数据库文件,是leveldb也包括Bigtable的核心组件。

解析Ssttbale可以从它的物理结构和逻辑结构两个部分出发,首先我们先谈谈物理结构。 


Ssttable被划分为固定大小的物理块对于每个Block, 物理上包含三部分,Block data 数据块,1byte的type字段用来指明数据是否压缩,压缩算法采用google自行设计的snappy算法。 snappy算法是google自行设计的压缩算法,不兼容其他压缩算法,压缩速率比zip要快,但是产生的文件与之相比也要大不少。  CRC为4byte,和log一样是数据校验,为了判别数据在存储传送时是否发生差错。

下面到了攻坚克难的逻辑构成部分了,在doc/Table_format.txt中详细表述了Sstable的逻辑组成(这里的逻辑组成和物理组成要区分开,在不同的物理块的具体内容的逻辑解释是不同的,逻辑结构是对一个Sstable的文件而已,物理结构是对一个Block而言,这里要区分

摘取部分doc/Table_format.txt说明其逻辑结构

File format ===========       //Ssttbale逻辑组成如下
  <beginning_of_file>
  [data block 1]
  [data block 2]                         

  ...
  [data block N]        // 数据部分

               
  [meta block 1]                //bloom filter 位数组
  ...
  [meta block K]                //bloom filter的位数组
  [metaindex block]          //对bloom filter位数组的索引
  [index block]                   //索引部分
  [Footer]        (fixed size; starts at file_size - sizeof(Footer))
  <end_of_file> 

SStale 包括数据组成和meta/index两大部分,data block(1......N)存储了数据部分,meta block存储了快速过滤和判别不在block的中的key,至于bloom filter是怎么工作的后面我还会讲到。 metaindex block是对前面的meta的入口索引,key要先查阅metaindex才知道到哪个meta block里面去过滤判别   index block 是对每个block进行了索引摘要,懒得翻译了

(4) An "index" block.  This block contains one entry per data block, where the key is a string >= last key in that data block and before the first key in the successive data block.  The value is the BlockHandle for the data block. 


Footer 的组成如下

the BlockHandle of the metaindex and index blocks as well as a 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大小固定,总大小为40个字节, metaindex_handle指向前面metaindex的位置,index_handle指向之前的index位置,这里很像是指针的指针,或者是索引的索引 .后面的pdding和magic为了对齐填充无意义。

Block的数据部分是如何布局的呢?   Block的数据是通过提取共同前缀节省空间。先上图


首先我们还是先谈一下什么是前缀压缩:我们知道Ssttable是按照key从小到达一次组织的现在我们给定三个key值  “test,first"   "test,second”  “test,thrild".   对于这样的三个key他们有相同的前缀”test,"   长度为五,  所以我们可以把这部分提取出来,比如对于第二个key  我们只要指明共同前缀的长度5变可从第一个完整key中解析出完整的key,而不需要完整的存储第二个 第三个key。

还有一个概念,那就是重启点, 什么是重启点呢?

接着上面的例子我们给出第四个key,"sys,fourth",  显然第四个和前三个没有共同前缀,所以在这里我们要完整的保留整个key,在这之后key可以分享共同前缀,这第四个我们要完整记录的key我们叫做重点。

一个record包括五个字段:shared_bytes:  共享前缀的长度

                                              unshared_bytes: 私有字段长度

                                               value_length: value长度

                                                 key_keydta: key的内容

                                                 value:value内容

Restars[0,1.......N]指明重启点的位置,num_restars指出重启点的个数。    Ssttable的前缀压缩策略减少了磁盘空间也带来了查找的时间代价。

到这里为止我们已经完整的分析了Ssttable的物理和逻辑结构,下一篇会详细讲述Ssttable的读和写(构建)

0 0
原创粉丝点击