LSM树学习

本文详细介绍了LSM树的工作原理,包括其与B+树的对比,写入和查询流程,以及在键值数据库中的应用。重点讨论了并发控制、故障恢复和代价评估,强调LSM树适用于写密集型应用,可通过建立查询索引优化查询性能。
摘要由CSDN通过智能技术生成

1.LSM树概述

LSM树(Log-Structured MergeTree),日志结构合并树。

LSM树(Log-Structured MergeTree)存储引擎和B+树存储引擎一样,同样支持增、删、读、改、顺序扫描操作。用于键值数据库。

随机读写比顺序读写慢很多,为了提升IO性能,我们需要一种能将随机操作变为顺序操作的机制,于是便有了LSM树。LSM树能让我们进行顺序写磁盘,从而大幅提升写操作,作为代价的是牺牲了一些读性能。通常LSM-tree适用于索引插入比检索更频繁的应用系统。

2.LSM与B+树对比

  • LSM虽然称为基于磁盘的数据结构,更像一种建模方式(和B+Tree这种数据结构不是一个层次的概念)
    • 如LSM的内存中的memtable可以使用B+Tree实现、磁盘上面的每层sst文件也可以使用B+Tree实现

由于磁盘的较高访问开销,存储引擎使用宽(矮)树形式以减少磁盘访问次数。一般使用B+Tree或者LSM及它们的变种,B+Tree与LSM最大不同如下图所示(数据文件是否可以原地更新

LSM树是一种典型的不可变结构,不可变存储结构不允许修改现有文件,表只被允许写入一次,新的记录会被附加到新的文件中。他的所有引用都可以被并发地访问,其完整性由不可修改这一事实保证。

相反的概念为原地更新存储结构,如B树:在磁盘上定位到数据后便可读取或写入,但这是以写入性能为代价的,写入会涉及到结构上的递归改变。

不可变LSM树使用仅追加存储和合并协调,而B树则在磁盘上定位数据记录并在文件的偏移量上更新页。

原地更新存储结构针对读取进行了性能优化,但这是以牺牲写入性能为代价的,即 简单读 复杂写;仅追加存储是对写入性能进行的优化,写操作不必在磁盘上找到记录并覆盖,但这是以读性能为代价,读取必须检索多个数据记录的版本,最后合并起来,即 简单写复杂读。

2.1 并发控制&故障恢复

存储引擎的实现模型(是否原地更新)决定了并发控制及故障恢复。

并发控制(并发可见性,原子性)故障恢复(可持久性)总结

B+Tree

写入时,树形变化时需要加锁,影响性能读取时,MVCC相对复杂,需要依赖undolog实现结合redolog、undolog恢复相对复杂,对事务支持的更好
LSM写入时,锁粒度很小,性能好读取时,MVCC很简单,seqid+引用计数即可内存依赖wal恢复磁盘依赖manifest恢复简单

2.2 代价评估

RUM猜想:有一种流行的存储结构开销模型考虑了如下三个因素:读取(Read)、更新(Update)和内存(Memory)开销。猜想指出减少其中两项开销将不可避免地导致第三项开销的恶化,而且优化只能以三个参数中的一个为代价。

读放大写放大空间放大总结
B+TreeB+Tree的高度,最差是几写入record可能刷脏页,page size/record size16KB/100B = 160倍,主要是IOPS2倍+put、scan都会产生比较多的随机io读性能更好
LSM和读过程触碰的文件数量相关,最差是几十和level层层数相关,一般每多一层,多10倍一般是几十倍,主要是吞吐1.1倍put、scan基本都是顺序io写入性能更好;读性能可以靠Cache(filter/index/data等)弥补

3.LSM实现

写入流程:一个 put(k,v) 操作来了,首先追加到写前日志(Write Ahead Log,也就是真正写入之前记录的日志)中,接下来加到 C0 层。当 C0 层的数据达到一定大小,就把 C0 层 和 C1 层合并,类似归并排序,这个过程就是Compaction(合并)。合并出来的新的 new-C1 会顺序写磁盘,替换掉原来的 old-C1。当 C1 层达到一定大小,会继续和下层合并。合并之后所有旧文件都可以删掉,留下新的。

注意数据的写入可能重复,新版本需要覆盖老版本。什么叫新版本,先写(a=1),再写(a=233),233 就是新版本了。假如 a 老版本已经到 Ck 层了,这时候 C0 层来了个新版本,这个时候不会去管底下的文件有没有老版本,老版本的清理是在合并的时候做的。

写入过程基本只用到了内存结构,Compaction 可以后台异步完成,不阻塞写入。

查询流程:在写入流程中可以看到,最新的数据在 C0 层,最老的数据在 Ck 层,所以查询也是先查 C0 层,如果没有要查的 k,再查 C1,逐层查。

一次查询可能需要多次单点查询,稍微慢一些。所以 LSM-tree 主要针对的场景是写密集、少量查询的场景。为了优化查询速度可以建立查询索引。

LSM-tree 被用在各种键值数据库中,如 LevelDB,RocksDB,还有分布式行式存储数据库 Cassandra 也用了 LSM-tree 的存储架构。


参考文章链接:LSM是啥 - 知乎            

参考文章链接:LSM树(日志结构合并树)总结-java版-CSDN博客
参考文章链接:《数据库系统内幕》笔记 —— LSM树与OceanBase_分享:数据库存储与索引技术(二) 分布式数据库基石——lsm树_lsm 索引_oceanbase数-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值