使用B+树优化LSM树的Tiering merge策略的读取速度
内容简介
本博文主要内容为自己对一篇论文的理解,论文将LSM树和B+Tree这两种在数据存储中最为经典高效的数据结构进行结合,使用B+树优化LSM树的Tiering merge策略的读取速度。实验结果表明,所设计的数据结构和策略可以在与tiering merge策略达到相同抑制写放大的水平的情况下,提高其读取的吞吐量。
论文信息
Jungle: Towards Dynamically Adjustable Key-Value Store by Combining LSM-Tree and Copy-On-Write B+Tree
Jung-Sang Ahn (junahn@ebay.com),
Mohiuddin Abdul Qader, Woon-Hak Kang, Hieu Nguyen, Guogen Zhang, and Sami Ben-Romdhane
Platform Architecture & Data Infrastructure, eBay Inc.
USENIX HotStorage 2019
背景
LSM-Tree
LSM树首先在内存中缓冲所有写操作,然后将它们刷新到磁盘,并使用顺序I/O合并它们。这种设计带来了许多优点,包括优越的写性能、高的空间利用率、可调性以及简化并发控制和恢复。
基本概念
LSM-Tree中的数据采用了分层(level)存储的设计,每个level中有若干个范围不重合的run,每个run中的数据有序,并且每个run有最大存储空间的限制。通常来说,高层级的level中run的范围更小,level中含有更多的run。层级level存储的数据呈指数增长。
写操作
以一个具体操作为例:
当log中的数据存满后,将会写入到level中。写入操作为找到level-0中范围存在重叠的run,并与之进行归并操作,删除重复元素。
由于当前level-0存在的run的数量超过了限制(4 > 2),因此需要选择一些run往高层级的level进行迁移。
如选择了level-0中的run3,它将与level-1中与它范围区间有交集的run进行merge。
merge后level-1的run也超出了限制,因此,选择run往高层level进行merge的操作还会继续。
通过这个例子能直观的感受到,当低层级run的数量和run中数据的数量接近或达到限制时,写操作可能会导致多个层级的run进行更新操作,并且越往高层级走,涉及到run的数量越多,造成了大量数据的读写操作。这个现象被称为写放大。