船泊湘风晚
花谢烟雨迟
前面已经知道了leveldb存储数据的基本思路,然后介绍一下架构设计。
上一节说的大概就是这么个架构设计。
数据读写
写流程
知道整体思路和架构后,数据的写入流程就是:
- 按照WAL来,也就是先写Log再写数据
- 再把数据更新到Memtable,其实就是一个map
- 当Memtable的size超过一定限制的时候,就把Memtable变成一个Immutable memtable,也就是不能更改的map
- Immutable memtable写入到磁盘中,按照Log写,然后释放Log的空间
- 当Level0 SST文件大小过大的时候,会与下层逐级合并,保证有序性
- 后面的层级合并与上述过程类似
需要注意的是,大多数时候,写入流程到1或者2就能结束了,但是当数据量特别大的时候,后台会继续进行数据的合并操作,也就是写入到内存和最后写入到磁盘这两个过程是并发或者并行的。
读流程
读取流程比较简单:
- 先去Memtable中根据键查找,如果有就返回值,不然进入下一个过程
- 然后去Immutable memtable中继续查找,找到返回,没找到进入下一个过程
- 然后就去磁盘中找,依次从Level0-LevelN
- 从数据的新旧程度来说,从0-N依次为旧数据,查找的时候也是按照这个顺序查找,也就是一个个翻文件,翻到返回值,没翻到就返回空
上图就是读取的流程。
Manifest和Current文件
除了上述几个结构以外,还有Manifest和Current文件。
Manifest文件
Manifest文件记录所有SST文件中的表信息和相关操作:
- Manifest文件中记录了leveldb中所有层级的表,每一个SST中表的范围和其他重要的元数据
- 以日志的格式存储
- 所有对SST文件的增删操作都会追加到日志中
Current文件
记载了当前manifest文件名。