数据结构-LSM树(NoSQL数据库常用)

LSM树是一种日志结构合并树,常用于NoSQL数据库以提升写操作性能。它由内存中的MemTable和磁盘上的SSTable组成,通过Compact操作消除冗余数据。写操作先在内存中进行,批量合并后顺序写入磁盘,而读操作可能涉及多层查找。相较于B+树,LSM树牺牲了一部分读性能以换取更快的写入速度。
摘要由CSDN通过智能技术生成

是什么

LSM树,日志结构合并树(Log-Structured Merge-Tree)。
其实它并不属于一个具体的数据结构,它更多是一种数据结构的设计思想。大多NoSQL数据库都是基于LSM来做的。

LSM树诞生背景

传统关系型数据库使用btree或一些变体作为存储结构,能高效进行查找。但保存在磁盘中时它也有一个明显的缺陷,那就是逻辑上相离很近但物理却可能相隔很远,这就可能造成大量的磁盘随机IO。为了提升IO性能,可以利用LSM树实现顺序写磁盘,从而大幅提升写操作,作为代价的是牺牲了一些读性能(因为LSM树的两个数据结构分别在内存和磁盘,所以读数据会比较慢)。
所以利用LSM树的话,写操作效率高于读操作

LSM树原理

LSM树由两个或以上的存储结构组成,
一个存储结构常驻内存中,称为C0 tree,具体可以是任何方便健值查找的数据结构,比如红黑树。
另外一个存储结构常驻在硬盘中,称为C1 tree,具体结构类似B树。C1所有节点都是100%满的,节点的大小为磁盘块大小。
在这里插入图片描述
插入步骤
大体思路是:插入一条新纪录时,首先在日志文件中插入操作日志,以便后面恢复使用,日志是以append形式插入,所以速度非常快;
将新纪录的索引插入到C0中,这里在内存中完成,不涉及磁盘IO操作;当C0大小达到某一阈值时或者每隔一段时间,将C0中记录滚动合并到磁盘C1中;对于多个存储结构的情况,当C1体量越来越大就向C2合并,以此类推,一直往上合并Ck。
在这里插入图片描述

数据结构

在这里插入图片描述
如上图所示,LSM树有以下三个重要组成部分:

  1. MemTable

MemTable是在内存中的数据结构,用于保存最近更新的数据,会按照Key有序地组织这些数据,LSM树对于具体如何组织有序地组织数据并没有明确的数据结构定义,例如Hbase使跳跃表来保证内存中key的有序。

因为数据暂时保存在内存中,内存并不是可靠存储,如果断电会丢失数据,因此通常会通过WAL(Write-ahead logging,预写式日志)的方式来保证数据的可靠性。

  1. Immutable MemTable

当 MemTable达到一定大小后,会转化成Immutable MemTable。Immutable MemTable是将转MemTable变为SSTable的一种中间状态。写操作由新的MemTable处理,在转存过程中不阻塞数据更新操作。

  1. SSTable(Sorted String Table)

有序键值对集合,是LSM树组在磁盘中的数据结构。为了加快SSTable的读取,可以通过建立key的索引以及布隆过滤器来加快key的查找。
在这里插入图片描述

写操作原理

每执行一条数据更新操作,LSM树就会将数据更新的操作记录(注意是操作记录)顺序append到内存之中,由于是顺序写所以很快,当日志达到一定的数据量后,再批量地顺序写入到磁盘当中。

存在问题:冗余存储
因为每条更新操作都会保存下来,所以存在对同一key的多条数据操作记录日志,而只有最新的一条日志是有效的,其余都是过期日志。
解决办法:Compact操作(合并多个SSTable)来清除冗余的记录。

Compact

Compact有两种模式:size-tiered和leveled

size-tiered 策略

在这里插入图片描述

size-tiered策略保证每层SSTable的大小相近,同时限制每一层SSTable的数量。如上图,每层限制SSTable为N,当每层SSTable达到N后,则触发Compact操作合并这些SSTable,并将合并后的结果写入到下一层成为一个更大的sstable。

由此可以看出,当层数达到一定数量时,最底层的单个SSTable的大小会变得非常大。并且size-tiered策略会导致空间放大比较严重。即使对于同一层的SSTable,每个key的记录是可能存在多份的,只有当该层的SSTable执行compact操作才会消除这些key的冗余记录。

level策略

推荐看这个讲解

和mysql的B+树对比

这与B+树不同,B+树数据的更新会直接在原数据所在处修改对应的值,所以存在随机写导致写操作很慢,
而LSM是将更新操作顺序append到内存,然后批量顺序写入磁盘,两次写操作都是顺序写,会很快。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值