目录
1.Leveldb基础介绍
概念:
LevelDB是Google开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,LevelDB很适合应用在查询较少,而写很多的场景。
特点:
1.LevelDb是一个持久化存储的KV系统,和Redis这种内存型的KV系统不同,LevelDb不会像Redis一样狂吃内存,而是将大部分数据存储到磁盘上。
2.LevleDb在存储数据时,是根据记录的key值有序存储的,即相邻的key值在存储文件中是依次顺序存储的。用户可以自定义key大小比较函数Comparator,来实现依序存储的过程。
3.操作接口很简单,基本操作包括写记录,读记录以及删除记录。也支持针对多条操作的原子批量操作。
4.支持数据快照(snapshot)功能,使得读取操作不受写操作影响,可以在读操作过程中始终看到一致的数据。
性能:
L随机写性能达到40万条记录每秒;随机读性能达到6万条记录每秒。总体来说,LevelDb的写操作要大大快于读操作,而顺序读写操作则大大快于随机读写操作。
2.Leveldb整体架构
LevelDb结构示意图如下:
从图中可以看出,LevelDb结构包括六个主要部分:内存中的MemTable和Immutable MemTable以及磁盘上的几种主要文件:Current文件,Manifest文件,Log文件以及SSTable文件。
根据整体结构体,数据库的写入过程如下:
当应用写入一条Key:Value记录的时候,LevelDb会先往log文件里写入,成功后将记录插进Memtable中,这样基本就算完成了写入操作,具体流程如下:
- 首先写入Log文件。
- 再把数据更新到Memtable。
- 当Memtable size超过一定限制的时候,把Memtable整理成一个Immutable Memtable。
- 将Immutable Memtable写入到磁盘。然后释放相应的Log文件的空间。
- 当Level0 SST文件大小太多的时候,Level 0 SST会与后面的层级进行合并,保证有序性。
- Level 1 SST与更高的层次的合并也是这样。
根据整体结构体,数据库的读取过程如下:
查询路径:Memtable到Immutable Memtable,再从Immutable Memtable到文件,而文件中为何是从低level到高level。(按照数据新鲜程度排列出来的,越新鲜的越先查找)
- 首先去Memtable中查找相应的键值,看一下是否存在。如果存在。那么返回相应的Value。这个时候读是最快的。
- 如果不存在,继续去Immutable Memtable里查询。如果存在。那么返回相应的Value。查询速度次之。
- 如果在Memtable和imuTable里面都没有找到。那么这个时候就需要去磁盘块里面查找了。
- 从数据的新旧程度上来说。Level 0里面的数据块是最新的。Level 1其次。所以在查找的时候,也是照着这个顺序查找。一个一个翻文件,如果翻到了就返回。如果没有翻到,那么就只能说读取失败。
3.文件作用介绍
1、Log文件(磁盘)
写Memtable前会先写Log文件,Log通过append的方式顺序写入。Log的存在使得机器宕机导致的内存数据丢失得以恢复。
2、 Memtable(内存)
内存数据结构,跳表实现。新的数据会首先写入这里。
3、Immutable Memtable(内存)
达到Memtable设置的容量上限后,Memtable会变为Immutable为之后向SST文件的归并做准备。Immutable Mumtable不再接受用户写入,同时生成新的Memtable、log文件供新数据写入。
4、SST文件(磁盘)
磁盘数据存储文件。SSTable(Sorted String Table)就是由内存中的数据不断导出并进行Compaction操作后形成的,而且SSTable的所有文件是一种层级结构,第一层为Level 0,第二层为Level 1,依次类推,层级逐渐增高,因此称为LevelDb。除此之外,Compact动作会将多个SSTable合并成少量的几个SSTable,以剔除无效数据,保证数据访问效率并降低磁盘占用。
5、Manifest文件:
所有涉及到SSTable的文件的操作都会在这里做上相应的记录。
- MANIFEST 文件中记录了 LevelDB 中所有层级中的表、每一个 SSTable 的 Key 范围和其他重要的元数据;
- 它以日志的格式存储;
- 所有对文件的增删操作都会追加到这个日志中。
6、Current文件
就是记载当前的manifest文件名。
4.源码目录结构
主要通过源码的目录结构以及阐述关键目录和源文件的职责的方式来展示源码的整个架构。
- cmake:cmake的相关文件
- db:主要机制的实现,包括版本管理,compact,业务读写等功能机制实现;
- doc:文档;
- helpers/memenv:简单完全内存的文件系统,提供操作目录文件接口;
- include/leveldb:头文件,外部工程使用leveldb时引用的头文件;
- port:平台相关的实现,主要提供posix/android相关支持;
- table:定义了整个leveldb的持久化存储的数据结构
- util:通用功能实现。