【数据结构】LSM树(Log-Structured-Merge-Tree)

核心特点

利用顺序写来提高写性能。分为内存和文件两部分的设计会稍微降低读性能,但是通过牺牲小部分读性能换来了高性能写。

组成部分

LSM树有以下三个重要组成部分:

MemTable
  • MemTable是在内存中的数据结构,用于保存最近更新的数据。
  • 它会按照Key有序地组织这些数据,但LSM树对于具体如何组织有序地组织数据并没有明确的数据结构定义。(Hbase使跳跃表来保证内存中key的有序)
  • 通常会通过WAL(Write-ahead logging,预写式日志)的方式来保证数据的可靠性。(因为数据暂时保存在内存中,内存并不是可靠存储,如果断电会丢失数据)
Immutable MemTable

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

SSTable(Sorted String Table)

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

L0 的 sstable 文件由 immutable memtable 直接 dump(转储)产生,其他余Level 的 sstable 文件由其上一层的文件和本层文件归并产生; sstable 文件在归并过程中顺序写生成,生成后仅可能在之后的归并中被删除,不会有任何的修改操作。        

注:

  1. LSM树会将所有的数据插入、修改、删除等操作记录保存在内存之中,当此类操作达到一定的数据量后,再批量地顺序写入到磁盘当中。
  2. 不断地将Immutable MemTable flush到持久化存储保证了顺序写,而不是去修改之前的SSTable中的key。
  3. 读取时需要从最新的倒着查询,直到找到某个key的记录。最坏情况需要查询完所有的SSTable,这里可以通过前面提到的索引/布隆过滤器来优化查找速度。
  4. LSM树分为Level 0,Level 1,Level 2 …Level n 多颗子树,其中只有Level 0在内存中,其余Level 1到Level n在磁盘中。

LSM树的Compact策略

冗余存储

对于某个key,实际上除了最新的那条记录外,其他的记录都是冗余无用的,但是仍然占用了存储空间。因此需要进行Compact操作(合并多个SSTable)来清除冗余的记录。

Compact策略上,主要介绍两种基本策略:size-tiered和leveled。

1)读放大:读取数据时实际读取的数据量大于真正的数据量。在LSM树中需要先在MemTable查看当前key是否存在,不存在继续从SSTable中寻找。
2)写放大:写入数据时实际写入的数据量大于真正的数据量。在LSM树中写入时可能触发Compact操作,导致实际写入的数据量远大于该key的数据量。
3)空间放大:数据实际占用的磁盘空间比数据的真正大小更多。上面提到的冗余存储,对于一个key来说,只有最新的那条记录是有效的,而之前的记录都是可以被清理回收的。

size-tiered 策略

size-tiered策略保证每层SSTable的大小相近,同时限制每一层SSTable的数量。

每层限制SSTable为N,当每层SSTable达到N后,则触发Compact操作合并这些SSTable,并将合并后的结果写入到下一层成为一个更大的sstable。

当层数达到一定数量时,最底层的单个SSTable的大小会变得非常大。并且size-tiered策略会导致空间放大比较严重

即使对于同一层的SSTable,每个key的记录是可能存在多份的,只有当该层的SSTable执行compact操作才会消除这些key的冗余记录。

leveled策略

leveled策略也是采用分层的思想,每一层限制总文件的大小。

跟size-tiered策略不同的是,leveled会将每一层切分成多个大小相近的SSTable。这些SSTable是这一层是全局有序的(合并策略和size-tiered不同),意味着一个key在每一层至多只有1条记录,不存在冗余记录。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值