论文解读:LSM Tree 的魔力,提升写入吞吐量的高效数据存储结构

news2024/9/29 3:31:04

LSM Tree是一种用于高写入吞吐量的数据库存储引擎,广泛应用于现代分布式数据库系统。其核心思想是将写入操作缓存在内存中,并定期批量写入磁盘,减少磁盘 I/O 操作,提高写入性能。因其高效的写入性能和适应大规模数据的能力,成为现代数据密集型应用的关键技术之一。

LSM-tree主要由三部分组成:Memtable、SSTable和WAL(Write-Ahead Log)。数据首先写入内存中的Memtable,当Memtable满了,就会将其转化为只读的SSTable存储在磁盘上。同时,WAL 记录了每次写操作,以确保数据的可靠性。

WAL是一种非常重要的数据库技术,在很多数据库中我们都可以见到其身影,核心思想是将事务操作先记录到磁盘的日志文件中,然后在批量写入物理存储,我一直觉得,LSM-tree中连续批量写入数据到SSTable的思想,本身就跟WAL的思想有很相似的地方。

图片

"The log-structured merge-tree (LSM-tree)" by Patrick O'Neil是LSM Tree的开创性论文,介绍了LSM Tree的基本结构和设计理念。

论文首先将LSM树和数据库中传统使用的B树索引结构进行的对比,LSM树大大减少了磁盘臂的移动,从而提高了数据写入的成本性能,其最大优势在于写入性能。通过批量写入和合并操作,它能够高效地处理大量写请求,适用于写密集型应用场景。

传统的B树就像是将每本书都按顺序放到书架上,这样查找起来很方便,但每次放书都要找到合适的位置,费时费力。而 LSM树则不同,它更像是先把书随手放到一个临时箱子里(Memtable),等箱子满了再一次性分类整理到书架上(SSTable)。

LSM树的核心组建和运作机制

LSM树由两个或多个类似树形的数据结构组成,其中较小的结构(C0)完全驻留在内存中,而较大的结构(C1及其以上)则存储在磁盘上。

当新的历史记录插入时,首先将其索引信息插入到C0树中,然后通过一个称为“滚动合并”的算法将索引信息迁移到C1树。滚动合并过程中,C0树中的部分索引信息被删除并与C1树中的索引信息合并,最终将合并后的数据写入磁盘。

滚动合并算法的步骤如下:首先读取包含 C1 树叶子节点的多页块,然后读取该块中的磁盘页,将其与 C0 树叶子层中的条目合并,并创建一个新的合并后的 C1 树叶子节点。

每次合并步骤都会产生一个空块(包含尚未合并的条目)和一个满块(包含合并后的条目)。满块会被写入磁盘,而空块则保留在内存中,以备后续合并步骤使用,磁盘上所有块都是满的,这是LSM树和B树非常不同的地方。

C1 树的目录节点也存储在内存中,用于高效地访问叶子节点。目录节点会定期刷新到磁盘,以确保数据持久性。

class LSMTree:
    def __init__(self):
        self.memtable = Memtable()
        self.wal = WAL()
        self.sstables = []

    def insert(self, key, value):
        # 写入WAL以确保数据可靠性
        self.wal.append((key, value))
        # 写入 Memtable
        self.memtable.put(key, value)
        # 检查Memtable是否已满
        if self.memtable.is_full():
            # 将Memtable持久化为SSTable
            new_sstable = self.memtable.to_sstable()
            self.sstables.append(new_sstable)
            self.memtable.clear()

LSM树的更多操作

在进行查找时,系统会首先在C0树中查找,如果找不到,则会在 C1 树中查找。

  def get(self, key):
      # 首先在Memtable中查找
      value = self.memtable.get(key)
      if value is not None:
          return value
      # 如果未找到,再依次在SSTable中查找
      for sstable in reversed(self.sstables):
          value = sstable.get(key)
          if value is not None:
              return value
      return None

删除操作通过标记删除状态实现,实际删除会在合并过程中进行:

    def delete(self, key):
        # 在WAL中记录删除操作
        self.wal.append((key, None))
        # 在Memtable中标记删除
        self.memtable.put(key, None)

LSM树的更新操作可以通过先删除再插入来实现。

成本性能和数据模型

文章中提到的 “The Five Minute Rule” 是一种评估内存和磁盘之间数据访问成本效益的规则。它指出,当页面引用频率超过每 60 秒一次时,使用内存缓存页面可以减少磁盘IO,从而降低系统开销。

论文中深入的比较了B树和LSM树的性能差异,本文略过这个部分,更多关注点放在LSM树的工作机制上。

数据温度反映了数据被访问的频率,根据数据温度,可以决定数据最佳的存储方式。将磁盘模型划分为冷数据、温数据和热数据三个区

冷数据是访问频率极低,几年以上才会访问的旧数据,磁盘容量是主要瓶颈,用磁盘存储,可以最大化空间利用率;

温数据的访问频率适中,几天时间访问一次,需要平衡磁盘臂利用率和磁盘空间,用内存缓冲区来缓存频繁使用的数据页,可以减少磁盘IO;

最后是访问频率极高的热数据,每秒几十次访问,内存成本是主要瓶颈,应该放在内存中,最大化访问速度。

我们在日常业务应用开发中,设计缓存和选择数据存储引擎的时候,也应该参考数据温度,针对不同访问频率,决定如何存储和查询特定的数据。

图片

多页块IO

LSM树使用滚动合并的方式将内存中的索引条目迁移到磁盘上的索引中。滚动合并过程中,每次合并多个索引条目到磁盘上的一个页面中,从而实现批量读写。它的磁盘索引结构采用 100% 填充的页面节点,并使用连续的多页块存储,进一步优化磁盘访问效率。

多页块I/O是LSM树的核心优势之一,它通过批量读写、减少磁盘访问成本和提高磁盘访问效率等方式,有效地提升了LSM树的性能。

降低磁盘访问成本的原理,是因为多页块 I/O 可以一次性读写多个页面,从而减少磁盘臂的移动次数,降低寻道时间。一次性读写多个连续页面,减少旋转次数,从而降低旋转延迟。多页块I/O还可以利用磁盘的连续存储空间,减少磁盘碎片

然而,多页块I/O也存在一些局限性,例如内存占用和写放大问题。

多组件LSM树

以上我们谈论的LSM树都是单组件的,当C0组件相对于C1组件变得非常大时,会导致内存成本过高。为了解决这个问题,可以引入多组件LSM树,其中包含C0、C1、C2、…、Ck-1和Ck等多个组件,组件大小依次递增。每个组件都是一个索引树结构,其中C0组件是内存驻留的,而所有其他组件都是磁盘驻留的。

多组件LSM树中,每个组件都有一个大小参数S(Ci);根据一个恒定的插入率R,向C0组件中插入字节;当某个组件的大小超过阈值时,该组件的条目会通过滚动合并迁移到下一个更大的组件,直到所有条目迁移到Ck。

多组件LSM树有几个优势,通过增加组件数量,将C0组件的大小进一步扩大,每个合并步骤中合并到C1组件的条目数量会更多,就提高了批处理效率,减少了磁盘的IO;通过将C0组件的大小最大化,可以减少所需的内存容量,从而降低内存成本;通过合理分配组件大小,确保磁盘IO速率始终保持在较高水平。

▲ LevelDB中LSM-tree的实现

论文中还花很多篇幅,对比了LSM树和B树还有其他存储结构,并且讨论了LSM树的并发恢复机制,本文重点放在工作机制,所以没有展开讨论相关的内容。

总结

LSM-tree在处理大规模、高并发数据写入方面表现优异,为现代数据库管理系统提供了强大的支持,在很多知名的互联网数据库中有着广泛的应用;例如LevelDB、RocksDB、Apache Cassandra。

随着新型硬件的发展,LSM树的研究也在不断推进。例如,结合NVMe SSD等高性能存储介质,可以显著提高 LSM树的读写性能。

深入了解其工作机制,有助于我们更好地理解如何优化存储性能的思想,在业务开发中,也可以运用这些思想,解决存储性能问题。

论文解读:LSM Tree 的魔力,提升写入吞吐量的高效数据存储结构icon-default.png?t=N7T8https://mp.weixin.qq.com/s/7iD6JdrmG8jBi1QC4pbUHQ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1980535.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

医院客户满意度调查如何开展

深圳满意度咨询有限公司(SSC)(患者第三方满意度测评)服务于国内多家医院,辅助医院提高患者满意度、改善医德医风、提高服务水平,调查项目覆盖了国内150余个城市,通过电话调查、网络问卷、现场访…

图片搜索网站,有大量高清图片,避免版权纠纷

一、简介 1、一个图片搜索网站,所有图片均遵循CC0协议,用户可以免费用于商业用途而无需标注来源。网站上有大量高清图片,基本可以满足用户的各种需求,同时避免了法律风险。提供强大的筛选功能,用户可以按图片方向、尺寸…

python学习之路 - python的函数

目录 一、python函数1、函数介绍2、函数的定义3、函数的参数4、函数的返回值5、函数说明文档6、函数的嵌套调用7、变量的作用域8、综合案例9、函数与方法的区别 二、python函数进阶1、函数多返回值2、函数多种传参方式a、位置参数b、关键字参数c、缺省参数d、不定长参数 3、匿名…

Visual Studio 调试时加载符号慢

什么是调试符号 编译程序时生成的一组特殊字符,并包含有关变量和函数在生成的二进制文件中的位置以及其他服务信息的信息。 该数据集可用于逐步调试程序或检查第三方代码。 调试符号可以添加到可执行文件或库中,但是大多数现代编译器将它们存储为单独的…

fabricjs 实现图像的二值化功能

一、效果图 二、图像二值化的作用 二值化是图像处理中常用的一种方法,其作用是将灰度图像转换为二值图像,即将图像中的像素点根据其灰度值分成两类:黑色和白色。这种处理方法可以帮助我们更清晰地识别图像中的目标,简化图像的复杂…

Lumerical 光纤模式仿真

Lumerical 光纤模式仿真 引言正文步骤 1------创建光纤的纤芯设置名称,位置及尺寸参数设置材料参数旋转结构使其朝向 x 方向放置步骤2------创建包层结构设置名称,位置及尺寸参数设置材料参数旋转结构使其朝向 x 方向放置设置透明度,是我们能够看到纤芯结构设置 FDE Solver设…

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——4Bin模型转化过程

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——4Bin模型转化过程 ​ 大家好,经过前几期的介绍,对于X3派上的Yolo模型部署,我们已经可以进行到最后一步了 ​ 今天给大家带来,转模型的关键步骤&#xff0…

苹芯科技发布新AI模型,引领全球轻量级AI应用革命

苹芯科技,一家在全球AI技术领域中不断创新的公司,于2月28日宣布推出其最新研发的轻量级AI模型。这款新模型旨在为开发者和企业提供更高效、更易访问的人工智能工具,尤其强调在数据敏感和计算资源受限的环境下的应用潜力。 在谷歌刚刚推出Gemm…

普元MDM主数据管理系统与微软Dynamic CRM系统(新加坡节点)集成案例

一、项目背景 某工程机械集团是中国工程机械产业奠基者、开创者和引领者,是工程机械行业具有全球竞争力、影响力的千亿级龙头企业。公司主要指标始终稳居中国工程机械行业第1位 客户需要将物料和配件等主数据和海外系统进行对接,由SAP PO在中间对接海…

【开发视角】大模型 RAG 检索增强生成究竟是什么

【大白话讲懂】大模型 RAG 检索增强生成 话先说在前面,本文不讲不会讲太多原理,仅面向工程开发,从工作流程的宏观角度进行梳理,旨在快速上手。 RAG 是什么 基本定义 让我们先来解释名词,看看宏观框架。 RAG 的意思…

Opencv调用yolov5的onnx文件时报错记录

Opencv调用yolov5的onnx文件时报错记录 报错内容: Error: Unspecified error (> Node [Powai.onnx]:(onnx_node!/model.24/Pow) parse error: OpenCV(4.6.0) F:\opencv-4.6.0\opencv-4.6.0\modules\dnn\src\onnx\onnx_importer.cpp:601: error: (-215:Assertio…

C++ vector的基本使用(待补全)

std::vector 是C标准模板库(STL)中的一个非常重要的容器类,它提供了一种动态数组的功能。能够存储相同类型的元素序列,并且可以自动管理存储空间的大小,以适应序列大小变化,处理元素集合的时候很灵活 1. vector的定义 构造函数声…

西安电子科技大学2025届毕业生生源信息

2025届本科毕业生专业分布一览表 2025届硕士毕业生专业分布一览表 2025届博士毕业生专业分布一览表 2025届本科毕业生生源地分布 左右滑动查看更多 2025届硕士毕业生生源地分布 2025届博士毕业生生源地分布

小红书笔试-选择题

HTTP/2.0默认长连接。选B ABC 一个类可以实现多个接口,一个接口可以继承一个或多个接口: 这是正确的。Java 支持多重继承的变体,即一个类可以实现多个接口,以获取多个接口中定义的方法。同时,一个接口可以通过 extends…

假如家里太大了,wifi连不上了怎么办

最近有个土豪朋友抱怨,他家里太大了,一个路由器的Wi-Fi信号根本无法覆盖他们家的每个房间,都没办法上网看奥运会比赛了。(还好我是穷人,就没有这种烦恼T_T)。 然后我问他为何不用一个路由器作主路由器&…

安卓常用控件ListView

文章目录 ListView的常用属性ListView的常用APIListView的简单使用 ListView是一个列表样式的 ViewGroup,将若干 item 按行排列。它是一个很基本的控件也是 Android 中最重要的控件之一。它可以实现多个 View 的垂直排列并支持滚动显示效果。 ListView的常用属性 常…

数论——绝对素数、素数筛法、埃氏筛法、欧拉筛法、最大公约数

绝对素数 绝对素数是指一个素数在其十进制表示下&#xff0c;无论是从左向右读还是从右向左读&#xff0c;所得到的数仍然是素数。 例如&#xff0c;13 是一个素数&#xff0c;从右向左读是 31&#xff0c;31 也是素数&#xff0c;所以 13 是一个绝对素数。 #include <io…

小红书无货源选品逻辑和爆品思路(图文解析)

了解用户的购物习惯、需求偏好以及日常搜索行为&#xff0c;是选品的重要前提。选品不是嘴巴一张这么简单的事情&#xff0c;是需要通过长期积累及网感来分析。记住&#xff1a;人-货-场&#xff0c;这个原则。比如明知道小红书上的年前女性用户多&#xff0c;你偏偏来卖一台挖…

悠易科技周文彪:创始人专注度很重要,一旦战略分散无法形成合力 | 中国广告营销行业资本报告深访④

周文彪&#xff08;悠易科技CEO&#xff09; 问&#xff1a;近年来广告营销行业主要的融资事件发生在营销技术领域。您对此有何评论&#xff1f; Roy&#xff1a;Adtech最早从2007年前后开始发展&#xff0c;差不多十年的时间&#xff0c;因为广告技术帮助企业成长&#xff0c…

【时时三省】unity test 测试框架 使用 code blocks 移植(核心文件:unity.c, unity_fixture.c)

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 目录 1&#xff0c;移植介绍 2&#xff0c;使用 Code::Blocks 17.12 创建工程 3&#xff0c;搬移文件入工程目录 4&#xff0c;更改代码 5&#xff0c;向工程添加文件 6&#xff0c;运…