data block结构

data block中存储的数据是leveldb中的keyvalue键值对。其中一个datablock中的数据部分(不包括压缩类型、CRC校验码)按逻辑又以下图进行划分:

data block结构 - 图1

第一部分用来存储keyvalue数据。由于sstable中所有的keyvalue对都是严格按序存储的,用了节省存储空间,leveldb并不会为每一对keyvalue对都存储完整的key值,而是存储与上一个key非共享的部分,避免了key重复内容的存储。

每间隔若干个keyvalue对,将为该条记录重新存储一个完整的key。重复该过程(默认间隔值为16),每个重新存储完整key的点称之为Restartpoint。

注解

leveldb设计Restartpoint的目的是在读取sstable内容时,加速查找的过程。

由于每个Restartpoint存储的都是完整的key值,因此在sstable中进行数据查找时,可以首先利用restartpoint点的数据进行键值比较,以便于快速定位目标数据所在的区域;

当确定目标数据所在区域时,再依次对区间内所有数据项逐项比较key值,进行细粒度地查找;

该思想有点类似于跳表中利用高层数据迅速定位,底层数据详细查找的理念,降低查找的复杂度。

每个数据项的格式如下图所示:

data block结构 - 图2

一个entry分为5部分内容:

  • 与前一条记录key共享部分的长度;
  • 与前一条记录key不共享部分的长度;
  • value长度;
  • 与前一条记录key非共享的内容;
  • value内容;例如:
  1. restart_interval=2
  2. entry one : key=deck,value=v1
  3. entry two : key=dock,value=v2
  4. entry three: key=duck,value=v3

data block结构 - 图3

三组entry按上图的格式进行存储。值得注意的是restart_interval为2,因此每隔两个entry都会有一条数据作为restartpoint点的数据项,存储完整key值。因此entry3存储了完整的key。

此外,第一个restart point为0(偏移量),第二个restart point为16,restartpoint共有两个,因此一个datablock数据段的末尾添加了下图所示的数据:

data block结构 - 图4

尾部数据记录了每一个restart point的值,以及所有restart point的个数。