一文多图,彻底弄懂LSM-Tree

news2024/11/16 7:47:40

一文弄懂LSM-Tree

LSM-Tree是什么?在这里插入图片描述

LSM-Tree(Log Structured Merge Tree)是一种数据结构,它被设计用于处理大量写入操作的场景,常见于许多NoSQL数据库中,如BigTable、Cassandra、RocksDB和LevelDB等。

LSM-Tree的核心思想是将所有的更新操作(包括插入、删除和修改)都转换为追加写操作,从而充分利用磁盘顺序写性能远高于随机写性能的特性。
在这里插入图片描述

在LSM-Tree中,数据被分为内存组件和硬盘组件两部分。内存组件通常包含一个或多个MemTable,这些MemTable以某种有序的数据结构(如跳表或红黑树)存储数据。当MemTable达到一定大小后,它会被写入到磁盘上,成为不可变的MemTable,并且新的写入操作会进入一个新的MemTable。

硬盘组件由不同级别的SSTable(Sorted String Table)组成,这些SSTable是不可变的,并且按照层次结构存储。SSTable中的数据是有序的,当执行读取操作时,系统会先在MemTable中查找数据,如果不在MemTable中找到,则会按照从最新到最旧的顺序在SSTable中查找。

LSM-Tree的写入操作是高效的,因为它们只涉及追加操作,不需要像B+树那样需要找到数据在磁盘上的确切位置并进行更新。删除操作在LSM-Tree中通常不是通过物理删除数据来实现的,而是通过写入一个删除标记来表示该数据已被删除。读取操作可能会涉及多个层次的查找,因为数据可能存在于多个SSTable中。

为了减少读取操作的开销,LSM-Tree会定期进行合并(Compaction)操作,合并过程中会删除过时的数据,并将新的数据版本合并到更低层次的SSTable中。这个过程有助于减少读取操作时需要检查的SSTable数量,并且可以回收磁盘空间。

总的来说,LSM-Tree非常适合写入密集型的应用场景,因为它优化了写入操作的性能,但可能会牺牲一些读取性能。通过内存和磁盘上的分层存储,以及定期的数据合并,LSM-Tree能够提供高效的数据存储解决方案。

LSM-Tree原理

在这里插入图片描述

该图来源 https://www.cnblogs.com/zxporz/p/16021373.html

写操作:
在这里插入图片描述

图片来源:Stefan Richter Flink Forward 2018

插入操作只需要单纯的向memtable插入键值对。如果memtable已经存在对应索引键,那么变为更新操作。

可以看到LSM tree插入操作非常快,只需要在memtable中插入一条数据即可。复杂度无论是skiplist还是红黑树结构都是O(logN)。

1.WAL(预写日志):所有写操作首先记录到WAL中,确保数据的持久性和一致性。

2.Memtable:WAL操作完成后,数据(键值对)写入内存中的Memtable,通常使用跳表或红黑树等有序数据结构,以便快速访问和保持数据有序。

3.Immutable Memtable:当Memtable达到一定大小后,它会被冻结成Immutable Memtable,新写入的数据进入新的Memtable,保证写操作的连续性和性能。

4.Minor Compaction:Immutable Memtable会定期写入磁盘,形成SSTable的level 0层。SSTable由有序的键值对和索引组成,优化了磁盘的顺序写性能。

5.Major Compaction:随着时间的推移,level 0的SSTable数量增多,会触发Major Compaction。多个SSTable被归并合并,形成更大的SSTable并移动到更高的层级,释放空间并减少查询时需要遍历的SSTable数量。

修改流程:

更新数据在memtable中我们直接更新即可。如果不在内存,我们就直接插入新的键值对。

1.WAL:修改操作首先记录到WAL。

2.Memtable:在Memtable中找到对应的键并进行修改,如果键不存在则作为新键插入。

3.Immutable Memtable & Minor Compaction:随着数据的积累,Immutable Memtable会被创建并最终写入磁盘的SSTable。

4.Major Compaction:在后续的合并过程中,新的键值对会替换掉旧的键值对。

删除流程:

删除操作无论我们的数据在不在内存中都只是插入一个“墓碑标记”。

1.WAL:删除操作首先记录到WAL。

2.Memtable:在Memtable中找到对应的键并标记为删除(tombstone),如果键不存在则直接插入一个删除标记。

3.Immutable Memtable & Minor Compaction:删除标记随着Immutable Memtable写入磁盘的SSTable。

4.Major Compaction:在后续的合并过程中,被标记删除的键会被真正删除。

读操作:
在这里插入图片描述

1.查询Memtable:首先,在内存中的Memtable中查找所需的键。Memtable通常是一个有序的数据结构,如跳表或红黑树,这使得查找操作相对高效。

2.查询Immutable Memtable:如果Memtable中未找到键,接下来会在Immutable Memtable中查找。Immutable Memtable是Memtable满了之后冻结的版本,它也存储在内存中,但不允许修改。

3.查询L0层SSTable:如果前两步都没有找到键,接下来会在磁盘上的L0层SSTable中查找。L0层可能包含多个SSTable,因为每个Immutable Memtable写入磁盘时都会生成一个新的SSTable。由于这些SSTable可能包含重叠的键,所以需要遍历所有L0层的SSTable。

4.查询非L0层SSTable:如果数据不在L0层,接下来会按照层级从L1到LN查询。在非L0层,由于使用了Level Compaction策略,每个层级的SSTable都是全局有序的,并且一个键在每一层中最多只出现一次。因此,只需要遍历一个SSTable来确定键是否存在。

L0层可能有重叠的键

当Memtable达到一定大小后,它会被写入到磁盘上,变成L0层的一个SSTable。由于写操作是持续进行的,可能会有多个Memtable同时存在,当它们分别变成SSTable并写入到L0层时,就可能出现键的重叠。这是因为:

并发写入:多个Memtable可能同时被写入磁盘,每个Memtable转换成的SSTable可能包含相同的键。
未合并:L0层的SSTable是直接从Memtable转换来的,它们还没有经过合并(Compaction)过程,所以这些SSTable中的键可能还没有被整理过,即存在多个版本的同一个键。

非L0层全局有序

非L0层(L1, L2, …,LN)的SSTable是通过合并L0层或更低层的SSTable形成的。在合并(Compaction)过程中,这些层的SSTable会被组织成全局有序的:
归并排序:在Compaction过程中,系统会将多个SSTable归并排序,确保同一个键的所有版本都被合并,并且只保留最新的版本。
层次结构:每一层的SSTable都是全局有序的,意味着在整个层级中,每个键只会出现一次。这是因为在Compaction过程中,旧版本的键会被删除,只保留最新的键。
分层存储:每一层的SSTable数量和大小通常有限制,当达到这个限制时,会触发Compaction,将当前层的SSTable与下一层的SSTable合并,形成新的、更大的SSTable,并且移动到下一层。

举例说明

假设我们有一个键 A,其值在系统中被更新了三次,分别在不同的Memtable中:
Memtable1:A -> value1
Memtable2:A -> value2
Memtable3:A -> value3
当这些Memtable被写入磁盘时,它们会变成L0层的SSTable,可能如下所示:
SSTable_L0_1:A -> value1
SSTable_L0_2:A -> value2
SSTable_L0_3:A -> value3
这时,L0层的SSTable中键 A 是重叠的,因为它们包含 A 的不同版本。
随后,Compaction过程会被触发,将L0层的SSTable合并成一个新的SSTable,并且移动到L1层:
SSTable_L1_1:A -> value3
在L1层,键 A 是全局有序的,因为只保留了最新的版本 value3。
这样,查询操作在L0层需要检查所有SSTable以找到最新的版本,在非L0层则只需要检查一个SSTable即可。

合并策略

SSTable有两种合并策略:
Leveling Merge Policy:
每个level仅有1个组件,L0和L1合并,合并到L1中;
由于组件较少,查询性能较高,LevelDB和RocksDB使用该策略;

Tiering Merge Policy:
每个Level有N个组件,合并后生成Level+1的一个新组件;
由于可以降低合并的频率,写入性能较高;
在这里插入图片描述

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

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

相关文章

废品回收小程序:回收更加便捷!

在日常生活中,废品回收已经成为了一种常见事,随着电商的快速发展,居民难免会产生大量的废纸盒等可回收物,以及在日常生活中产生的其他回收物, 目前,废品回收市场也发生了改革,传统的“叫卖”方…

MySQL高阶1990-统计实验的数量

目录 题目 准备数据 分析数据 总结 题目 写一个 SQL 查询语句,以报告在给定三个实验平台中每种实验完成的次数。请注意,每一对(实验平台、实验名称)都应包含在输出中,包括平台上实验次数是零的。 结果可以以任意…

C++之STL—常用查找算法

- find //查找元素 - find_if //按条件查找元素 - adjacent_find //查找相邻重复元素 - binary_search //二分查找法 - count //统计元素个数 - count_if //按条件统计元素个数 find (iterator begin, …

衡石分析平台系统管理手册-功能配置之全局 JS 设置

全局 JS 设置​ 衡石系统提供了全局 JS 设置功能,用户可以通过自定义 JS 代码实现系统的个性化需求,如使用第三方统计工具对系统平台的 PV 、UV 进行监测。 使用场景​ 场景1:增加百度统计​ 下图示例中使用 js 代码引用了百度网站统计功…

SUP-NeRF-ECCV2024: 单目3D对象重建的新突破

2024-09-25,由Bosch Research North America和Michigan State University联合发布的SUP-NeRF,是一个基于单目图像进行3D对象重建的新型方法。一个无缝集成姿态估计和物体重建的统一网格。 ECCV:欧洲计算机视觉会议的缩写,它是计算…

免费好用!AI声音克隆神器,超级简单,10秒就能克隆任何声音!(附保姆级教程)

今天下午还有读者问: 有没有能克隆声音的 AI 工具? 其实剪映很早就上了克隆声音的功能。 只需要按要求朗读例句,或者上传本地的音视频文件,就可以克隆声音了。 操作非常简单,效果也不错,可以试试。 除了…

数据库软题4-关系代数转SQL语言

题1 因为是笛卡尔积 <ABCD CDE> <1234 567> 笛卡尔积 RxS FROM R&#xff0c;S题2 题3 题4 题5

day-62 每种字符至少取 K 个

思路 滑动窗口&#xff1a;改变思路&#xff0c;从左右两边取字符&#xff0c;是a b c三个字符至少被取k次&#xff0c;那么意味着如果我们知道字符串中a b c的出现个数&#xff0c;那么可以知道取走后剩下子串a b c的个数&#xff0c;问题转化为了求最长子串 解题过程 如果a …

java项目开发团队分配管理软件

需求&#xff1a; 该软件实现以下功能&#xff1a; 软件启动时&#xff0c;首先进入登录界面进行注册和登录功能。 当登陆成功后&#xff0c;进入菜单&#xff0c;首先就可以对开发人员账户和密码进行修改。 然后可以对开发人员进行增删改操作 人员添加成功后&#xff0c;根据菜…

传奇GEE引擎版本如何封挂?GEE引擎设置简单的封挂脚本教程

网关参数设置gee引擎封挂脚本 1、打开M2-选项-参数设置-游戏速度 把所有的设置限速关闭 2、打开M2-选项-客户端设置-内挂控制-速度控制&#xff1a;移动速度 攻击速度 魔法速度 设置好参数&#xff0c;一旦设置不要修改 否则封挂网关参数需重新设置 打开M2-选项-功能设置-…

【C++算法】栈

删除字符中的所有相邻重复项 题目链接 删除字符中的所有相邻重复项https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/description/ 算法原理 代码展示 class Solution { public:string removeDuplicates(string s) {string ret;for(int i 0; i &l…

C# 的枚举(Enum)应用说明

一.Enum的定义&#xff1a; 枚举是一组命名整型的常量。枚举类型是使用 enum 关键字声明的&#xff0c;它是值类型。枚举包含自己的值&#xff0c;且不能继承或传递继承。 二.声明 enum 变量&#xff1a; 声明枚举的一般语法&#xff1a; enum <enum_name> { enumerati…

Harbor使用

文章目录 1、上传镜像1.1、在Harbor上创建一个项目1.2、docker添加安全访问权限1.3、推送docker镜像到该项目中1.3.1、登录到Harbor1.3.2、给镜像重新打一个标签1.3.3、推送镜像到Harbor中 2、拉取镜像2.1、先删掉原来的镜像2.2、执行拉取命令 1、上传镜像 需求&#xff1a;将…

[Python]什么是K-Means均值聚类算法?

K-Means均值聚类分析是一种无监督学习算法&#xff0c;用于将数据集分成k个簇&#xff08;cluster&#xff09;&#xff0c;其中每个簇的成员在某种意义上是相似的。算法的目标是找到质心&#xff08;centroid&#xff09;&#xff0c;使得每个点到其最近质心的距离之和最小。通…

【科研小小白】理解图片容量、像素、尺寸、分辨率各自含义、 像素、分辨率与实际尺寸之间的转换关系

理解图片容量、像素、尺寸、分辨率各自含义&#xff1a; 通过之前的学习&#xff0c;我们知道了图片有这4个参数&#xff0c;下面给大家总结一这下4个参数的具体含义。 1、容量&#xff08;占内存&#xff09;&#xff1a;是指图像文件的存贮空间&#xff0c;也就是文件的大小…

职场基本功:情绪管理的行动指南(前置情绪管理)

文章目录 引言情绪管理的目标情绪产生的阶段前置情绪管理避免情绪失控的技巧案例分析引言 成熟的职场人,必备的五项技能: 管理自己的情绪:职场需要你的行为是可控的,只有情绪是稳定的,其他人才能顺利地跟你展开协作。称赞他人:赞赏能让你获得一个友好的交流环境求助他人…

lte sss加扰序列c产生 MATLAB和c语言实现

参考3GPP 36.211 今日给大家介绍一下LTE SSS信号产生过程中加扰序列c的产生过程以及用MATLAB 和 c语言给大家实现一下&#xff1a; 加扰序列c产生过程如下&#xff1a; 1 首先产生公共的序列x的生成 X的初始值 两个加扰序列c0和c1 c语言实现 void lte_sss_gen_c(char *c,u…

Zlibrary安装包下载与使用

文章目录 Zlibrary安装包下载与使用一 写在前面网盘链接1 百度网盘链接2 夸克网盘链接3 阿里云盘 二 安装1 Windows系统2 安卓3 苹果电脑端4 Linux系统Ubantu的下载与安装 三 Zlibrary的使用四 写在最后 Zlibrary安装包下载与使用 2024年9月27日下午4点 一 写在前面 1 Zlibr…

智慧农业案例 (一)- 自动化机械

橙蜂智能公司致力于提供先进的人工智能和物联网解决方案&#xff0c;帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、领域知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能&…

Ubuntu环境下字体安装

本文介绍Ubuntu环境下字体安装。 软件&#xff08;如Qt应用软件&#xff09;开发过程中经常会涉及到字体的选择&#xff0c;有时候Ubuntu环境下并没有我们想要的字体&#xff0c;本文介绍常用字体及在Ubuntu环境下如何安装。 1.常用开源字体 有些字体商用并不是免费的&#…