leveldb源码分析--SSTable之逻辑结构
SSTable是leveldb 的核心模块,这也是其称为leveldb的原因,leveldb正是通过将数据分为不同level的数据分为对应的不同的数据文件存储到磁盘之中的。为了理解其机制,我们首先看看SSTable中的基本概念。
首先看看数据的整体存储结构:
可以从图中看到了几个概念:Datablock,Metablock, MetaIndex block, Indexblock, Footer.具体他们的含义可以大致解释如下:
1. Datablock,我们知道文件中的k/v对是有序存储的,他们被划分到连续排列的Data Block里面顺序存储起来;
2. 紧跟数据存储区的是Meta Block,存储的是Filter信息,比如Bloom过滤器,用于快速判断key是否在对应数据块;
3. MetaIndex Block是对Meta Block的索引,它只有一条记录,为meta index的名字(也就是Filter的名字)和指向meta Block的BlockHandle;
4. Index block是对Data Block的索引,对于其中的每个记录,其key >=Data Block最后一条记录的key,同时<其后Data Block的第一条记录的key;value是指向data index的BlockHandle;
5. 最后的是一个定长的Footer,他包含了MetaIndex block和Indexblock 的BlockHandle,以及填充区和一个magic数字。其逻辑格式如下图
了解了每个块的大致作用以后,我们再来详细分析每个组成部分,首先是Datablock其总体格式如下图
Block data存储的就是我们leveldb中最关键的数据KV对,而type是一个标记Block data是否采用了Snappy压缩算法,crc32顾名思义则是整个block的一个crc校验值,用于判断block是否出错。知道整体结构以后我们再来看看具体的block data部分的存储格式:

也许你会以为在划分好block的数据存储区域以后那么就是一个一个的KV对(如图中的Record)了,但是其实不是,leveldb为了降低数据的存储量和快速的查找引入了一个重启点(restartpoint)的概念。这里的restart是指kv对的K的重现完整存储的概念,我们来看看每个record的存储格式以理解这里的restartpoint这个概念。

在leveldb中每一个KV对被分为了如上图的几个部分,因为Block内容里的KV记录是按照Key大小有序的,所以相邻的两条记录之间的Key很可能存在一个相同的部分,比如key i=“the Car”,Key i+1=“the color”,那么两者存在相同部分“the c”。leveldb就可以利用这个相邻记录存在相同部分来尽量减少Key的存储量,比如Key i+1可以只存储和上一条Key不同的部分“olor”,两者的共同部分从Key i中可以获得。所以整个存储区就存在这样的一个存储情况:一条记录存储完整的Key,而之后的记录开始连续一定的记录数都采取只记载不同的Key部分,然后在是一个重新存储完整的Key值的记录,然后再是一定数量的存储不完整Key的记录,那么我们就称这里的存储完整的Key值的记录为重启点。所以上面的图中的Restart就是用来记录这些存储完整Key的Record的地址,而num_restarts则更容易理解了,就是我们这个block中一共有多少个这样存储了完整Key的Record。
倒过去理解,最后我们首先看本block有多少个存储了完整Key的记录,然后这些记录的位置在那里,然后根据这些位置信息就可以定位到完整KV对,举个例子如下:
|||test comm|onn
|||hahaa|haha
|||testtest1|xxxx
|||tttt|tttt
开始
第三条记录的偏移量
2
将上面的展开就可以得到记录为
test comm|onn
test hahaa|haha
testtest1|xxxx
testtttt|tttt
下一篇文章将从代码的角度进行分析
leveldb源码分析--SSTable之逻辑结构的更多相关文章
- leveldb源码分析--SSTable之block
在SSTable中主要存储数据的地方是data block,block_builder就是这个专门进行block的组织的地方,我们来详细看看其中的内容,其主要有Add,Finish和CurrentSi ...
- leveldb源码分析--SSTable之TableBuilder
上一篇文章讲述了SSTable的格式以后,本文结合源码解析SSTable是如何生成的. void TableBuilder::Add(const Slice& key, const Slice ...
- LevelDB源码分析-sstable的Block
sstable中的Block(table/block.h table/block.cc table/block_builder.h table/block_builder.cc) sstable中的b ...
- leveldb源码分析--SSTable之Compaction
对于compaction是leveldb中体量最大的一部分,也应该是最为复杂的部分,为了便于理解我们首先从一些基本的概念开始.下面是一些从doc/impl.html中翻译和整理的内容: Level 0 ...
- Leveldb源码分析--1
coming from http://blog.csdn.net/sparkliang/article/details/8567602 [前言:看了一点oceanbase,没有意志力继续坚持下去了,暂 ...
- leveldb源码分析--WriteBatch
从[leveldb源码分析--插入删除流程]和WriteBatch其名我们就很轻易的知道,这个是leveldb内部的一个批量写的结构,在leveldb为了提高插入和删除的效率,在其插入过程中都采用了批 ...
- leveldb源码分析--Key结构
[注]本文参考了sparkliang的专栏的Leveldb源码分析--3并进行了一定的重组和排版 经过上一篇文章的分析我们队leveldb的插入流程有了一定的认识,而该文设计最多的又是Batch的概念 ...
- leveldb源码分析--日志
我们知道在一个数据库系统中为了保证数据的可靠性,我们都会记录对系统的操作日志.日志的功能就是用来在系统down掉的时候对数据进行恢复,所以日志系统对一个要求可靠性的存储系统是极其重要的.接下来我们分析 ...
- leveldb源码分析之Slice
转自:http://luodw.cc/2015/10/15/leveldb-02/ leveldb和redis这样的优秀开源框架都没有使用C++自带的字符串string,redis自己写了个sds,l ...
随机推荐
- VS和Eclipse的调试功能哪个更强大?
以前一直用VS 2012来调试C/C++代码,F5.F10.F11用起来甚是顺手,前面也写过一篇关于VS最好用的快捷键:Visual Studio最好用的快捷键(你最喜欢哪个), 所以对于调试C/C+ ...
- 一次Linux服务器被入侵和删除木马程序的经历
转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wzlinux.blog.51cto.com/8021085/1740113 一.背景 晚上看到有台服 ...
- Spring总结 4.AOP之为对象添加新功能
Spring除了提供增强原有功能的方法外,还提供了为一个对象引入新功能的方法.如下: package cn.powerfully.service; public interface IService ...
- NHibernate 有好几种数据库查询方式
NHibernate 有好几种数据库查询方式 1.原生SQL var employeeQuery = Database.Session .CreateSQLQuery("select * f ...
- WPF性能优化的一些建议
尽量多使用Canvas等简单的布局元素,少使用Grid或者StackPanel等复杂的,减小开销. 少用Margin Padding尤其避免嵌套使用. 在自定义控件,尽量不要在控件的ResourceD ...
- js实现四叉树算法
最近在看canvas动画方面教程,里面提到了采用四叉树检测碰撞.之前也看到过四叉树这个名词,但是一直不是很懂.于是就又找了一些四叉树方面的资料看了看,做个笔记,就算日后忘了,也可以回来看看. Quad ...
- 在jQuery定义自己的扩展方法函数
今早复习昨天的练习jQuery的DropDownList联动功能,如果想看回<jQuery实现DropDownList(MVC)>http://www.cnblogs.com/insus/ ...
- vue简单的脚手架搭建项目
第一步 node环境安装 1.如果本机没有安装node运行环境,下载node安装包进行安装 下载地址:https://nodejs.org/en/或者http://nodejs.cn/ 第二步 nod ...
- Lightning Chart 8.4版新功能
LightningChat V8.4版在如下功能上做了改进 边距 缩放功能 Legend box 的自动定位 正投影 相机orientation与rotation系统 全新3D 坐标空间转换器 Poi ...
- LoRa术语
ADR Adaptive Data Rate 自适应数据率 AES Advanced Encryption Standard 高级加密标准 AFA ...