没有合适的资源?快使用搜索试试~ 我知道了~
首页LevelDB SSTable格式详解
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/5889117/bg1.jpg)
LevelDB SSTable 格式详解
作者:phylips@bmy
2012-01-16
![](https://csdnimg.cn/release/download_crawler_static/5889117/bg2.jpg)
1. SSTable文件格式 .................................................................................................... 3
1.1. 格式说明 ...................................................................................................... 3
1.2. 基本机制 ...................................................................................................... 5
1.2.1. 数据压缩 ............................................................................................ 5
1.2.2. Varint编码 .......................................................................................... 5
1.2.3. CRC校验 ............................................................................................. 6
1.2.4. 前缀压缩 .......................................................................................... 10
1.2.5. 索引优化 .......................................................................................... 11
1.3. 几个问题 .................................................................................................... 12
2. 一个实际的SSTable文件 ...................................................................................... 13
2.1. 数据组成 .................................................................................................... 13
2.2. 二进制内容 ................................................................................................ 14
3. 单个文件读写过程 .............................................................................................. 15
3.1. 读文件 ........................................................................................................ 15
3.1.1. 基本过程 .......................................................................................... 15
3.1.2. 代码分析 .......................................................................................... 16
3.2. 写文件 ........................................................................................................ 17
3.2.1. 基本过程 .......................................................................................... 17
3.2.2. 代码分析 .......................................................................................... 17
4. 与HFile的对比分析 .............................................................................................. 18
4.1. HFile V1 文件格式 ...................................................................................... 20
4.2. 对比分析 .................................................................................................... 21
5. 性能因素 .............................................................................................................. 21
5.1. Block大小 ................................................................................................... 22
5.2. 重启点区间大小 ........................................................................................ 22
5.3. 压缩 ............................................................................................................ 22
5.4. CRC .............................................................................................................. 22
6. 参考文献 .............................................................................................................. 22
7. 附录 ...................................................................................................................... 23
7.1. crc32c_defs.h .............................................................................................. 23
7.2. gen_crc32ctable.c ....................................................................................... 24
![](https://csdnimg.cn/release/download_crawler_static/5889117/bg3.jpg)
1. SSTable 文件格式
SSTable 是 Sorted String Table 的简称,也就是 Bigtable 底层的数据存储格式。
SSTable 文件是用来存储一系列有序的 KeyValue 对的,Key 和 Value 都是字节串,
KeyValue 对根据固定比较规则有序地写入到文件中,文件内部分成一系列的
Blocks(Block 不会太大,常见的是 64KB 大小),同时具有必要的索引信息。这样
就既可以顺序地读取内部 KeyValue 记录,也能够根据某个 Key 值进行快速定位。
Google 开源的 LevelDB 对应了 Bigtable 中的 tablet server,LevelDB 的代码中自然
也包含了 SSTable 这一重要结构。下面会对 SSTable 的格式进行详细地解说,同时
还会就一些影响性能的关键点进行分析,并将它与开源类 Bigtable 系统 HBase 中
的 HFile 进行一个对比。
1.1. 格式说明
![](https://csdnimg.cn/release/download_crawler_static/5889117/bg4.jpg)
单个 SSTable 文件的格式如上图所示,文件由五大部分组成:Data Blocks,Meta
Blocks,MetaIndexBlock,DataIndexBlock,Footer。除 Footer 部分外,其余都是
一些 block 组成的结构,每个 block 则是由多个 KeyValue 组成的数据块。文件包
含一些内部指针。每个这样的指针被称为一个 BlockHandle,包含如下信息:
offset: varint64
size: varint64
如图所示,Footer 中会有一个 meta index handle 用来指向 Meta Index Block,还
有一个 data index handle 用来指向 Data Index Block,然后这两个 Index Block,实
际上是一系列 Data Blocks 和 Meta Blocks 的索引,其内部的 KeyValue 值就包含了
指向文件中的一系列 Meta Block 和 Data Block 的 handle。
(1)文件内的 key/value 对序列有序排列,然后划分到一系列的 data blocks 里。这
些 blocks 一个接一个的分布在文件的开头。每个 data block 会根据 block_builder.cc
里的代码进行格式化,然后进行可选地压缩。
(2)在数据 blocks 之后存储的一些 meta blocks,目前支持的 meta block 类型会在
下面进行描述。未来也可能添加更多的 meta block 类型。每个 meta block 也会根
据 block_builder.cc 里的代码进行格式化,然后进行可选地压缩。
(3) A "metaindex" block。会为每个 meta block 保存一条记录,记录的 key 值就是
meta block 的名称,value 值就是指向该 meta block 的一个 BlockHandle。
(4) An "index" block。会为每个 data block 保存一条记录,key 值是>=对应的 data
block 里最后那个 key 值,同时在后面的那个 data block 第一个 key 值之前的那个
key 值,value 值就是指向该 meta block 的一个 BlockHandle。
(5) 文件的最后是一个定长的 footer,包含了 metaindex 和 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]; // 0 bytes to make fixed length
magic: fixed64; // == 0xdb4775248b80fb57
所以 footer 的总大小为 40+8=48。
另需注意如下几点:
1.图中 handle 类型,也就是上面提到的 BlockHandle,由 offset 和 size 组成
2.handle 中的 size 大小不包括 Type 和 CRC 这两部分
3.CRC 检验的内容包含了 Type 部分
4.block type 目前有两种:0-不压缩,1-snappy 压缩
5.meta index 和 data index 是两个相对特殊的 block,其内部的 KeyValue 具有特殊含
义,如图所示。目前的 LevelDB 版本中并未实现 Meta Block。
需要着重解释的是:上图中除 DataBlock 外,其他类型的 Block:MetaBlock,
MetaIndexBlock,DataIndexBlock 也都同属 Block 这一相同结构,都具有BlockData,
Type,CRC 这三部分,为简化起见,并没有画出这一级,只是画出了存在于这些
Block 中的 KeyValue 内容。同时对于 BlockData 来说,也是具有内部结构的,如
上图中 DataBlock 部分画出的那样,BlockData 又由如下几部分组成:KeyValue 数
据,Restart 数组,RestartsNum。其中 KeyValue 部分结构如图顶部所示,Restart
![](https://csdnimg.cn/release/download_crawler_static/5889117/bg5.jpg)
数组和 RestartsNum 都是与前缀压缩相关的结构,Restart 数组记录了重启点的偏
移位置,RestartsNum 则是重启点的个数,也即 Restart 数组的元素个数。它们实
际上担当了 BlockData 内部数据索引的角色,具体细节见下面的关于前缀压缩机
制的分析。
1.2. 基本机制
1.2.1. 数据压缩
SSTable 中的压缩是以 Block 为单位进行的。目前只支持一种压缩方式:Snappy,
用户也可以选择不进行压缩。该压缩算法本身的实现并不在 LevelDB 内,用户如
果使用的话需要首先安装 Snappy,这是 Google 开源的一个压缩库。
当然,即使没有安装 Snappy,LevelDB 也是可以工作的。因为为了保证可移植性,
LevelDB 中对该压缩算法的调用也做了一层封装,如下:port/port_posix.h
inline bool Snappy_Compress(const char* input, size_t length,
::std::string* output) {
#ifdef SNAPPY
output->resize(snappy::MaxCompressedLength(length));
size_t outlen;
snappy::RawCompress(input, length, &(*output)[0], &outlen);
output->resize(outlen);
return true;
#endif
return false;
}
这样如果没有 Snappy 库的话,也不会编译失败,即使用户在 option 中指定了采
用压缩,压缩也不会生效,内部也只是采用非压缩格式。当然如果用户已经安装
了 Snappy,那么 LevelDB 的 Makefile 就能检测出来并定义好相关的宏。
1.2.2. Varint 编码
1.2.2.1. 基本原理
从上面图中可以看到,很多字段都是 varint 类型的。varint 是对整数类型进行了
变长编码。比如 int32 原本只有 4 字节,而编码后最短只需 1 个字节,最长需 5
个字节。在 key,value 长度都很小的情况下,采用 varint 编码的方式所带来的结
构信息的空间节省会非常明显。
在 varint 编码中,编码后的每个字节的最高位用来表示后面的那个字节是否属于
剩余25页未读,继续阅读
![m](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/8c9aa1354d5749f0b4c0d8e847d85ccf_madman188.jpg!1)
机器不学习_
- 粉丝: 27
- 资源: 11
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- 保险服务门店新年工作计划PPT.pptx
- 车辆安全工作计划PPT.pptx
- ipqc工作总结PPT.pptx
- 车间员工上半年工作总结PPT.pptx
- 保险公司员工的工作总结PPT.pptx
- 报价工作总结PPT.pptx
- 冲压车间实习工作总结PPT.pptx
- ktv周工作总结PPT.pptx
- 保育院总务工作计划PPT.pptx
- xx年度现代教育技术工作总结PPT.pptx
- 出纳的年终总结PPT.pptx
- 贝贝班班级工作计划PPT.pptx
- 变电值班员技术个人工作总结PPT.pptx
- 大学生读书活动策划书PPT.pptx
- 财务出纳月工作总结PPT.pptx
- 大学生“三支一扶”服务期满工作总结(2)PPT.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)