初始leveldb

  • 一款key-value的存储引擎,但和Redis不同的是,leveldb会将大部分数据存储到硬盘上。
  • 底层用了 Log-Structured Merge(简称LSMtree)
  • 最大的特点就是写入速度快,主要利用了磁盘的顺序写。而其他的存储引擎利用的是随机写入B-tree.

1.LSMtree

LSM-tree是一个多层结构,但实际上还是分为内存磁盘两部分。内存的 C 0 C0 层,保存了所有最近写入的 ( k , v ) (k,v) ,这个内存结构是有序的,并且可以随时原地更新,同时支持随时查询。剩下的 C 1 C1 C k Ck 层都在磁盘上,每一层都是一个在 key 上有序的结构。

1.1 相关操作

1.1.1 写入流程

这里指的是 put(k,v) 操作.首先追加到写前日志(Write Ahead Log,简称WAL,也就是真正写入之前记录的日志)中,接下来加到 C0 层。当 C0 层的数据达到一定大小,就把 C0 层 和 C1 层合并,类似归并排序,这个过程就是Compaction(合并)。合并出来的新的 new-C1 会顺序写磁盘,替换掉原来的 old-C1。当 C1 层达到一定大小,会继续和下层合并。合并之后所有旧文件都可以删掉,留下新的。

写入过程基本只用到了内存结构,Compaction 可以后台异步完成,不阻塞写入。

1.1.2 查询流程

在写入流程中可以看到,最新的数据在 C0 层,最老的数据在 Ck 层,所以查询也是先查 C0 层,如果没有要查的 k,再查 C1,逐层查。

2. LevelDB 架构

这里参照了codedump大神的介绍图。

图中可以看到leveldb的数据存储在内存及磁盘上。红色的箭头表示合并数据的走向。

还区分读写吗?

  • memtable有最大限制 write_buffer_size,默认实现的是skiplist.
  • immutable memtable,当memtable装不下数据的时候,数据就会落到这里,而且这时数据不能再修改了。
  • sstable,全称是Sorted String Table,DB数据持久化文件 。levelDB在磁盘上存储了很多sst文件,文件里所有的key都是有序的,每个文件对应一个层级,每个层级有多个文件。

在上面这个存储层次中,越靠上的数据越新,即同一个键值如果同时存在于memtable和immutable memtable中,则以memtable中的为准。

参考资料

LSMtree基本原理及应用

解释了log部分

levelDB代码阅读笔记

发布了120 篇原创文章 · 获赞 35 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/u012328476/article/details/104218897