数据存储策略——lsm-tree

news2025/1/16 18:42:59

文章目录

  • 一、背景
  • 二、lsm-tree简介
  • 三、lsm-tree设计思想
  • 四、lsm-tree原理
    • 1.写操作
    • 2.读操作
    • 3.有序表持久化
    • 4.后台压缩
  • 五、lsm-tree的应用
  • 六、lsm-tree优缺点分析
  • 总结

一、背景

由于传统机械磁盘的原理,它在读写时有个寻道的操作,在读写时都需要消耗一个寻道时间。
在这里插入图片描述

这就造成了顺序读写的速度远远快于随机读写的速度。这之间存在几个数量级的差距。

二、lsm-tree简介

LSM-tree起源于 1996 年的一篇论文《The Log-Structured Merge-Tree (LSM-Tree)》,今天的内容和图片主要来源于 FAST’16 的《WiscKey: Separating Keys from Values in SSD-conscious Storage》。

LSM-tree 是专门为 key-value 存储系统设计的,key-value 类型的存储系统最主要的就两个个功能,put(k,v):写入一个(k,v),get(k):给定一个 k 查找 v。

三、lsm-tree设计思想

之前我们说过,在传统磁盘上,顺序读写的性能要远高于随机读写。而这也是lsm-tree的设计出发点。

它通过一种方法,将对数据的写操作变为顺序写操作,以此来优化数据写性能。

而后台的压缩进程将数据不断压缩成有序结构,使得顺序读成为可能。

四、lsm-tree原理

1.写操作

当进行写操作时,先将该写操作以日志的形式追加写到文件中,这样就是以顺序写的形式写数据。

同时将其加入内存中的有序表结构当中。(作为kv数据库,内存中势必会有那种排序表结构用于快速查找)

2.读操作

先找内存,看内存中是否有,如果没有,那么就去持久化的文件中依次查找,因为每个文件的kv对是有序的,所以我们可以利用一些算法(比如二分)来加快查找速度。

又因为持久化的文件可能有多个,所以在极端情况下,lsm-tree需要读取多个文件才可能查找到对应的kv对。

3.有序表持久化

尽管lsm-tree写操作已经是顺序写,但是其有个弊端,那就是磁盘中的数据存储并不是有序的

PS:仔细想想如果磁盘中的数据不是有序的那会有什么问题?当我们需要按顺序遍历时,对于非有序存储的磁盘数据,那么会造成多次的随机读,这对于传统磁盘而言是不可接受。

为了保证有序,真正的磁盘数据持久化应该是根据内存中有序表来持久化的,这样之前写的日志文件作用只是保证数据写入操作不会因为宕机等原因而丢失。

而这种持久化往往是周期性触发,比如内存中有序表kv键值对达到一定数量或者到达一定时间,会触发数据持久化。

可以这么理解,每隔一段时间,操作系统中的文件系统就会多一个存储有序数据的文件,每个文件都是一个小型的有序表。

4.后台压缩

文件多了怎么办,之前说了经过lsm-tree的处理,数据持久化为多个小文件,而对于数据的查找往往需要遍历多个小文件。

这样查找效率可就低了,为了加快查找效率,也为了减少文件描述符(因为这是有限的),lsm-tree需要在后台进行压缩。主要目的就是将多个小文件进行合并,合并成大文件。

五、lsm-tree的应用

lsm-tree在工业界应用十分广泛,比如leveldb,rocketdb等等。因为随机写优化成了顺序写,所以性能非常可观。

六、lsm-tree优缺点分析

我们仔细回顾下lsm-tree到底做了什么来使性能提升的。
其实一句话就是将随机写改为顺序写,不管是日志持久化,还是有序表持久化,亦或者是后台压缩,其写操作皆是顺序写。

但是我们仔细思考下,它所做的事情真的减少了吗?

其实不然,非但没有减少,实际的写入的数据还有增加。

不考虑后台压缩操作,光日志持久化和有序表持久化就将数据写放大到两倍。更别提还有极度消耗资源的后台压缩操作。而它能提升性能的原因仅仅是顺序写和随机写操作在传统磁盘上的性能差距实在太大了,大到即使是多了这些额外的操作,lsm-tree所带来的性能收益也要大于其消耗

但是这个前提正在被逐渐打破,注意到我之前的用词了吗?

传统磁盘!

在传统磁盘中,这种优化是没有任何毛病的,但已渐渐成为主流的SSD正在将这种前提打破!

尽管SSD的顺序写操作性能依旧要比随机写要好,但是其性能差距并没有像传统磁盘那么大。

在2019年SOSP上有一篇论文——KVell: the Design and Implementation of a Fast Persistent Key-Value Store中,就提到了现代硬盘SSD针对lsm-tree的一些问题。
在这里插入图片描述
在这里插入图片描述

在这篇论文中提到了lsm-tree在现代磁盘上的两个问题,一个是CPU成为瓶颈,另一个是性能波动问题。

在lsm-tree中,之前提到的后台压缩操作实际上是个CPU大户,我们经常可以看到请求量不多,但是CPU耗费拉满的情况。

这是因为随着技术的发展,SSD无论是带宽还是性能都已有了巨大的提升。在论文中提到一个明显现象就是,LSM-tree始终无法利用整个设备的I/O带宽,而CPU往往处于高负荷运转的状态。

同时,后台压缩操作在请求量大的情况下势必影响客户端的吞吐量,因为有时更新需要等待压缩完成,从而导致LSM-tree性能的波动。

总结

lsm-tree是一个以优化写操作的存储策略,核心思路就是顺序写替换随机写。
lsm-tree在传统磁盘上的读写性能表现非常出色,在工业界非常流行,比如腾讯tendis和360的pika底层用的Rocksdb就是采用lsm-tree来实现的。

但是随着时代的发展,SSD性能的提升和读写方式的变化,使得lsm-tree渐渐暴露出一些问题,也让我们不禁去探寻一种更为高效的存储方式。

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

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

相关文章

基于PHP+MySQL网上报名系统的设计与实现

一直以来如何更好的实现校园现代化和信息化是当前很多高校一直探索的问题,随着时代的发展,高校内各类考试和报名也越来越多,如何通过互联网直接进行在线报名是本系统研究的一个重点内容。 本系统是一个网上报名系统,为了能够更加灵…

[计算机毕业设计]机器学习的数据驱动股票价格预测

前言 📅大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

财政政策与货币政策(下)

财政政策与货币政策(下) – 潘登同学的宏观经济学笔记 文章目录财政政策与货币政策(下) -- 潘登同学的宏观经济学笔记粘性价格下的货币经济总供给曲线总供给曲线斜率与价格粘性菲利普斯曲线的消失货币政策的“动态不一致”财政政策与货币政策的配合财政主导 vs. 货币主导恶性通…

【学习记录】实例分割的发展与区别

【学习记录】实例分割的发展与区别 参考于《The Evolution Of Instantce Segmentation》 文章目录【学习记录】实例分割的发展与区别发展历程RCNNFast RCNNMultipath NetworkFaster RCNNMask RCNN发展历程 RCNN 开发集成了RCNN技术产生了AlexNet,以及使用选择性搜索…

浅谈App的启动优化

1. 应用启动的方式 在Android中,应用启动一般可分为三种:冷启动、温启动、热启动。 那么什么是冷启动、温启动和热启动呢?下面我们来简单看一下它们的定义: 冷启动:当启动应用时,后台没有该应用的进程。这…

Allegro导入导出设计数据操作指导

Allegro导入导出设计数据操作指导 Allegro有个非常好用的功能,就是支持设计数据的导入和导出,让协同设计变得更加方便,具体操作如下 以下面的设计数据为例,需要把这些数据导入到另外一个版本中 点击file-export-subdrawing Options所有的项目都勾选起来 Find选择需要导…

linux笔记(7):东山哪吒D1H使用framebuffer控制HDMI直线

文章目录1.测试流程和结果1.1 使能HDMI1.2 framebuffer操作流程1.3 测试结果2.测试过程详述2.1 编译源码2.2上传可执行文件2.3修改文件的权限,执行文件3.源码解释3.1 HDMI使用的颜色格式是ARGB4.源码工程链接这部分linux笔记是记录我入门的过程,内容基本…

【Flutter】【widget】Table 表格widget

文章目录前言一、Table 是什么?二、使用步骤1.Table 基础使用2.宽度3.设置边框4.TableCell设置单元格式widget等其他设置总结前言 Table 表格widget,其实很少使用到的,等有需要的时候在查看该widget 一、Table 是什么? 表格widg…

Trino源码Gitlab CICD单测环境建设

在中大型公司,由于对Presto源码的定制魔改量越来越大,会随着时间推移而增大出现冷门bug的概率,所以建立一套自动测试机制,在魔改源码合入主分支时可以自动触发test case,通过特定单测的执行失败,来更清晰的…

多云管理产品组合VMware Aria,开启多云管理新篇章

今年8月份,VMware Explore美国大会上宣布了多云管理产品组合VMware Aria,宣布之后,市场上关注度非常高,而且受到了热捧。Aria这个名字动听且贴切,中文意思是 “咏叹调”,也就是说要用统一的、一致的曲调来歌…

big.LITTLEDynamIQ

最近看到了DynamIQ,于是来了解一下什么是DynamIQ? 前言 首先要知道DynamIQ,那么你肯定得知道big.LITTLE。因为DynamIQ可以说是big.LITTLE新一代或者是升级版。 那么在这之前你肯定得知道什么是big.LITTLE? 然后知道了后你就会…

旋转框目标检测mmrotate v0.3.1 训练DOTA数据集(三)——配置文件优化技巧

1、 目标检测比赛中的tricks DOTAv2遥感图像旋转目标检测竞赛经验分享(Swin Transformer Anchor free/based方案) 目标检测比赛中的tricks(已更新更多代码解析) 水下目标检测算法赛解决方案分享 | 2020年全国水下机器人&#xf…

基于布谷鸟搜索混合灰狼优化算法求解单目标优化问题(AGWOCS)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

【工具】typora的一些配置

文章目录1. 自动编号1.1 大纲编号1.2 目录编号3. 正文部分2. 自定义快捷键1. 自动编号 我们在查看文档时候,希望编译器能够自动根据标题样式按顺序编号,不需要用户自行添加相应标题。这样也方便用户随时更新文档时候不会因为修改了某个编号而要去修改其…

分享3个文字配音软件,帮助你们轻松制作短视频

有没有刚踏入自媒体行业的小伙伴呀?那你们是不是为视频的后期工作所困惑着呢? 大家平时刷到的视频虽然看起来简短又有趣,但其实后期制作并没那么简单,是由许多道工序环环相扣而成的,其中比较重要的,就是为视…

JavaEE进阶:Spring 更简单的读取和存储对象

文章目录前言一、存储 Bean 对象1、前置⼯作:配置扫描路径(重要)2、添加注解存储 Bean 对象① Controller(控制器存储)② Service(服务存储)③ Repository(仓库存储)④ C…

栈的实现.

文章目录1.栈的概念及结构2.栈的实现(数组实现)2.1栈头文件2.2函数实现3.栈的习题3.1有效的括号3.1.1思路分析3.1.2代码实现1.栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删…

Qt第二十一章:Qt Designer 之 布局

简单场景:页面上放一个QTextEdit控件 预览后发现,拖拽放大窗口,QTextEdit控件不会进行缩放,就像下边自适应缩放 我们看到了QTextEdit控件撑满了整个界面:在控件sizePolicy属性的允许范围中尽可能的撑满界面。 如果换成…

基于h5的风云网球网站的设计

目 录 1绪 论 1 1.1 选题背景及意义 1 1.2 国内外研究现状 2 1.3本章小结 2 2 前端开发及相关技术 4 2.1 HTML5前端开发环境 4 2.2 HTML5前端开发工具 4 2.3 HTML5前端开发相关技术 5 2.3.1 javascript简介 5 2.3.2 javascript基本特点 5 2.3.3 css简介 6 2.3.4 jQuery 7 2.4 本…

Python精髓之括号家族:方括号、花括号和圆括号,你真的会用吗?

Python独一无二的特色除了缩进还有哪些特色呢?大多数的回答一定是 语法简洁、简单易学、代码高效、功能强大四项。那究竟是Python的哪些语言特性使得人们普遍认为Python具有这些特点呢?其实很大程度上,这要归功于列表(list&#x…