针对SSTable的结构说明,这篇博客已有介绍,可点此链接查看,leveldb整体架构。
本篇是针对SStable结构的进一步扩展介绍说明。系列文章的分析都是基于leveldb 1.22版本分析的。
SSTable文件结构
落地的SSTable文件结构如下图1
其中Data block、Meta block、Metablock index、index block都属于Block,
Footer是单独的数据格式。
1.Block结构
2.Footer结构
Footer结构共占用48Byte,组成如下:
字段含义如下:
- magic默认占用8Byte。
- metaindex_block_handle指出metaindex Block中SSTable中的偏移位和大小。
由offset+size组成,二者都是Varint64编码,每个Varint64最多占用10个字节,
亦即mataindex_block_handle最多占用20Byte。 - index_block_handle同理metaindex_block_handle,它是指出Index Block在
SSTable中的偏移位和大小,同样由offset+size组成。 - padding_byte就是在metaindex_block_handle和
index_block_handle不够40Byte进行的填充。
Data Block结构
Data Block由三部分组成:
- 每个KV对,即Entry块。
- 重启点restart[]。
- 重启点的个数。
具体参考结构如下:
每个Entry的KV是来自于Memtable,对Memtable不熟悉的可点此链接:Memtable解析。
这里的Key是指Memtable的InternalKey,Value就是Value。Memtable中的InternalKey结构如下:
对于Data Block中各个字段的含义可点击博文开头部分链接查看,更详细的解释留到代码分析部分去说明。
Index Block
每写完一个Data block(4KByte大小,刷新到磁盘),就会往Index Block中写入此Data block的一条记录。接下来看下Index Block的逻辑结构:
Index Block与Data Block的关系,如下图:
对于Index字段的解析如下:
- Key: 记录大于等于数据块i中最大的 key 值的那个 key。在索引里保存的这个
key 值未必一定是某条记录的 key,以上的例子来说,假设数据块i的最小key=“samecity”,
最大key=“the best”;数据块i+1的最小key=“the fox”,最大key=“zoo”,那么对于数据块i的
索引 index i 来说,其第一个字段记载大于等于数据块i的最大Key(“the best”) 同时要小于数
据块i+1的最小Key(“the fox”),所以例子中 index i 的第一个字段是 “the c”,这个是满足要求
的;而 index i+1 的第一个字段则是 “zoo”,即数据块i+1的最大 key。 - Offset: 指出数据块 i 在 .sst 文件中的起始位置。
- Size: 指出 Data Block i 的大小(有时候是有数据压缩的)。
Meta Block
当前版本leveldb用到的Meta Block只有 Filter Block。每个SSTable中只有一个Filter Block,
其结构如下:
字段说明如下:
- 每个Filter大小是2KBte。
- Filter_N Offset存的是对应的Filter在Filter Block中的偏移位。
- Filter Offset Offset指向Filter_N Offset在Filter Block中的起始偏移位。
- Base Lg是个结束标志,为11,亦表示一个Filter的大小。
Metablock Index
Metablock Index的结构比较简单,就三个字段:Key、Offset、Size。
Metablock Index与Meta Block(Filter Block)的关系,如下图:
对于Metablock Index字段解析如下:
- Key:一般就是filter.“过滤策略名称”。
- Offset:指出Filter Block在SSTable中的偏移位。
- Size:指出这个Filter Block的大小。
总结
本篇主要是对SSTable中涉及到的存储结构做个说明,对各个存储结构模块的代码解析后续文章会一一道来。