这几天都在看leveldb的原理,但是并没有仔细考虑过这种设计的好处以及为什么要这么设计?所以,自己想简单总结一下。
动机
这一部分主要参照了这个链接[LevelDB 的原理和动机]
为什么写硬盘?
持久化,这也是有别于redis的区别,因为后者狂吃内存,我们现在用leveldb的原因也就是在于,内存村不下这么多的用户搜索历史。log文件的作用是什么?为什么要设计这个文件?
为了快速写入硬盘, 必须采用追加方式顺序写到 log 文件. 这导致 log 文件中的数据是无序的,但这也是为什么leveldb具有很好的写性能。为什么要设计sst文件?
为了快速从硬盘中读取数据, 基于查找算法和局部性原理考虑, 必须将数据排序重新组织到 sst 文件中.如果说log文件是为了快速写,那么设计sst文件的目的就是为了读操作而生。- 为什么要多个sst文件,而不是一个就搞定?
- 使用多个sst,每个sst文件内部都是按key排序的,不同的sst没有交叉(level0)除外,这样可以先快速定位在哪个sst文件,再进行查找。
- 为什么要level?
- 这个应该是leveldb的精华,并且我了解还利用了lsm这种数据结构?我自己的感觉是,采用分层的结构,可以简化数据的查找。为了减少 log 文件合并所影响的 sst 文件个数, 将 sst 按层次组织, 层次越深, 文件数量越多. 最坏的情况, 每一次合并都会修改该层次所有的 sst 文件. 而层次越深, 合并发生的概率越小。