论文部分内容阅读
近年来,基于LSM-tree的键值(key-value)存储系统在数据存储领域发挥着重要作用,作为后端存储引擎被广泛部署在数据密集型应用场景下。然而,LSM-tree层次化的、高度有序的数据组织结构需要通过大量的数据合并操作维护,引起了严重的写放大问题。最近的研究工作针对系统架构提出了几类优化方案,虽然缓解了写放大问题,但是不同程度地牺牲了查询性能和空间利用率。为了获得均衡的高性能表现,本文通过分析现有系统设计中不同键值数据组织方式的性能权衡,为基于LSM-tree的键值存储系统提出一种新型架构,其核心思想是差异化地管理键值数据,以较低的写开销维护高查询性能和空间回收效率。我们基于该架构开发了DiffKV系统,主要设计分为以下两个方面:
(1)键与值的差异化管理。在键值存储系统中,key和value的组织方式对读写性能有不同影响。据此,DiffKV利用键值分离技术差异化维护key和value的有序性。首先使用LSM-tree结构存储key,利用其较强的有序性支持高效的全局索引。同时,以一种新型的、与LSM-tree松耦合的树形结构vTree存储value,通过放松对value的有序性要求来降低数据合并开销,但是仍保障在范围查询时能够有效利用外存设备的顺序读取性能。DiffKV可以根据需要动态地调整value的有序性程度,在写性能和范围查询性能间做进一步权衡。我们为vTree设计了高效的数据合并和空间回收算法,控制了vTree的写放大和空间开销,同时避免了在维护value的有序性以及回收空间时对LSM-tree发起读写请求。
(2)键值数据的分类存储。除有序性外,键值对大小也会影响系统的性能权衡。为了适应不同的键值大小分布,DiffKV进一步将外存空间组织成LSM-tree、vTree和vLogs三个模块,并将键值对根据value大小分为小、中、大三类,以不同模块管理。小键值对直接存储在LSM-tree模块,中、大键值对分别将value分离存储在vTree和vLogs模块。Value在vLogs模块中以追加写的形式存储,消除了合并开销,同时利用SSD处理大单位I/O时的高并发性能加速范围查询,从而在提升写性能的同时不影响查询性能。我们为vLogs模块设计了冷热分离的日志结构,将不常被更新的value独立存储,降低了空间回收的写开销。
上述差异化的数据管理策略在各种读写混合的应用场景下有均衡的高性能表现。我们在RocksDB的代码基础上实现了DiffKV,并通过实验与代表主流架构的系统进行了性能对比。实验结果显示DiffKV在写入、点查询、范围查询各方面相比主流系统均有最优或接近最优的性能,且空间开销较低。
(1)键与值的差异化管理。在键值存储系统中,key和value的组织方式对读写性能有不同影响。据此,DiffKV利用键值分离技术差异化维护key和value的有序性。首先使用LSM-tree结构存储key,利用其较强的有序性支持高效的全局索引。同时,以一种新型的、与LSM-tree松耦合的树形结构vTree存储value,通过放松对value的有序性要求来降低数据合并开销,但是仍保障在范围查询时能够有效利用外存设备的顺序读取性能。DiffKV可以根据需要动态地调整value的有序性程度,在写性能和范围查询性能间做进一步权衡。我们为vTree设计了高效的数据合并和空间回收算法,控制了vTree的写放大和空间开销,同时避免了在维护value的有序性以及回收空间时对LSM-tree发起读写请求。
(2)键值数据的分类存储。除有序性外,键值对大小也会影响系统的性能权衡。为了适应不同的键值大小分布,DiffKV进一步将外存空间组织成LSM-tree、vTree和vLogs三个模块,并将键值对根据value大小分为小、中、大三类,以不同模块管理。小键值对直接存储在LSM-tree模块,中、大键值对分别将value分离存储在vTree和vLogs模块。Value在vLogs模块中以追加写的形式存储,消除了合并开销,同时利用SSD处理大单位I/O时的高并发性能加速范围查询,从而在提升写性能的同时不影响查询性能。我们为vLogs模块设计了冷热分离的日志结构,将不常被更新的value独立存储,降低了空间回收的写开销。
上述差异化的数据管理策略在各种读写混合的应用场景下有均衡的高性能表现。我们在RocksDB的代码基础上实现了DiffKV,并通过实验与代表主流架构的系统进行了性能对比。实验结果显示DiffKV在写入、点查询、范围查询各方面相比主流系统均有最优或接近最优的性能,且空间开销较低。