30.2 不得不谈的lsm:分层结构和lsm数据结构

本节重点介绍 :

  • LSM树核心特点
  • LSM树的核心结构
    • MemTable
    • Immutable MemTable
    • SSTable
  • LSM树的Compact策略
    • size-tiered 策略
    • leveled策略

LSM树(Log-Structured-Merge-Tree)

  • LSM树的名字往往会给初识者一个错误的印象,事实上,LSM树并不像B+树、红黑树一样是一颗严格的树状数据结构
  • 它其实是一种存储结构,目前HBase,LevelDB,RocksDB这些NoSQL存储都是采用的LSM树

核心特点

  • LSM树的核心特点是利用顺序写来提高写性能,但因为分层(此处分层是指的分为内存和文件两部分)的设计会稍微降低读性能
  • 但是通过牺牲小部分读性能换来高性能写,使得LSM树成为非常流行的存储结构。

LSM树的核心思想

lsm.png

如上图所示,LSM树有以下三个重要组成部分:

  1. MemTable

    • MemTable是在内存中的数据结构,用于保存最近更新的数据,会按照Key有序地组织这些数据
    • LSM树对于具体如何组织有序地组织数据并没有明确的数据结构定义,例如Hbase使跳跃表来保证内存中key的有序。
    • 因为数据暂时保存在内存中,内存并不是可靠存储,如果断电会丢失数据,因此通常会通过WAL(Write-ahead logging,预写式日志)的方式来保证数据的可靠性。
  2. Immutable MemTable

    • 当 MemTable达到一定大小后,会转化成Immutable MemTable
    • Immutable MemTable是将转MemTable变为SSTable的一种中间状态
    • 写操作由新的MemTable处理,在转存过程中不阻塞数据更新操作
  3. SSTable(Sorted String Table)
    lsm_sstable.png

    • 有序键值对集合,是LSM树组在磁盘中的数据结构
    • 为了加快SSTable的读取,可以通过建立key的索引以及布隆过滤器来加快key的查找
    • 更新操作
      • 这里需要关注一个重点,LSM树(Log-Structured-Merge-Tree)正如它的名字一样,LSM树会将所有的数据插入、修改、删除等操作记录(注意是操作记录)保存在内存之中,当此类操作达到一定的数据量后,再批量地顺序写入到磁盘当中
      • 这与B+树不同,B+树数据的更新会直接在原数据所在处修改对应的值,但是LSM数的数据更新是日志式的,当一条数据更新是直接append一条更新记录完成的
      • 这样设计的目的就是为了顺序写,不断地将Immutable MemTable flush到持久化存储即可,而不用去修改之前的SSTable中的key,保证了顺序写。
    • 因此当MemTable达到一定大小flush到持久化存储变成SSTable后,在不同的SSTable中,可能存在相同Key的记录,当然最新的那条记录才是准确的。这样设计的虽然大大提高了写性能,但同时也会带来一些问题:
      1. 冗余存储,对于某个key,实际上除了最新的那条记录外,其他的记录都是冗余无用的,但是仍然占用了存储空间。因此需要进行Compact操作(合并多个SSTable)来清除冗余的记录。
      2. 读取时需要从最新的倒着查询,直到找到某个key的记录。最坏情况需要查询完所有的SSTable,这里可以通过前面提到的索引/布隆过滤器来优化查找速度。

LSM树的Compact策略

从上面可以看出,Compact操作是十分关键的操作,否则SSTable数量会不断膨胀。在Compact策略上,主要介绍两种基本策略:size-tiered和leveled。

不过在介绍这两种策略之前,先介绍三个比较重要的概念,事实上不同的策略就是围绕这三个概念之间做出权衡和取舍。

三个重要概念

  1. 读放大:读取数据时实际读取的数据量大于真正的数据量
    • 例如在LSM树中需要先在MemTable查看当前key是否存在,不存在继续从SSTable中寻找。
  2. 写放大:写入数据时实际写入的数据量大于真正的数据量
    • 例如在LSM树中写入时可能触发Compact操作,导致实际写入的数据量远大于该key的数据量。
  3. 空间放大:数据实际占用的磁盘空间比数据的真正大小更多
    • 上面提到的冗余存储,对于一个key来说,只有最新的那条记录是有效的,而之前的记录都是可以被清理回收的。

size-tiered 策略

lsm_size_tried.png

  • size-tiered策略保证每层SSTable的大小相近,同时限制每一层SSTable的数量
  • 如上图,每层限制SSTable为N,当每层SSTable达到N后,则触发Compact操作合并这些SSTable,并将合并后的结果写入到下一层成为一个更大的sstable。
  • 由此可以看出,当层数达到一定数量时,最底层的单个SSTable的大小会变得非常大
  • 并且size-tiered策略会导致空间放大比较严重。即使对于同一层的SSTable,每个key的记录是可能存在多份的,只有当该层的SSTable执行compact操作才会消除这些key的冗余记录。

leveled策略

lsm_level_compact.jpg

  • leveled策略也是采用分层的思想,每一层限制总文件的大小
  • 但是跟size-tiered策略不同的是,leveled会将每一层切分成多个大小相近的SSTable
  • 这些SSTable是这一层是全局有序的,意味着一个key在每一层至多只有1条记录,不存在冗余记录
  • 之所以可以保证全局有序,是因为合并策略和size-tiered不同,接下来会详细提到。

lsm_sstable.png

合并过程

假设存在以下这样的场景:

  1. L1的总大小超过L1本身大小限制:lsm_compact_01.png

  2. 此时会从L1中选择至少一个文件,然后把它跟L2有交集的部分(非常关键)进行合并。生成的文件会放在L2:

    • lsm_compact_02.png
    • 如上图所示,此时L1第二SSTable的key的范围覆盖了L2中前三个SSTable,那么就需要将L1中第二个SSTable与L2中前三个SSTable执行Compact操作。
  3. 如果L2合并后的结果仍旧超出L2的阈值大小,需要重复之前的操作 —— 选至少一个文件然后把它合并到下一层:lsm_compact_03.png

  4. lsm_compact_04.png

  • leveled策略相较于size-tiered策略来说,每层内key是不会重复的
  • 即使是最坏的情况,除开最底层外,其余层都是重复key,按照相邻层大小比例为10来算,冗余占比也很小
  • 因此空间放大问题得到缓解。但是写放大问题会更加突出。举一个最坏场景,如果LevelN层某个SSTable的key的范围跨度非常大,覆盖了LevelN+1层所有key的范围,那么进行Compact时将涉及LevelN+1层的全部数据。

总结

  • LSM树是非常值得了解的知识,理解了LSM树可以很自然地理解Hbase,LevelDb等存储组件的架构设计
  • ClickHouse中的MergeTree也是LSM树的思想,Log-Structured还可以联想到Kafka的存储方式。
  • 虽然介绍了上面两种策略,但是各个存储都在自己的Compact策略上面做了很多特定的优化,例如Hbase分为Major和Minor两种Compact,这里不再做过多介绍,推荐阅读文末的RocksDb合并策略介绍。

本节重点总结 :

  • LSM树核心特点
  • LSM树的核心结构
    • MemTable
    • Immutable MemTable
    • SSTable
  • LSM树的Compact策略
    • size-tiered 策略
    • leveled策略

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

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

相关文章

宏观经济学笔记

【拯救者】宏观经济学速成 国民生产总值GNP: GNP 衡量一国(地区)成员在一定时期内运用生产要素所生产的全部最终产品和服务的市场价值。凡是本国国民所 创造的收入,不管生产要素是否在国内,都计入本国GNP中。 GDP本国居民在本国创造的价值外国居民在本国…

模块二:central cache实现

一、central cache介绍 结构也是一个哈希桶,大小划分和 thread cache哈希桶一样,区别在于挂的不是自由链表而是 span 链表,里面连接了许多 span 二、span介绍 1、实现思路 span 就是 central cache 向 page cache 申请的大块内存&#xff…

D-FINE:在DETRs模型中将回归任务重新定义为细粒度分布优化

晚上回家看到一篇新颖的研究内容, 也是目标检测相关的《D-FINE: REDEFINE REGRESSION TASK IN DETRS AS FINE-GRAINED DISTRIBUTION REFINEMENT》 ,原文地址在这里,如下所示: 如果想进一步了解相关的研究工作建议移步阅读原英文论…

数据结构 ——— 链式二叉树oj题:单值二叉树

目录 题目要求 手搓一个单值二叉树 代码实现 题目要求 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时,才返回 true;否则返回 false 手搓一个单值二叉树 代码演示: // 数据类…

使用Windbg排查C++软件安装包安装时被安全防护软件拦截导致安装线程堵塞卡住的问题

目录 1、问题描述 2、初步分析 3、将Windbg附加到安装包进程上进行分析 4、在Windbg中查看相关变量的值,并设置断点进行动态调试 4.1、在Windbg中查看相关变量的值 4.2、在Windbg中使用bp命令设置断点进行动态调试 5、腾讯电脑管家已经退出,但其…

一键直达Windows11精简版下载地址:附快速安装教程!

许多用户想知道Windows11精简版下载地址在哪里?这里系统之家小编将给大家分享最新的Windows11精简版系统下载地址,方便大家下载与安装。该版本系统删除大量不必要的组件和功能,让系统运作速度变得更快更流畅,但没有过度精简&#…

Mesh网格

Mesh(网格) 定义:Mesh 是一个包含顶点、三角形、顶点法线、UV坐标、颜色和骨骼权重等数据的对象。它定义了3D模型的几何形状。 功能: 顶点(Vertices):构成3D模型的点。 三角形(Triangles)&…

【机器学习】28. 强化学习(Bellman, Q-learning, DQN, 优先级经验回放)

强化学习 定义强化学习的核心要素马尔可夫决策过程价值函数Bellman 方程Q Learning深度Q学习算法 (DQN)DQN 的核心思想DQN 的工作流程经验回放:(随机抽样)目标网络:损失函数 优先级经验回放(Pri…

大数据-217 Prometheus 安装配置 启动服务 监控服务

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

利用RANSAC算法拟合平面并生成包围框的点云处理方法,点云聚类、质心坐标、倾斜角度、点云最小外接矩形

该代码用于分析和处理点云数据,通过对点云数据进行裁剪、平面拟合和生成包围框来提取特定区域的特征并发布结果。主要使用了RANSAC算法来识别并拟合平面,从而提取平面的法向量,接着根据该平面计算出该区域的最小矩形包围框(Boundi…

算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝

大佬们好呀,这一次讲解的是二叉树的深度搜索,大佬们请阅 1.前言 ⼆叉树中的深搜(介绍) 深度优先遍历(DFS,全称为DepthFirstTraversal),是我们树或者图这样的数据结构中常⽤的⼀种…

深入解析DHCP带来了什么功能,服务器回应到底是用广播还是单播呢?

前言 不知道大家在看到这个图的时候第一时间想到的是什么,【好复杂】【看不懂】【终端数好多】,这里不看整体的结构怎么样,来看看终端数量都非常的多,终端要与网络中进行通信,势必需要IP地址,从最开始学习到…

<项目代码>YOLOv8 棉花识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

知乎日报前三周总结

目录 前言 首页 网络请求 上拉加载 详情页 加载WebView 左右滑动 主页与详情页同步更新 总结 前言 在这几周进行了知乎日报的仿写,这篇博客来总结一下前三周仿写的内容 首页 首页的界面如图所示,其实就是一个导航栏和一个数据视图组成的&#…

小白快速上手 labelimg:新手图像标注详解教程

前言 本教程主要面向初次使用 labelimg 的新手,详细介绍了如何在 Windows 上通过 Anaconda 创建和配置环境,并使用 labelimg 进行图像标注。 1. 准备工作 在开始本教程之前,确保已经安装了 Anaconda。可以参考我之前的教程了解 Anaconda 的…

【算法】【优选算法】二分查找算法(上)

目录 一、二分查找简介1.1 朴素二分模板1.2 查找区间左端点模版1.3 查找区间右端点模版 二、leetcode 704.⼆分查找2.1 二分查找2.2 暴力枚举 三、Leetcode 34.在排序数组中查找元素的第⼀个和最后⼀个位置3.1 二分查找3.2 暴力枚举 四、35.搜索插⼊位置4.1 二分查找4.2 暴力枚…

自己构建ARM平台DM8镜像

??? 为什么不使用官方提供的docker版本,测试有问题,分析函数不能使用,报错。 自己构建ARM平台的dm8镜像,参考 https://gitee.com/xlongfu/dm-docker/tree/master,发现一些问题 首先…

Linux之实战命令73:at应用实例(一百零七)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…

万字长文解读【深度学习面试——训练(DeepSpeed、Accelerate)、优化(蒸馏、剪枝、量化)、部署细节】

🌺历史文章列表🌺 深度学习——优化算法、激活函数、归一化、正则化深度学习——权重初始化、评估指标、梯度消失和梯度爆炸深度学习——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总万字长文解读…