LSM Tree 日志结构合并树

LSM Tree 全称是Log Struct Merge Tree 日志结构合并树。虽然叫tree,但是其实他并不像B+ tree和红黑树等意义上的树状结构。它其实是一种存储结构,目前hbase clickhous等数据存储都是使用这种存储结构的。
LSM Tree起源于谷歌的BigTable,Hbase正是借鉴了BigTable这篇论文来实现的,谷歌发布这篇文章很有价值的一方面是在于他使用的文件组织方式,也就是LSM 日志结构合并树,LSM的有趣之处在于他脱离了统治这个领域几十年的二叉树的文件组织的形式,带来了另外一种解决方法。
LSM是一种分层有序,基于硬盘的数据存储方式,这里的分成指的是分内存和硬盘的存储。LSM的思路非常简单,首先将数据写到内存中,这里需要按照key进行数据的排序,当数据达到一定的阈值的时候,将内存中的数据整体的顺序写到磁盘尾,这里的核心是利用顺序写来挺高数据的写速度,通过牺牲小部分的读性能换来高性能写。使得lsm成为非常流行的存储结构。
LSM为什么采用这种设计方式呢?
我们都知道,磁盘在随机写的情况下读写速度都是很慢的,但是顺序访问的时候速度是很快的,无论磁盘还是内存(内存的程度较轻),随机和顺序都是存在一定的差距的,顺序磁盘的访问要随机磁盘访问要快的多,所以,磁盘有如下的特性,对磁盘来说,能够最大化发挥磁盘特性的使用方式:一次性读取或者写入特定大小的数据,并尽可能的减少随机寻道的次数。Lsm充分利用这个特性来实现的,顺序写大大的提高了写的效率,相比于B+树有更好的写操作的吞吐量,通过消除随机的本地更新来实现这个,但是消除了随机的本地更新,是通过牺牲校部分的读性能来获得的。适用于写多读少。

LSM有三个重要的组成


image.png

1.MemTable
MemTable是Lsm在内存中的数据结构,用于保存最近插入更新的数据,按照key有序的组织这些数据,Lsm对于如何有序的组织这些数据没有明确的定义,比如HBase使用跳跃表来保证内存中的数据的有序。
因为数据是保存在内存中的,所以数据并不是安全的,一般采用WAL(Write ahead logging)预写入日志的方式保证数据的可靠性
2.Immutable Mem Table
当Mem Table达到一定大小之后,会转变为immutable Mem Table,然后生成行的mem Table接收数据的写入,整个过程不会阻塞数据的希尔,immutable mem table是mem table到sstable转换的一种中间操作
3.SSTable (Sorted String Table)
有序键值对集合,是Lsm在磁盘中的数据结构,为了加快sstable的读取,常用的方式是建立索引和布隆过滤器来提高查询的速度。

这里需要注意的一个点是,LSM正如名字描绘的,LSM会将所有的数据的操作增删改,保存在内存当中,当操作到达一定大小,flush到磁盘,与B+树不一样,数据的更新会直接在原来数据的基础之上进行数据的修改,但LSM的数据更新方式是日志式的,当一条数据更新直接是一条数据更新的记录,这些写的目的就是为了能够顺序写,不断的将immutable mem table持久化到磁盘中,而不用修改之前的ssTable中的key,来保证了数据的顺序写,读的时候需要从内存和磁盘中进行数据的读取,牺牲了一小部分读性能来提供写性能,目前常用的也在不断的使用建立索引和布隆过滤器来提供读性能,hbase还增加了block cache 和比对尾记录的方式提高数据读取的效率。
问题:
1.数据的冗余存储,同一个key,可能在不同时间段的操作导致分布在不同的sstable中了,解决这个问题的办法是sstable的compact的策略,不同的Lsm的实现,合并的策略也是不一样的,好在sstable和memtable中的数据是有序的,可以使用merge sort归并排序快速的实现数据的合并,删除历史冗余数据。
2.读性能的降低

总结
LSM是非常值得了解的知识,理解LSM可以很自然的了解Hbase,LevelDB等存储组织架构设计,ClickHouse中的MergeTree也是使用Lsm的思想来实现的。Log Structed还可以联系到Kafa的数据存储方式,可以思考一下Lsm和kafka的数据存储之间的差异。
不同的存储对应数据的Compact有不同的特定的优化,比如Hbase有major和minor的两种compact。
重点总结
1.LSM tree是一种分层 有序,基于硬盘的数据结构,设计思想是将数据的的修改增量写入到内存(同时还要WAL)到达一定的阈值之后,使用归并排序的方式将内存中的数据合并追加到磁盘尾。
2.利用磁盘的顺序访问要比随机访问快很多的思想提高写性能
3.牺牲部分读性能来提高写性能,适用于写读读少的场景
4.提升读性能的优化策略主要有建立索引,布隆过滤器,多路归并机制等

参考文章
https://zhuanlan.zhihu.com/p/181498475
https://blog.csdn.net/breakout_alex/article/details/111305177

你可能感兴趣的:(LSM Tree 日志结构合并树)