论文部分内容阅读
基于日志结构合并树(Log-Structured Merge-tree,LSM-tree)的键值(Key-Value,KV)存储系统因其高性能和高扩展性得到了广泛的应用。由于LSM-tree键值存储采用异地更新,其不同层可能会存有同一个键(key)的不同版本键值对数据。LSM-tree键值存储通过对数据进行Compaction(归并排序)删除失效数据(除快照以外的旧版本键值对数据)。然而,每次Compaction只能根据参与的局部数据确定并删除部分失效数据,这可能导致失效数据长期滞留在系统中并多次参与Compaction,在影响系统读写性能的同时占用了系统的存储空间。对于数据更新分布均匀的应用而言,这些失效数据对系统产生的影响是不容忽视的。针对上述问题,设计并实现了全局失效数据感知的键值存储系统Gida DB(Global Invalid Data Awareness Database)。Gida DB根据LSM-tree内存只读组件中较新的数据,查找LSM-tree各层SSTable(Sorted String Table)中的旧数据,并将结果存储在旧数据信息表中。Gida DB并行执行查找旧数据与刷写内存只读组件,以减少旧数据查找带来的额外延迟。在Compaction时,Gida DB读取旧数据信息表用于检测参与Compaction的SSTable文件中的旧数据,并结合快照信息,识别并删除SSTable文件中的失效数据,从而减少失效数据多次参与Compaction引起的额外I/O,并减少失效数据带来的额外空间占用。测试结果表明,与Level DB相比,Gida DB的写放大降低了25.1%、写吞吐量提升了25.4%、空间占用减少了34.3%、读延迟减少了19.6%。在Level DB基础上同时部署Gida DB方案与最新写放大优化方案ALDC,与ALDC相比,Gida-ALDC的写放大减少10.7%、写吞吐量提升了8.9%、空间占用减少了22.1%、读延迟减少了13.0%,说明Gida DB方案能在一定程度上进一步提高ALDC方案的空间利用率和读写性能。