【大数据】LSM树,专为海量数据读写而生的数据结构

这篇具有很好参考价值的文章主要介绍了【大数据】LSM树,专为海量数据读写而生的数据结构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【大数据】LSM树,专为海量数据读写而生的数据结构,大数据,数据结构,大数据,数据结构,lsm-tree,lsm tree

目录

1.什么是LSM树?

2.LSM树的落地实现


1.什么是LSM树?

LSM树(Log-Structured Merge Tree)是一种专门针对大量写操作做了优化的数据存储结构,尤其适用于现代大规模数据处理系统,如NoSQL数据库(如Cassandra、HBase、RocksDB等)和键值存储。尽管其名称中包含“树”,但它并不直接对应于传统的树状数据结构,而是指一种数据管理策略或体系架构。

LSM为什么会出现:

当数据量大了之后,读操作采用顺序遍历来进行查找肯能是不行的,性能太低了。所以需要维护一种数据结构用来帮助提升读的效率,在关系型数据库中用B+树(索引)来维护数据的关系,便于查找。

B树和B+树详细内容可移步作者的另一篇文章,作者有个数据结构专栏,专门讲解了所有常用数据结构:

数据结构(8)树形结构——B树、B+树(含完整建树过程)_排序好的数怎么画b+树-CSDN博客

【大数据】LSM树,专为海量数据读写而生的数据结构,大数据,数据结构,大数据,数据结构,lsm-tree,lsm tree

关系型数据库中对B+树的使用在读的时候性能不错,但是在写的时候存在明显的性能问题。不是说B+树这种数据结构在写的时候存在性能问题,而是关系型数据库中是将树结构存在磁盘上的,并且树的节点在磁盘上的存储是分散的,数据的存储也是分散的,这种落地方式在面对写操作的时候会有性能瓶颈。

原因如下:

首先是写操作。写操作是容易引起B+树的结构的调整的,要调整树的结构当然要去读写树的节点,树的整个结构都存在磁盘上的,所以要走磁盘IO,调整树当然就要去对磁盘上存的树的节点进行读写,B+树在磁盘中的存储是分散的,所以这里的IO是随机IO。写数据的时候,数据也不是顺序存放的,也是分散存放的,也会是随机IO。

其次是读操作,即使B+树尽力优化了树的层高,减少了磁盘IO次数,但是毕竟树的节点和数据不是顺序写入进行存储的,所以在访问的时候还是会进行随机IO,在关系型数据库的场景下倒是没什么问题,在大数据场景下要读的数据量是海量的,海量数据都是进行随机IO的读,性能上来说也是不佳的。

所以在海量数据的写入的时候B+树不是一个优质的选择。对着大数据场景的出现,LSM树出现,用于专门应对海量数据的写入。

总结一下B+树面对海量数据无力是因为:

  • 树存在磁盘上,读写都是磁盘IO

  • 树是分散存放的,读写都是随机IO

  • 数据是分散存放的,读写都是随机IO

LSM树其实就是一套打法,核心目的就是为了规避上面的问题。

LSM树会将树结构放在内存中,从而规避磁盘IO,当然内存是有限的,到了一定条件后会将当前内存中这个版本的树存到磁盘中,存磁盘的时候开辟一块连续空间,将树的节点连续存储在一起,然后刷新内存再重新开始存新进来的内容。读的时候就会先去读内存,内存中没有再去读磁盘。由于磁盘中树的节点是连续写在一起的,会减少随机IO。

当在落磁盘的时候,磁盘上如果有历史版本的话,会和最新的历史版本进行合并。也就是说越新的历史版本,树越”茂盛“:

【大数据】LSM树,专为海量数据读写而生的数据结构,大数据,数据结构,大数据,数据结构,lsm-tree,lsm tree

2.LSM树的落地实现

LSM树的落地实现通常包含内存中的MemTable(内存表)和磁盘上的SSTable(Sorted String Table,有序字符串表)两部分。

数据首先写入内存中的MemTable,数据在memtable中就会被组织成平衡二叉树:

【大数据】LSM树,专为海量数据读写而生的数据结构,大数据,数据结构,大数据,数据结构,lsm-tree,lsm tree

当MemTable达到一定大小时,会被转换为不可变的SSTable并刷写到磁盘,写入磁盘的时候会开辟一段连续的存储空间,将树的内容连续存储在一起:

【大数据】LSM树,专为海量数据读写而生的数据结构,大数据,数据结构,大数据,数据结构,lsm-tree,lsm tree

除了上面的内容外,还有一个核心内容——Compaction,合并。

由于肯定会落多次磁盘,生成多个版本的sstable,会浪费磁盘空间,所以还会存在合并操作,将多棵小树合成一棵大树。合并的时机一般有两个:

一个时机是在落磁盘生成新的sstable的时候会和之前最新的历史版本对应的sstable进行一次合并,两棵小树合并出一棵大树来。另一个时机是磁盘的存储达到一定阈值之后多个历史版本的sstable会进行合并合并出一棵大树来。

还有最后一个问题就是如何删除LSM树中的元素?

在memtable中删除了,但是sstable中还有,直接删除是没有用的,下次合并的时候还是会把已经删除的元素合并进来。所以LSM的做法是给要删除的元素打上一个墓碑标记,墓碑标记用来标记数据被删除了,下次合并的时候就能通过墓碑标记来判断哪些元素不用合并进来。文章来源地址https://www.toymoban.com/news/detail-857693.html

到了这里,关于【大数据】LSM树,专为海量数据读写而生的数据结构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构:位图、布隆过滤器以及海量数据面试题

    1.1概念 引入 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 (1)遍历: 时间复杂度O(N) (2)排序加二分:时间复杂度O(N*logN) 其中 方法(2)是行不通 的,因为内存很难装下这么多数据(40亿整数大概为16G)。 方法(1) 可行

    2024年02月05日
    浏览(44)
  • 为HTTP而生的requests库,纵横江湖难逢敌手

    既然Python是一门全球流行的语言,那么对于网络通信的HTTP的支持肯定也是非常的优秀的。Python中原生的urllib模块也有对HTTP的支持,虽然也可以用来发送 HTTP 请求,但使用起来相对繁琐,并且 API 设计不够直观。 requests 库的出现填补了 Python 在 HTTP 请求方面的不足,简化了开发

    2024年03月09日
    浏览(43)
  • 高级数据结构与算法 | 布谷鸟过滤器(Cuckoo Filter):原理、实现、LSM Tree 优化

    如果对布隆过滤器不太了解,可以看看往期博客:海量数据处理(一) :位图与布隆过滤器的概念以及实现 布隆过滤器 局限 对于需要处理海量数据的时候,如果我们需要快速判断一条记录是否,通常会使用过滤器来进行验证,而其中最常见的就是布隆过滤器(Bloom Filter)—

    2024年02月19日
    浏览(52)
  • 【大数据存储引擎】LSM-Tree 日志结构合并树 (Log-Structured Merge Tree) 极简教程

      目录 LSM-Tree :日志结构合并树 简介 RocksDB 架构 Motivation behind LSM TreesLSM 树背后的动机

    2023年04月08日
    浏览(44)
  • 【redis】redis获取hash结构的海量数据,hgetAll、hscan、hkeys 性能大比拼

    根据上一篇文章:【Redis】 redis hash getKey getValue 两个的性能差别 我们知道hgetAll的性能是极差的,然后我们优化成hkeys的,但是hkeys真的好吗? 下面我们来说一下我们的现场,就是现场我们

    2024年01月22日
    浏览(34)
  • [数据结构-1]:环形buffer以及读写同步

    目录 一、什么是环形buffer 二、环形buffer的优点与使用场合 三、环节buffer的读写同步 3.1 基本原理 3.2 代码示例 环形缓冲区(Circular Buffer)也被称为环形队列(Circular Queue)或循环缓冲区,是一种数据结构,用于在固定大小的缓冲区中存储和处理数据。 环形缓冲区的特点是首

    2024年03月11日
    浏览(53)
  • Redis缓存读写策略(三种)数据结构(5+3)

    Cache Aside Pattern 是我们平时使用比较多的一个缓存读写模式,比较适合读请求比较多的场景。 写 : 先更新 db 然后直接删除 cache 。 读  : 从 cache 中读取数据,读取到就直接返回 cache 中读取不到的话,就从 db 中读取数据返回 再把数据放到 cache 中。 在写数据的过程中,可以先

    2024年02月12日
    浏览(39)
  • MySQL一主一从、配置一主多从结构、数据读写分离

    部署mysql主从同步 配置mysql主从 分为主数据库角色(master)、从数据库服务器角色(slave) 网站服务器连接后存储数据的服务器作为主服务器 自动同步主服务器上的数据 192.168.88.53 做master 启用binlog日志文件 指定server_id 重启服务 用户授权 查看正在使用的binlog日志文件 192.

    2024年01月19日
    浏览(38)
  • Tuxera NTFS for Mac是一款专为Mac用户设计的读写NTFS格式硬盘的神器

    Tuxera NTFS for Mac: 让Mac用户更加高效 Mac电脑因其稳定性和易用性而备受欢迎。然而,Mac电脑与Windows电脑不同,它的文件系统是HFS+,而不是NTFS。这意味着Mac用户在与NTFS文件系统的外部存储设备,例如USB驱动器和硬盘,交互时可能会遇到一些问题。为了解决这个问题,Tuxera推出

    2024年04月28日
    浏览(45)
  • Tecplot数据结构——结构数据(结构网格)与非结构数据(非结构网格)

    结构数据可以是一维、二维或三维的,下面以二维的数据格式为例。 在记事本中写入以下字符,并将文件以.plt或.dat为后缀命名。 其中数据总数为I*J=20,结构数据顺序为point格式,顺序为:(I,J)=(1,1), (I,J)=(2,1), … (I,J)=(Imax,1), (I,J)=(1,2), (I,J)=(2,2), (I,J)=(Imax,2), … (I,J)=(Imax,Jmax).

    2024年02月15日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包