leveldb源码剖析1.2–基础概述之整体架构

leveldb源码剖析1.2–基础概述之整体架构

引言

leveldb采用LSM树(Log Structured-Merge Tree)实现,通过放弃部分读性能换取写性能的提升。将传统的随机写文件,转换为顺序追加写文件。整个leveldb的源码实现,有很多比较巧妙的设计。例如通过分桶哈希来降低线程互斥概率、Cache中通过lru_和in_use_的区分设计避免意外清除正在被使用的数据对象、等等,在我以前写其他中间件时都有所用及。

1 整体架构

整个leveldb核心架构如下:
在这里插入图片描述
共分为上下两层:上层为内存架构、下层为文件系统架构。
当进行数据写入的时候:首先,将数据追加写入的日志文件;然后,添加到MemTable缓存中;当MemTable超过一定阈值,就会转为immutable MemTable,然后由后台线程写入到sstable文件中;
sstable文件采用分层存储,这也是为啥叫leveldb的原因,由manifest文件记录每层包含哪些文件;当有immutable MemTable或某层达到了一定条件(例如文件总大小超过一定值)就会执行向下级合并,然后就会产生新的manifest文件;current文件记录当前的manifest文件名称。
当进行数据读取的时候:先查询MemTable,若有则返回,否则,执行后续查询;然后查询immutable MemTable,若有则返回,否则,执行后续查询;经过前两步没有找到,就会优先查询level 0的sstable文件是否存在,若有则返回,否则,执行后续查询;最后依次查询level 1到6中,若存在返回,否则返回空结果。

2 设计术语

2.1 UserKey与InternalKey

在leveldb实现过程中,有两种概念的Key:UserKey与InternalKey。UserKey是leveldb调用者,在put/get/delete等操作传入的键值;由于对同一个UserKey的操作是有序的,所以InternalKey是内部UserKey加上操作序列SequenceNumber和操作类型ValueType的聚合对象。在sstable文件中,InternalKey优先按照UserKey排序,若UserKey相等,则按照SequenceNumber降序排列。

2.2 Slice

Slice又称切片,是对字节数组的片段的包装类。它并不会管理字符数组所占用内存的生命周期,主要用于防止字节数据的拷贝而影响性能。

猜你喜欢

转载自blog.csdn.net/fs3296/article/details/107783323