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

目录

1.什么是LSM树?

2.LSM树的落地实现


1.什么是LSM树?

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

LSM为什么会出现:

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

img

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

原因如下:

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

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

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

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

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

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

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

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

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

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

2.LSM树的落地实现

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

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

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

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

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

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

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

在memtable中删除了,但是sstable中还有,直接删除是没有用的,下次合并的时候还是会把已经删除的元素合并进来。所以LSM的做法是给要删除的元素打上一个墓碑标记,墓碑标记用来标记数据被删除了,下次合并的时候就能通过墓碑标记来判断哪些元素不用合并进来。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java--数据结构】“从扑克到程序:深入探讨洗牌算法的原理与魅力“

前言 以下是学习Java顺序表的一个实例应用———简单的洗牌算法。 欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 前言 定义每张扑克牌的属性 生成一副扑克牌(不包含大小王) 洗牌方法 发牌方…

AI视频下载:零基础2小时学会开发 Chrome扩展程序

无论您是有抱负的Web开发人员、AI爱好者还是生产力黑客,本课程都提供了宝贵的见解和实践经验,帮助您利用AI和Chrome扩展的力量来简化Web自动化,改善各个行业和领域的用户体验,解锁AI驱动生产力的潜力! 此课程面向以下…

如何计算加速开发的实际价值

投资回报率(ROI)已成为在企业中引进工具、方法或者策略时必须考虑的关键指标。 尽管如此,在某些情况下,ROI 很容易衡量,而在其他情况下,则往往只衡量结果——金钱。这种评估角度是有效且必要的&#xff0c…

K-means聚类算法:如何在杂乱无章的数据中找出规律?

什么是K-means聚类算法? 在编程的世界里,K-means聚类算法就像一位无私的指路人,它不需要我们给出明确的指示,只需要我们提供数据,它就能帮助我们找到数据的归属,找到数据的“家”。 K-means聚类算法的名字…

石化盈科PMO总经理任志婷受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 石化盈科信息技术有限责任公司运营管理部总经理兼PMO总经理任志婷女士受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾,演讲议题为“组织级项目管理的初心和使命——打造卓越的IT企业PMO”。大会将于5月25-26日在北京举办,…

碳课堂|什么是碳市场?如何进行碳交易?

近年来,随着全球变暖问题日益受到重视,碳达峰、碳中和成为国际社会共识,为更好地减缓和适应气候变化,同时降低碳关税风险,以“二氧化碳的排放权利”为商品的碳交易和碳市场应时而生。 一、什么是碳交易、碳市场 各国…

BootStrap框架学习

1、BootStrap是一套现成的css样式集合 中文文档:www.bootcss.com 响应式布局:pc端,手机端都可适配 特点:集成了html,css,javascript工具集,12列格网,基于jquery, 下载:http://v3…

【大语言模型LLM】- Meta开源推出的新一代大语言模型 Llama 3

🔥博客主页:西瓜WiFi 🎥系列专栏:《大语言模型》 很多非常有趣的模型,值得收藏,满足大家的收集癖! 如果觉得有用,请三连👍⭐❤️,谢谢! 长期不…

在 Slurm 上运行 Jupyter

1. 背景介绍 现在的大模型训练越来越深入每个组了,大规模集群系统也应用的愈发广泛。一般的slurm系统提交作业分为2种,一种是srun,这种所见即所得的申请方式一般适用于短期的调试使用,大概一般允许的时间从几个小时到1天左右&…

使用 FFMPEG 实现录屏和录音

FFmpeg 是一个非常强大的开源工具,它可以用来处理音频和视频。 要使用 FFmpeg 进行录屏和录音,需要首先确保你的系统已经安装了 FFmpeg。在大多数 Linux 发行版中,可以通过包管理器(如 apt 或 yum)来安装。在 Windows …

Linux复习提纲2

Linux复习提纲 Linux概述 shell:交互式命令解释程序;用户和内核间交互的桥梁Shell不仅是交互式命令解释程序,还是一种程序设计语言shell是一种命令解释程序,批处理shell是linux的外壳,默认是bash2.1 Linux基础概念 log…

2024深圳杯(东三省)数学建模挑战赛D题:音板的振动模态分析与参数识别思路代码成品论文分析

​ 更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓ https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 问题重述 深圳杯(东三省)数学建模挑战赛2024D题:音板的振动模态分析与…

【iOS开发】(五)react Native路由和导航20240421-22

【iOS开发】(五)react Native 路由和导航Navigation 20240421 在(一)(二)中我们 Reactnative搭建了开发环境、学习了 基础语法、状态管理,JSX、组件、状态和生命周期以及样式布局等。 在(三)&a…

2024 OceanBase 开发者大会:OceanBase 4.3正式发布,打造PB级实时分析数据库

4月20日,2024 OceanBase开发者大会盛大召开,吸引了50余位业界知名的数据库专家和爱好者,以及来自全国各地的近600名开发者齐聚一堂。他们围绕一体化、多模、TP与AP融合等前沿技术趋势展开深入讨论,分享场景探索的经验和最佳实践&a…

STM32H750外设ADC之动态低功耗特性

目录 概述 1 模式实现(AUTDLY) 2 自动注入模式 (JAUTO1) 3 AUTDLY 模式 4 实现案例 概述 本文主要介绍STM32H750外设ADC之动态低功耗特性相关的内容。包括:模式实现(AUTDLY)、自动注入模式 (JAUTO1)、 AUTDLY 模…

【1646】医院人员管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 医院人员管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

力扣经典150题(3)

文章目录 17.电话号码的字母组合77.组合46.全排列74.搜索二维矩阵215.数组中的第K个最大元素 17.电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相…

金融风控信用评分卡建模(Kaggle give me credit数据集)

1 数据预处理数据 数据来源于Kaggle的Give Me Some Credit,包括25万条个人财务情况的样本数据 1.1 导包读数据 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.ensemble import RandomForestRegressor import seaborn as …

STM32 学习13 低功耗模式与唤醒

STM32 学习13 低功耗模式与唤醒 一、介绍1. STM32低功耗模式功能介绍2. 常见的低功耗模式(1)**睡眠模式 (Sleep Mode)**:(2)**停止模式 (Stop Mode)**:(3)**待机模式 (Standby Mode)**: 二、睡眠模式1. 进入…

Android视角看鸿蒙第十二课-鸿蒙的布局之相对布局RelativeContainer

Android视角看鸿蒙第十二课-鸿蒙的布局之相对布局RelativeContainer 导读 相对布局和线性、层叠布局一样都是类似于Android布局的,之前两篇文章已经了解线性、层叠布局的使用方法,这篇文章一起来学习下鸿蒙中的相对布局。 之前的文章中,我偶…
最新文章