【分布式存储】数据存储和检索~LSM

news2024/11/27 8:22:37

在数据库领域,B+树拥有无可撼动的地位,但是B+树的缺点就是在写多读少的场景下,需要进行大量随机的磁盘IO读写,而这个性能是最差的。并且在删除和添加数据的时候,会造成整个树进行递归的合并、分裂,数据在磁盘上也不是连续的。所以会不断的随机写入操作。

所以针对这个问题,如何在写多读少的场景下提升性能,LSM就是为了解决这个问题。
LSM(Log Structure Merge Tree)比B+树更适合写多读少的场景。
主要原理LSM通过批量的合并写数据,减少磁盘旬道的开销。

早期LSM Tree

C0-tree 是存储在内存中,而C1-tree是存储在磁盘中。
在这里插入图片描述
核心流程是:先将数据写入到C0-tree,当C0-tree数据写入到一定的阈值时,然后开始批量将数据合并和覆写,因为可以批量写入,所以写入磁盘可以进行顺序写入,避免单次的随机写操作。

现代的LSM-tree也是通过内存维护有序结构,然后延迟写入磁盘的时机,通过合并多次随机写操作。降低磁盘移动的开销。
所以在写多读少的场景下,比B+树能获得更多的性能。

现代 LSM Tree

包含三部分,memtable、immutable memtable、SSTable,前两个在内存中,后一个在磁盘中。先将数据写入到memtable、然后在合适的时机写入到SSTbale中。
在这里插入图片描述
其实仔细一想,如果数据都在内存中,那么一旦出现断电或者机器宕机,那么内存中的数据就会丢失?LSM如何来防止出现数据丢失呢
很简单,其实就是利用WAL机制,也就是同步写入到内存中的时候,同步写入到磁盘中一份,因为是是以追加append Only的方式存储,所以可以在一定程度提写数据的性能。

1.Memtable
memtable存储的是近期最新的数据记录,一般使用跳表或者哈希等实现。可以快速的删除和查找。
2.Immutable Table
在memtable达到一定的量级之后,然后会进行数据的合并,好处是一个可以快速的进行顺序写入磁盘中,另一个通过数据副本的方式,memtable可以继续提供服务。
3.SSTable
在这里插入图片描述
包含两部分一个是索引文件,另一个就是数据文件。
写入数据的时候,会按照一个segment为一段,直接将最新的数据追加。那样的话,从尾部查询最后一条数据就是最新的数据。但是这样极端情况下,可能多个数据存储多次,造成磁盘的浪费。并且重复数据多的话,查询效率很差,但是可以利用布隆过滤器进行优化。
在这里插入图片描述

压缩数据
压缩数据,其实就是将多个segment合并成一个新的segment,图中最新的dog是84,所以dog:52在合并之后就不存储了。
在这里插入图片描述
删除数据
删除数据的时候,其实不删除真实数据,而是逻辑删除,通过标记位tombstone。如果存在就代表数据被删除,否则数据存在。
在这里插入图片描述

小结

本篇主要为了解决在B+树中读少写多而带来的数据合并和分裂,引入了LSM,LSM的核心其实就是将数据分为两部分,一部分在内存中,定时更新到磁盘,使用WAL机制来保证数据不丢失。所以在写多读少的场景下,可以通过使用LSM结构进行构建分布式存储结构。

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

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

相关文章

frp实现内网穿透(超详细!)

一、 frp简介 FRP是Fast Reverse Proxy的缩写,它是一款开源、高性能、跨平台的内网穿透工具。FRP允许您通过安全地穿透NAT和防火墙来访问您的本地服务器,以便您可以从任何地方访问您的应用程序和服务。它的工作方式是将来自互联网的请求转发给本地网络中…

Linux命令200例:stat用于显示文件或文件系统的状态信息

🏆作者简介,黑夜开发者,全栈领域新星创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 &…

Flutter:简单搞一个内容高亮

内容高亮并不陌生,特别是在搜索内容页面,可以说四处可见,就拿掘金这个应用而言,针对某一个关键字,我们搜索之后,与关键字相同的内容,则会高亮展示,如下图所示: 如上的效果…

2004-2021年全国31省市场分割指数数据(原始数据+计算过程+最终结果+方法说明)

2004-2021年全国31省市场分割指数数据(原始数据计算过程最终结果方法说明) 1、时间:2004-2021年 2、来源:统计年鉴和国家统计局 3、指标:市场分割指数、食品类商品零售价格指数(上年100)、饮料、…

Java基础(十一)快速排序

4. 快速排序 >> 快速排序的思想 快速排序(QuickSort)是一种高效的排序算法,基于分治策略。它的原理可以概括为以下步骤: 选择一个基准元素(pivot),通常选择数组中的一个元素作为基准。…

Linux知识点 -- 进程概念(补充)

Linux知识点 – 进程概念(补充) 文章目录 Linux知识点 -- 进程概念(补充)一、进程地址空间的堆区二、虚拟地址到物理地址之间的转化三、虚拟地址到物理地址之间的映射 一、进程地址空间的堆区 在用户每次使用malloc等函数在进程的…

c高级:day4

1.思维导图 2.shell函数获取uid和gid,并用变量接 #!/bin/bashfunction fun() {read -p "输入用户名" necho uid:id -u $necho gid:id -g $n } afun echo $a3.冒泡、选择和快排代码整理 /**************************************************************…

MQTT宝典

文章目录 1.介绍2.发布和订阅3.MQTT 数据包结构4.Demo5.EMQX 1.介绍 什么是MQTT协议 MQTT(消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协…

opencv实战项目 手势识别-手势音量控制(opencv)

本项目是使用了谷歌开源的框架mediapipe,里面有非常多的模型提供给我们使用,例如面部检测,身体检测,手部检测等。 手势识别系列文章 1.opencv实现手部追踪(定位手部关键点) 2.opencv实战项目 实现手势跟踪…

探索 C++ 标准库:std::string 库函数用法示例

目录 引言 一、构造函数 1.1 string() 1.2 string (const string& str) 1.3 string (const string& str, size_t pos, size_t len npos) 1.4 string (const char* s) 1.5 string (const char* s, size_t n) 1.6 string (size_t n, char c)​ 二、容…

剑指offer11-20

文章目录 11.旋转数组的最小数字12.矩阵中的路径13.机器人的运动范围15.二进制中1的个数16.数值的整数次方17.打印从1到最大的n位数(待写)18.删除链表的节点19.正则表达式匹配(好难)20. 没意义算了 11.旋转数组的最小数字 肯定不是…

【Git】—— 标签管理

目录 (一)理解标签 1、作用 (二)创建标签 (三)操作标签 1、删除标签 2、推送标签 3、删除远程标签 (一)理解标签 标签 tag ,可以简单的理解为是对某次 commit 的…

C++11时间日期库chrono的使用

chrono是C11中新加入的时间日期操作库,可以方便地进行时间日期操作,主要包含了:duration, time_point, clock。 时钟与时间点 chrono中用time_point模板类表示时间点,其支持基本算术操作;不同时钟clock分别返回其对应…

Jenkins 监控dist.zip文件内容发生变化 触发自动部署

为Jenkins添加plugin http://xx:xx/manage 创建一个任务 构建触发器 每3分钟扫描一次,发现指定文件build.zip文件的MD5发生变化后 触发任务

脚本一键生成通用接口,一分钟实现增删改查

直接使用无需看此配置 快速生成通用接口业务配置 : https://blog.zysicyj.top/2023/08/14/快速生成通用接口业务配置 一、插件安装 二、脚本 关注绿色聊天软件【程序员朱永胜】回复:1013 下载 三、使用 拷贝到扩展目录下 修改mybatisCodehelper.vm 修改i…

【爱书不爱输的程序猿】CPOLAR+HFS,低成本搭建NAS

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 通过HFS低成本搭建NAS,并内网穿透实现公网访问 - cpolar 极点云 前言1.下载安装cpolar1.1 设置HFS访客1.2 虚拟文件系统 2. 使用cpolar建立一条内网穿透数据隧道2.1 保留…

强化学习 PPO算法和代码

PPO 效果 字体找不到 ubuntu python findfont: Font family ‘Alibaba PuHuiTi 3.0’ not found. shell 清除缓存: rm ~/.cache/matplotlib -rf到这里下载 阿里巴巴普惠体3.0 https://fonts.alibabagroup.com/ 然后安装字体 PPO import matplotlib from mat…

​​C++多态​​

目录 1. 多态的概念 2. 多态的定义及实现 多态的构成条件 虚函数 虚函数的重写 特例 override 和 final 1. final:修饰虚函数,表示该虚函数不能再被重写 2.override: 检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译报错…

【数据结构】二叉树篇|超清晰图解和详解:二叉树的最近公共祖先

博主简介:努力学习的22级计算机科学与技术本科生一枚🌸博主主页: 是瑶瑶子啦每日一言🌼: 你不能要求一片海洋,没有风暴,那不是海洋,是泥塘——毕淑敏 目录 一、题目二、题解三、代码 一、题目 …

Stable Diffusion +EbSynth应用实践和经验分享

Ebsynth应用 1.安装ffmpeg 2.安装pip install transparent-background,下载模型https://www.mediafire.com/file/gjvux7ys4to9b4v/latest.pth/file 放到C:\Users\自己的用户名.transparent-background\加一个ckpt_base.pth文件 3.秋叶安装ebsynth插件,重启webui 填写项目基本…