pebblesdb
是pebblesdb的一些资料整理和总结
参考链接1 是论文
参考链接2是提到的一点介绍
而在 2017 年 SOSP 上发表的论文 PebblesDB 提出了另外一种思路。在传统 LSM-Tree 中,每一层由多个 SSTable 组成,每一个 SSTable 中保存了一组排好序 Key-Value,相同层的 SSTable 之间的 Key 没有重叠。当进行 Compaction 时,上层的 SSTable 需要与下层的 SSTable 进行合并,也就是将上层的 SSTable 和下层的 SSTable 读取到内存中,进行合并排序后,组成新的 SSTable,并写回到磁盘中。由于 Compaction 的过程中需要读取和写入下层的 SSTable,所以造成了读写放大,影响应能。
PebblesDB 将 LSM-Tree 和 Skip-List 数据结构进行结合。在 LSM-Tree 中每一层引入 Guard 概念。 每一层中包含多个 Guard,Guard 和 Guard 之间的 Key 的范围是有序的,且没有重叠,但 Guard 内部包含多个 SSTable,这些 SSTable 的 Key 的范围允许重叠。
当需要进行 Compaction 时,只需要将上层的 SSTable 读入内存,并按照下层的 Guard 将 SSTable 切分成多个新的 SSTable,并存放到下层对应的 Guard 中。在这个过程中不需要读取下层的 SSTable,也就在一定程度上避免了读写放大。作者将这种数据结构命名为 Fragemented Log-Structured Tree(FLSM)。PebblesDB 最多可以减低 6.7 倍的写放大,写入性能最多提升 105%。
和 WiscKey 类似,PebblesDB 也会多 Range Query 的性能造成影响。这是由于 Guard 内部的 SSTable 的 Key 存在重叠,所以在读取连续的 Key 时,需要同时读取 Guard 中所有的 SSTable,才能够获得正确的结果。
参考链接3pebblesdb的总结,博主写的不错
skiplist的访问选择是一种guard,将这种guard推广到lsm上,然后通过guard组织数据,允许小范围的重复,但是这种guard是很难判定的。所以借鉴意义不大,而且读数据性能肯定也会下降,insert等操作也会加剧。
参考链接3也是pebblesdb的总结,
提到一个观点
弱化全局有序,切分片段,这样实际上加重了有序对系统的影响
比如scan,读性能肯定会下降。
参考链接5 6 是代码
参考链接7是个ppt介绍。值得看一看。方便理解论文
ref
- http://www.cs.utexas.edu/~vijay/papers/sosp17-pebblesdb.pdf
- https://zhuanlan.zhihu.com/p/34455548
- https://zhuanlan.zhihu.com/p/46069535
- https://zhuanlan.zhihu.com/p/32225460
- https://github.com/utsaslab/pebblesdb
- https://github.com/xxks-kkk/HyperPebblesDB
- http://www.cs.utexas.edu/~vijay/papers/pebblesdb-sosp17-slides.pdf