Level DB 学习笔记

一、前言

1.1、作者简介

Level DB是由google的两位大神级工程师Jeff Dean和Sanjay Ghemawat发起的开源项目。

Jeff Dean:Google大规模分布式平台Bigtable和MapReduce的主要设计和实现者
Sanjay Gghemawat:Google大规模分布式平台GFS,Bigtable和MapReduce主要设计和实现工程师。

1.2、LevelDB简介

LevelDB能够处理10亿级别规模的Key-Value持久性存储数据的C++程序库。
Bigtable这个分布式存储系统中,有两个核心部分:Master Server和Tablet Server,其中Master Server做一些管理数据的存储及分布式调度工作,Tablet Server负责分布式数据存储及读写操作。Level DB可以理解为一个简化版的Tablet Server。

1.2.1、LevelDB的特点

1、LevelDB是个可持久化的KV系统,不同于Redis数据都存在缓存,LevelDB的大部分数据都落磁盘存储。
2、LevelDB在存储数据时,根据记录的Key值有序存储的,就是说相邻的Key值在文件中是依次顺序存储的,而应用可以自定义Key大小比较函数,LevelDB会按照用户定义的比较函数依序存储这些数据。
3、LevelDB的操作接口简单,基本操作包括写、读、删除记录等,也支持对多条操作的原子批量操作。(没有redis接口丰富,需要自己扩展)
4、LevelDB支持数据快照(snapshot)功能,使得读操作不受写操作影响,可以在读操作过程中,始终看到一致的数据。
5、LevelDB还支持数据压缩等操作,这对于减小存储空间及加快IO效率都有直接的帮助。

最牛的是,LevelDB的性能非常强,官网称其随机写性能达到40万条记录每秒,而随机读性能达到6万条每秒。
总体来说,LevelDB的写操作要大大快于读操作,而顺序读写操作则大大快于随机读写操作。为什么这样,后面看原理。

二、LevelDB架构

LevelDB本质上是一套存储系统,及在这套存储系统上提供的一系列操作接口。

LevelDB作为存储系统,数据记录的存储介质包括内存和磁盘文件。当Level DB运行一段时间后,我们给LevelDB拍照如下:
在这里插入图片描述
LevelDB的静态结构包括6个主要部分:

  • 内存中的MemTable、Inmmutable MemTable
  • 磁盘上的主要文件:Current文件、Manifest文件、log文件、SSTable文件。
    当然除了这六个主要部分,还有一些辅助的文件,但以上6个文件和数据结构是LevelDB的主体构成元素。

LevelDB的Log文件和Memtable与Bigtable论文中介绍是一致的。当应用写入一条Key:Value记录的时候,LevelDB会先往log文件里写入,成功后将记录插入Memtable中,这样就算完成了写入操作,因为一次写入操作,只涉及一次磁盘顺序写和一次内存写入,这就是LevelDB写入快的主要原因。

Log文件在系统中的作用主要是用于系统奔溃恢复时不丢数据,假如没有Log文件,刚写入的记录是保存在内存中的,如果系统崩溃,内存中的数据还没来得及dump到磁盘,就会丢数据(如Redis)。所以为了避免这个问题,LevelDB在写入内存前,先将操作记录到Log文件中,在记入内存。

当Memtable插入的数据占用内存到了一个界限后,需要将内存的记录导出到外存文件,LevelDB会生成新的Log文件和Memtable,原先的Memtable就成了Immutable Memtable,顾名思义,就是说这个Memtable的内容是不能更改的,即只能读不能写或删。新到来的数据被记入到新的Log文件和Memtable,LevelDB后台调度会将Immutable Memtable的数据导出到磁盘,形成了一个新的SSTable文件。SSTable文件就是由内存中的数据不断导出并进行Compaction操作后形成的。而SSTable的所有文件是一种层级结构,第一层为Level 0, 第二层为Level 1, 以此类推,层级逐渐增高,这就是为何成为LevelDB的原因。

SSTable中的文件是Key有序的,就是说文件中小Key记录排在大Key记录之前,各个Level的SSTable都是如此。
需要注意的是,Level 0是SSTable文件(后续为.sst)和其他Level文件相比有特殊性:这个层级内的.sst文件,两个文件可能存在key重叠,比如有两个level 0 的sst文件,文件A和文件B,文件A的Key的范围是:{bar, car}, 文件B的Key的范围是{blue, samecity},那么很可能两个文件都存在key="blood"的记录。对于其他的Level的SSTable文件文件来说,则不会出现同一级别的.sst文件的Key重叠的现象,就是说Level中任意两个.sst文件,就可以保证他们的Key值是不会重叠的。

猜你喜欢

转载自blog.csdn.net/shijinghan1126/article/details/108781285
DB