论文导读 | 对于LSM Tree的一系列优化工作

2023-11-10 21:22

本文主要是介绍论文导读 | 对于LSM Tree的一系列优化工作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

研究背景

LSM Tree是Log-Structured Merge Tree的缩写。作为一种多层级的数据结构,LSM相Tree对于其他有序的数据结构,比如有序列表,LSM Tree具有更新快,访存效率高等特点。如今被应用在很多需要大量存储访问和更新的场景中。

LSM Tree由L层的有序数组构成。随着层数增多,每一层有序数组(Run)的大小也会成倍扩展。LSM Tree分为Leveled和Tiered两种构造。Leveled结构中,每一层只有一个Run;而在Tiered结构中,每一层存在T个Run。

Leveled与Tiered的更新方式也不同。如图所示,当Leveled的一层数据存满后,这一层数据会向下和下一层数据合并。而Tiered的一层数据存满后,这一层数据会进行合并,然后和下一层数据平行储存。因此Leveled结构的查询复杂度低,而更新复杂度高;而Tiered的更新复杂度低,而查询复杂度相对较高。

 

LSM Tree通常会把主要数据结构储存在Secondary Storage当中,比如SSD硬盘。而在内存里,会保留每一层储存数据的索引信息,从而提高访存效率。如图中所示,所有的Run会被分成页,然后在内存中储存这些页的上线界和指针(FP)。这样一次访存就可以从SSD中获得需要的数据。同时对于每一个Run,LSM Tree都会建立一个Bloom Filter(BF)。通过BF可以判断查询的元素是否存在于LSM Tree中。使用BF可以减少访存次数。

SIGMOD 2017. Best of SIGMOD 2017

这篇论文提出了在以往的LMS Tree中,每个Run的BF大小和数组大小的比例相同,这样保证了每个BF都拥有相同的假阳性率。如果一个元素不在LSM Tree当中,每一次BF的假阳性,我们就需要访问一次SSD。查询获得空结果的访存代价,由每个BF的假阳性率相加决定。

由于FP的存在,无论Run的大小有多大,我们都只需要进行一次访存。但是由于LMS Tree随着层数增长,每一层的大小在成倍扩大。如果要维持相同的假阳性率,BF的大小也要成倍扩大。如果给定内存空间,那么降低下层假阳性率,要比降低上层假阳性率,更有效率。

因此在Monkey这个数据结构中,不再维持每一层BF相同的假阳性率,而是成倍降低假阳性率,在最高几层可以取消BF。如图所示:

利用Monkey的设计,在有限的内存空间里,可以更高效地利用BF的筛选作用,大大降低访存次数,提高数据结构的查询性能。

SIGMOD 2018

对于LSM Tree,Leveled结构的查询复杂度低,而更新复杂度高;而Tiered的更新复杂度低,而查询复杂度相对较高。这篇论文,为了平衡两种结构的优缺点,提出了Lazy Leveling的合并策略。

Lazy Leveling在前n-1层,都使用Tiering的合并策略,尽在最后的第n层,使用leveling的策略。如图所示,使用了Lazy Leveling策略后,与Leveling相比,在点查询,大范围查询两项,Lazy Leveling都拥有相同的复杂度。在小范围查询Leveling复杂度更低,而在合并操作中,Lazy Leveling更有优势。与Tiering相比,除了合并操作,另外三个查询操作Lazy Leveling都有更低的复杂度。因此Lazy Leveling可以实现更平衡的性能。

在Lazy Leveling的基础上,本篇论文又提出了流动的LSM Tree构造。如图所示,流动的LSM Tree中,定义了两个参数K和Z。K是非最后一层中每一层的有序列表数,而Z则是最后一层的有序列表数。如果K=Z=1,则为Leveled结构;如果K=Z>1,则为Tiered结构;如果K>1且Z=1,则为Lazy Leveling结构。用户可以根据工作负载的不同,来选取最合适的参数值,从而获得最好的性能。

SIGMOD 2021

随着SSD性能的提升,对于硬盘内数据的访问渐渐不再是LSM Tree的唯一瓶颈。在现实当中,比较庞大的LSM Tree可能拥有数十上百层,每一层最多可能拥有数百个Run。当我们在进行查询时,对每一个Run都要进行BF的查询。数千BF的查询正在成为新的性能瓶颈。下图为不同策略下,I/O的复杂度:

因此在本篇论文中,作者提出了使用Cuckoo Filter(CF)来取代BF的策略Chucky。Chucky使用一个CF来取代所有的BF。在CF的每一个位置上,会储存一个hash指纹,和这个元素在LSM Tree中的位置。当我们查询的时候,只需要查询CF一次,即可获得元素的储存位置,而不再需要查询大量的BF。

通过使用CF,可以把LSM Tree的I/O的复杂度降低为:

在CF中,每一个位置都要存储元素所在Run的位置。为了降低CF的内存开销,文章提出了一个压缩思路:下层的每个Run的空间更大,因此储存的数据也最多。因此在CF中下层的指针出现次数也最多。如果我们对所有的指针编码,下层的编码较短,上层编码较长,那么就能更好地利用空间。

本文采用了霍夫曼编码,对于每一个Run的指针,按照出现的概率,也就是Run的大小占总空间的比例,来进行编码。从而实现了上层Run编码长,下层Run编码短的编码结果。

为了进一步压缩空间,本文还使用了组合的方式,将相邻两个元素组合在一起进行编码:

但这种编码带来了新的问题,由于每个元素所在的Run指针编码不同,导致无法对其。本文采用了可变动的指纹策略。由于下层Run指针编码短,因此下层储存的元素hash指纹较长,通过可变的hash指纹长度,实现了CF的对齐。

这篇关于论文导读 | 对于LSM Tree的一系列优化工作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/385336

相关文章

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

MySQL中优化CPU使用的详细指南

《MySQL中优化CPU使用的详细指南》优化MySQL的CPU使用可以显著提高数据库的性能和响应时间,本文为大家整理了一些优化CPU使用的方法,大家可以根据需要进行选择... 目录一、优化查询和索引1.1 优化查询语句1.2 创建和优化索引1.3 避免全表扫描二、调整mysql配置参数2.1 调整线程数2.