-
LevelDB-09-Version Iterable
MVCC
Version 保存了当前磁盘以及内存中所有的文件信息,一般只有一个Version叫做”current” version(当前版本)。
Leveldb还保存了一系列的历史版本,这些历史版本有什么作用呢?
当一个Iterator创建后,Iterator就引用到了current version(当前版本),只要这个Iterator不被delete那么被Iterator引用的版本就...
2018-09-06 23:44:19 |
Cache
-
LevelDB-08-cache
Cache
书接前文,前面讲过对于levelDb来说,读取操作如果没有在内存的memtable中找到记录,要多次进行磁盘访问操作。
假设最优情况,即第一次就在level 0中最新的文件中找到了这个key,那么也需要读取2次磁盘,一次是将SSTable的文件中的index部分读入内存,这样根据这个index可以确定key是在哪个block中存储;第二次是读入这个block的内容,然后在内存...
2018-09-06 23:44:19 |
Cache
-
LevelDB-07-Compaction
Compaction
前文有述,对于LevelDb来说,写入记录操作很简单,删除记录仅仅写入一个删除标记就算完事,但是读取记录比较复杂,需要在内存以及各个层级文件中依照新鲜程度依次查找,代价很高。
为了加快读取速度,levelDb采取了compaction的方式来对已有的记录进行整理压缩,通过这种方式,来删除掉一些不再有效的KV数据,减小数据规模,减少文件数量等。
levelDb的co...
2018-09-06 23:44:19 |
Cache
-
LevelDB-06-CURD
写入与删除记录
在之前的五节LevelDb日知录中,我们介绍了LevelDb的一些静态文件及其详细布局,从本节开始,我们看看LevelDb的一些动态操作,比如读写记录,Compaction,错误恢复等操作。
本节介绍levelDb的记录更新操作,即插入一条KV记录或者删除一条KV记录。levelDb的更新操作速度是非常快的,源于其内部机制决定了这种更新操作的简单性。
图6.1是le...
2018-09-06 23:44:19 |
Cache
-
LevelDB-05-MemTable
MemTable
LevelDb日知录前述小节大致讲述了磁盘文件相关的重要静态结构,
本小节讲述内存中的数据结构Memtable,Memtable在整个体系中的重要地位也不言而喻。
总体而言,所有KV数据都是存储在Memtable,Immutable Memtable和SSTable中的,
Immutable Memtable从结构上讲和Memtable是完全一样的,区别仅仅在于其是只读的...
2018-09-06 23:44:19 |
Cache
-
LevelDB-04-SSTable
SSTable文件
SSTable是Bigtable中至关重要的一块,对于LevelDb来说也是如此,对LevelDb的SSTable实现细节的了解也有助于了解Bigtable中一些实现细节。
本节内容主要讲述SSTable的静态布局结构,我们曾在“LevelDb日知录之二:整体架构”中说过,SSTable文件形成了不同Level的层级结构,
至于这个层级结构是如何形成的我们放在后面Co...
2018-09-06 23:44:19 |
Cache
-
LevelDB-03-log
Log
上节内容讲到log文件在LevelDb中的主要作用是系统故障恢复时,能够保证不会丢失数据。
因为在将记录写入内存的Memtable之前,会先写入Log文件,这样即使系统发生故障,Memtable中的数据没有来得及Dump到磁盘的SSTable文件,LevelDB也可以根据log文件恢复内存的Memtable数据结构内容,不会造成系统丢失数据,在这点上LevelDb和Bigtabl...
2018-09-06 23:44:19 |
Cache
-
LevelDB-02-为什么这么快
整体架构
LevelDb本质上是一套存储系统以及在这套存储系统上提供的一些操作接口。为了便于理解整个系统及其处理流程,我们可以从两个不同的角度来看待LevleDb:静态角度和动态角度。从静态角度,可以假想整个系统正在运行过程中(不断插入删除读取数据),此时我们给LevelDb照相,从照片可以看到之前系统的数据在内存和磁盘中是如何分布的,处于什么状态等;从动态的角度,主要是了解系统是如何写入...
2018-09-06 23:44:19 |
Cache