一、背景
大数据情景下,需要巨量的读写数据,即良好的IO效率。传统的B树以及其变种无法满足,因为它的读写在物理上是随机的,这样IO的效率就不高。于是便有了LSM(log_structed_merge_tree) 合并日志树这个设计思想或者说存储结构。他在大数据的存储上广泛引用(HBase,Kudu,Clickhouse的MergeTree等),它的处理情景是将随机读写操作变成顺序读写操作,从而提高IO效率。
二、设计思想
LSM是通过顺序读写来提高IO 效率,所以它的存储数据结构就是要保证有序。
如图所示,LSM的存储是分层的(内存和磁盘),主要有4个角色
1:memTable
按照Key有序的组织数据,用于保存最新的数据。常用的数据结构有:map,红黑树,跳表。因为是在内存,为了防止断电丢失数据,所以有磁盘的备份,预写式日志WAL(write-ahead-logging)
2: immutable memtable
当memTable达到阈值后,会溢写到immutable memtable(不可改变内存表),然后再flush到磁盘中
3: SStable ( Sorted String Table ) , 有序字符表
这里因为数据量大,且可能存在冗余数据(一个key不同的值),所以为了保证读取的是正确的有效的,需要顺序读取所有的数据,从memTable开始。所以查询策略上是有做优化的,常见的有建立key的所以或者布隆过滤器。 明显读取的性能是