leveldb的整体设计

leveldb

Posted by bbkgl on November 24, 2019

船泊湘风晚

花谢烟雨迟

前面已经知道了leveldb存储数据的基本思路,然后介绍一下架构设计。

上一节说的大概就是这么个架构设计。

数据读写

写流程

知道整体思路和架构后,数据的写入流程就是:

  1. 按照WAL来,也就是先写Log再写数据
  2. 再把数据更新到Memtable,其实就是一个map
  3. 当Memtable的size超过一定限制的时候,就把Memtable变成一个Immutable memtable,也就是不能更改的map
  4. Immutable memtable写入到磁盘中,按照Log写,然后释放Log的空间
  5. 当Level0 SST文件大小过大的时候,会与下层逐级合并,保证有序性
  6. 后面的层级合并与上述过程类似

需要注意的是,大多数时候,写入流程到1或者2就能结束了,但是当数据量特别大的时候,后台会继续进行数据的合并操作,也就是写入到内存和最后写入到磁盘这两个过程是并发或者并行的。

读流程

读取流程比较简单:

  1. 先去Memtable中根据键查找,如果有就返回值,不然进入下一个过程
  2. 然后去Immutable memtable中继续查找,找到返回,没找到进入下一个过程
  3. 然后就去磁盘中找,依次从Level0-LevelN
  4. 从数据的新旧程度来说,从0-N依次为旧数据,查找的时候也是按照这个顺序查找,也就是一个个翻文件,翻到返回值,没翻到就返回空

上图就是读取的流程。

Manifest和Current文件

除了上述几个结构以外,还有Manifest和Current文件。

Manifest文件

Manifest文件记录所有SST文件中的表信息和相关操作:

  1. Manifest文件中记录了leveldb中所有层级的表,每一个SST中表的范围和其他重要的元数据
  2. 以日志的格式存储
  3. 所有对SST文件的增删操作都会追加到日志中

Current文件

记载了当前manifest文件名。

参考:LevelDB源码解析4. 架构设计