首页 > 其他分享 >LSM 树 设计思想总结

LSM 树 设计思想总结

时间:2023-05-09 21:11:29浏览次数:37  
标签:总结 思想 LSM 写入 compaction 内存 磁盘 放大

LSM 树的设计思想很有意思。

LSM 树将对磁盘的随机写入转化为了磁盘友好型的顺序写(无论机械磁盘还是 SSD,随机读写都要远远慢于顺序读写),从而大大提高了写性能。

 

1、怎么转化顺序写?

核心就是在内存中维护一个有序的内存表(memtable),当内存表大于阈值的时候批量刷入磁盘,生成最新的 SSTable 文件。因为本身 memtable 已经维护了按键排序的键值对,所以这个步骤可以高效地完成。

写入内存表时先将数据写入 WAL 日志,用以在发生故障时,通过重放 WAL 恢复内存中的数据,保证数据库的数据一致性。

 

2、空间放大和读放大

在这种追加(append-only)写入模式下,删除数据变成了对数据添加删除标记,更新数据变成了写入新的 value,在同一个时间数据库中会存在同个 key 的新值和旧值。这种影响被称之为 空间放大(Space Amplification)。

随着数据的写入,底层的 SSTable 文件也会越来越多。

读请求在这个模式下,变成了先在内存中寻找关键字,如果找不到则在磁盘中按照新-> 旧查找 SSTable 文件。为了优化这种访问模式的读性能,存储引擎通常使用常见的针对读的优化策略,比如使用额外的 Bloom Filter、读 Cache。

这种需要多次读取的过程(或者说影响)被称之为读放大(Read Amplification)。

 

3、读放大怎么优化?使用compaction

很显然,读放大会影响 LSM 树的读性能。

为了优化读性能(读放大),同时优化存储空间(空间放大),LSM 树通过在运行合并和压缩过程减少 SSTable 文件数量,删除无效(被删除或者被覆盖) 的旧值。这一过程被称之为 compaction。

 

4、compaction压缩对写入的放大

但是 compaction 也会一些影响,在数据库的生命周期中每次的数据写入实际上会造成多次的磁盘写入。这种影响被称之为写放大(Write Amplification)。

在写入繁重的应用程序中,性能瓶颈可能是数据库可以写入磁盘的速度。在这种情况下,写放大会导致直接的性能代价:存储引擎写入磁盘的次数越多,可用磁盘带宽内的每秒写入次数越少。

这也是我认为 LSM 引擎存储的一个缺点,就是压缩过程有可能会干扰到正在进行的读写请求。尽管存储引擎尝试逐步执行压缩而不影响并发访问,但是磁盘资源有限,所以很容易发生请求需要等待磁盘完成昂贵的压缩操作。对吞吐量和平均响应时间的影响通常很小,但是如果是高百分位情况下(如 P99 RT),有时就会出现查询响应较长的情况。

 

上述是对 LSM 树的个人总结,一些没有提到实现细节的抽象描述(比如 memtable、compaction),在实际的存储中都有对应的实现,细节可能不同,但是设计思想都是类似。

 

5、写放大、读放大、空间放大的TradeOff

在RocksDB 实现中,写放大、读放大、空间放大,这三者就像 CAP 定理一样,无法同时达到最优。

为此 RocksDB 暴露了很多参数来让使用者进行调优,以适应更多的应用场景。这其中很大一部分工作是在写放大、读放大和空间放大这三个放大因子之间做好 trade off。

标签:总结,思想,LSM,写入,compaction,内存,磁盘,放大
From: https://www.cnblogs.com/binyue/p/17385804.html

相关文章

  • 2023.5.9每日总结
    packagewangzhan;importjava.sql.Blob;publicclassPd_stu{privateintid;privateStringname;privateStringsex;privateStringclasss;privateStringmajor;privateStringfaculty;privateStringpas;privateBlob......
  • 5.9号今日总结
    今天做了python的实验四代码如下:importrefromcollectionsimportCounterimportrequestsfromlxmlimportetreeimportpandasaspdimportjiebaimportmatplotlib.pyplotaspltfromwordcloudimportWordCloudheaders={"User-Agent":"Mozilla......
  • Linux 处理CPU和内存参数的方式总结
    Linux处理CPU和内存参数的方式总结关闭NUMA,关闭透明大页比较简单的方法:vim/etc/default/grub在GRUB_CMDLINE_LINUX里面添加配置:transparent_hugepage=nevernuma=off修改后的配置为:GRUB_CMDLINE_LINUX="resume=/dev/mapper/uos-swaprd.lvm.lv=uos/rootrd.lvm.......
  • 离散数学第二版(屈婉玲)第二部分内容总结
    第二部分 集合论总结第6章 集合代数6.1集合的基本概念集合中的关系:元素和集合之间:属于或不属于。集合与集合之间:包含被包含,子集,真子集,空集,幂集。 6.2集合的运算集合的基本运算:并、交、相对补、对称差、绝对补 ......
  • 每日总结2023-05-09
    今天完成了广告界面的设计,通过上网查询,了解到互联网广告投放一般按照天数计费,费用高低不一,通常有几种模式:季度收费,按年收费,天数计费等。通过钟表计算广告运行的天数,来进行广告收益的计算,再将广告信息传输到数据库进行存储。 advertBean.javapackagecom.example.math.bean;......
  • 1000个已成功入职的软件测试工程师简历经验总结:软件测试工程师简历项目经验怎么写?(含
    一、前言:浅谈面试 面试是我们进入一个公司的门槛,通过了面试才能进入公司,你的面试结果和你的薪资是息息相关的。那如何才能顺利的通过面试,得到公司的认可呢?面试软件测试要注意哪些问题呢?下面和笔者一起来看看吧。这里分享一下笔者十年测试生涯的面试总结!软件测试面试常......
  • 逆向常遇问题总结
    FatalJavaScriptinvalidsizeerror169220804问题阐述:内存不足超出了最大内存堆栈。问题解决:其实非常简单如果是平常开发过程中需要检查好自己的列表变量如果是逆向过程中,检查下代码中的格式化校验搜索newregex.test然后后面的tostring的那个函数。重新把前......
  • 连续可导总结
    连续连续定义:\(\lim_{x->x_0^-}f(x)=f(x_0)\),为左连续\(\lim_{x->x_0^+}f(x)=f(x_0)\),为右连续以前认为,左右极限相等是错的,参考可去间断点,左右也相等,但是不连续这里纠正,函数极限存在相等不一定连续,应该是左连续等于右连续可导可导是左右导数存在且相等这里可导推......
  • Quartz.Net间隔N周/日/年定时触发器写法总结
    由于近日在定时器中对特殊的规则(既不能通过表达式直接体现的)的用法初步汇总:本次使用的Quartz.Net的版本号:2.61.触发器测试验证publicclassTestQuartz{///<summary>///间隔N周定时触发器写法测试///</summary>publicstatic......
  • input 自动填充 的解决方法总结
    方法一、form表单、input输入框设置属性autocomplete="off";<formaction="login"method="post"autocomplete="off"></form><inputautocomplete="off"> 方法二、正对有passpword的情况,chrome对aut......