LSM学习分享——compact策略

详细介绍在LSM学习分享——LSM读写流程中提到的copaction操作。主要介绍两种基本策略:size-tiered和leveled。

前提知识:

      (1)、读放大:读取数据时实际读取的数据量大于真正的数据量。例如在LSM树中需要先在MemTable查看当前key是否存在,不存在继续从SSTable中寻找。

      (2)、写放大:写入数据时实际写入的数据量大于真正的数据量。例如在LSM树中写入时可能触发Compact操作,导致实际写入的数据量远大于该key的数据量。

      (3)、空间放大:数据实际占用的磁盘空间比数据的真正大小更多。对于在LSM学习分享——初识LSM中提到的大量写里面出现的冗余存储,对于一个key来说,只有最新的那条记录是有效的,而之前的记录都是可以被清理回收的

size-tiered策略:

图片

size-tired的缺点是空间放大和读放大:

     size-tiered策略保证每层的SStable大小相近或相同,达到一定的数量后(比如图中数量为4),会合并这些SSTable,合并之后写到下一层成为更大的SSTable,当层数达到一定的数量,最底层的SSTable会变得非常大。而且size-tiered策略会导致空间放大比较严重,即使是同一层的SSTable,key值的记录也会存在多份,只有该层执行compact操作时,才会消除无效记录。而range查询需要合并所有层的结果,runs越多,读放大越严重。

leveled策略:

图片

leveled策略可以减小空间放大和读放大。

    leveled策略主要思想为:对于L1及以上层的数据,将size-tiered的大的SSTable拆开,成为多个key互不相交的小SSTable序列,这个序列叫做“run”。L0是从memTable刷进来的新SSTable,这一层的key可以相交,其SSTable数量由阈值控制。

      以上图为例,L1阈值为10,L2阈值为100。越往下层,阈值成10倍增长。随着SST不断写入,L1的数据量会超过阈值。这时就会选择L1中的至少一个SST,将其数据合并到L2层与其key有交集的那些文件中,并从L1删除这些数据。仍然以上图为例,一个L1层SST的key区间大致能够对应到10个L2层的SST,所以一次compaction会影响到11个文件。该次compaction完成后,L2的数据量又有可能超过阈值,进而触发L2到L3的compaction,如此往复,就可以完成Ln层到Ln+1层的compaction了。

    可见,leveled compaction与size-tiered compaction相比,每次做compaction时最多读取其中一个SSTable,并且每层中SST的key区间都是不相交的,重复key减少了,所以很大程度上缓解了空间放大的问题。

关于LSM-Tree的理论部分就介绍到这里,后面会介绍几个基于LSM-Tree的存储引擎。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值