赞
踩
详细介绍在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的存储引擎。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。