论文原文:https://www.usenix.org/system/files/fast19-kaiyrakhmet.pdf
摘要:
本文调查了如何利用新出现的可按照字节寻址的持久化内存(Persistent Memory)来增强KV存储的性能。
我们充分利用PM,提出了一种新型的KV存储,SLM-DB,这种存储同时利用到了B+树索引和LSM-tree的优点。
我们提出的SLM-DB这种架构,具有更高的读性能和写性能,同时拥有很低的写放大和接近理想最优状态的读放大。
在SLM-DB中,我们利用持久化内存来保存B+树的索引,利用LSM树把新插入的KV对保存在持久化内存的缓冲区中。
SLM-DB仅有一层KV对组织在磁盘上,同时执行选择性的compaction来保证KV对是充分有序的,以便于范围查询更快。
我们经验丰富的研究证明,默认配置下,同LevelDB相比,SLM-DB同样情况下的范围查询性能,
拥有1.07-1.96倍的读带宽和1.56-2.22倍的写带宽。
-
简介
KV存储已经成为高效支撑不同的数据密集型应用,例如网页索引,社交网络,电子商务和云照片等的关键组件。
分别基于B树和LSM树的两款典型KV存储都已经被大范围的使用。例如基于B树的存储和数据库,KyotoCabinet支持快速读取和范围查询。
然而,基于B树的KV存储展现了差的写性能,这主要是因为总是发生多次少量的随机写磁盘,
以及由于总是需要动态保持数据结构的平衡性而产生较大的写放大。因此,他们更适合读密集负载。
而基于LSM树的KV存储则被更好的优化以便于支持写密集负载,例如BigTable, LevelDB, RocksDb和Cassandra。
基于LSM树构建的KV存储之所以能支持高写带宽,主要是由于将键值数据缓存在内存中,并批量顺序写入磁盘。
然而,这样的存储拥有很大的缺陷,如很高的读写放大和很低的读性能,这是由于LSM树是一种拥有多层文件的数据结构,
并且其中的键值对为了保证更快的查询,经常做合并和排序。
最近,对数据密集型应用同时拥有高性能读写能力的需求日益增长。雅虎,已经报道了在他们典型负载中,读写比例越来越相近的潮流。
因此,优化KV存储同时拥有高读写性能变得非常重要。
支持字节寻址,非易失性的内存如PCM,自旋转移矩MRAM和3D XPoint等已经为提升内存和存储系统的性能,提供了新的机会。
研究指出,持久化内存拥有和DRAM相似的读性能,更高的写时延(最高5倍)和更低的带宽。持久化内存相比DRAM,拥有更大的容量和密度。
然而,持久化内存更被希望用来和HDD和SSD混布。比较典型的,对于大规模KV存储,数据仍然存储在磁盘上,同时持久化存储用来提升性能。
需要重点指出的是,已经有早期的尝试,针对持久化内存,设计一个基于LSM树的KV存储。
然而,研究如何在基于混合部署持久化内存和硬盘的新型KV存储系统中,
持久化内存可以承担一个更重要的角色而不局限于大型的内存写buffer或读缓存,对实现更优越的性能来说,仍然是非常重要的。
在本文中,我们研究如何利用持久化内存来提升KV存储的性能。我们提出了一种新型的KV存储,SLM-DB,通过利用持久化内存,
同时吸纳了B+树索引和LSM树实现的优点。SLM-DB同时拥有非常高的读写性能,并拥有较低的写放大和接近理想状态的读放大。
在SLM-DB中,我们利用B+树来存储索引键值对。利用持久化的B+树索引,我们可以加速查询key(而不需要布隆过滤器)。
为了保持高的写带宽,我们利用LSM树组织新插入的键值对插入持久化内存的写buffer,完全消除前台写log的同时提供数据持久化。
在SLM-DB中,键值对存储在单层组织的磁盘文件中。由于SLM-DB可以充分利用B+树来查询,就没有必要保证键值对是有序的,
这大幅度的降低了写放大。然而,过时的键值对需要gc。同时SLM-DB也需要存储在磁盘上的键值对保证一定程度的顺序性,
以便于提供更好的范围查询性能。因此,SLM-DB也设计了可选compaction计划,在单层上执行严格合并键值对。本文的主要贡献包括:
我们设计了一款单层KV存储,保留了通过LSM树实现的高写带宽性能,同时集成了B+树来索引键值对。
另外,我们通过持久化内存容纳新插入的键值对,避免了对磁盘的前台写log放大。
对于可选compaction,我们设计了3种计划,基于1)活跃键占文件比例,2)B+树叶子节点被扫描次数,3)范围查询的顺序性程度。
我们实现了基于LevelDB的SLM-DB并集成了B+树实现。SLM-DB被设计为即便系统发生故障,单层LSM树和B+树也可以保证数据一致性。
我们使用db_bench中的microbenchmarks和YCSB对应现实工作负载。我们经验丰富的研究证明,默认配置下,同LevelDB相比,SLM-DB同样情况下的范围查询性能,
拥有1.07-1.96倍的读带宽和1.56-2.22倍的写带宽,同时仅仅只有LevelDB的39%的磁盘写IO平均数量。这篇论文剩下的部分组织如下。第二章讨论了LSM树存在的读性能差和读写放大比例过高的问题以及持久化内存在KV存储中的应用。
第3章提出了SLM-DB的设计和实现。第四章讨论了KV存储操作是如何基于SLM-DB实现的。第五章讨论了SLM-DB如何在系统故障的情况下恢复。
第六章评估了SLM-DB的性能,展示了我们的性能测试结果。第7章讨论了持久化内存的成本和并行化。第八章讨论了相关的工作。最后第九章总结了本文。 -
背景和愿望