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中存储的数据内容已经含义。有些数据的意义现在可能还不理解,随着后面的讲解会逐渐清晰。
晚上去听学长职业分享,祝自己求职顺利啦!
- leveldb源码剖析-sstable
- leveldb源码剖析--TableBuilder生成磁盘sstable
- levelDB源码分析-SSTable
- levelDB源码分析-SSTable:Block
- LevelDB源码之三SSTable
- leveldb源码分析--SSTable之Compaction SetupOtherInputs
- leveldb源码分析--SSTable之Compaction 详解
- leveldb源码分析--SSTable之block
- Leveldb源码解析第三篇【sstable 收尾】
- levelDB源码分析-SSTable:.sst文件构建与读取
- LevelDB源码阅读(1)—— SSTable的生成
- Leveldb源码解析第四篇【sstable添加key的流程】
- leveldb源码剖析--编码
- leveldb源码剖析--MemTable
- leveldb之SSTable
- leveldb学习:sstable(1)
- leveldb学习:sstable(2)
- LevelDB源码剖析之SkipList
- android 直播技术准备知识
- Android设置字间距和行间距
- Java ORM 框架
- leetcode1. Two Sum
- java基础学习之正则表达式 十五
- leveldb源码剖析-sstable
- iptables简介
- 在linux环境下 通过示例对目录的三种权限进行幽默解读
- 你真的理解Java传值与引用吗?
- 迷宫寻宝(一)(BFS)
- powerdesigner导出oracle数据库结构
- houdini特效导入unity3d步骤和注意点
- iOS 最新版本10以后info.plist增加了一些必须要添加的字段,添加完以后才可以通过审核。
- 深入理解javascript原型和闭包(10)——this