数据结构之LSM树

Posted Leo Han

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构之LSM树相关的知识,希望对你有一定的参考价值。

LSM树(Log Structured Merge Tree) 是一种为了加快写入速度而牺牲一部分读取性能的处理方式,比较典型的应用就是HBase。

目前常见的主要的三种存储引擎是:哈希、B+树、LSM树:

哈希存储引擎:是哈希表的持久化实现,支持增、删、改以及随机读取操作,但不支持顺序扫描,对应的存储系统为key-value存储系统。对于key-value的插入以及查询,哈希表的复杂度都是O(1),明显比树的操作O(n)快,如果不需要有序的遍历数据,哈希表性能最好。
B+树存储引擎是B+树的持久化实现,不仅支持单条记录的增、删、读、改操作,还支持顺序扫描(B+树的叶子节点之间的指针),对应的存储系统就是关系数据库(mysql等)。
LSM树(Log-Structured MergeTree)存储引擎和B+树存储引擎一样,同样支持增、删、读、改、顺序扫描操作。而且通过批量存储技术规避磁盘随机写入问题。当然凡事有利有弊,LSM树和B+树相比,LSM树牺牲了部分读性能,用来大幅提高写性能。

LSM树的设计思想着重点非常简单:将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操作批量写入磁盘(顺序写磁盘),不过读取的时候稍微麻烦,需要合并磁盘中历史数据和内存中最近修改操作,所以写入性能大大提升,读取时可能需要先看是否命中内存,否则需要访问较多的磁盘文件。极端的说,基于LSM树实现的HBase的写性能比MySQL高了一个数量级,读性能低了一个数量级。

LSM树把一棵大树拆分成多棵小树,所有的写入都是基于内存处理,随着内存中的小树越来越大,内存中的小树会flush写入到磁盘上,磁盘中的小树定期进行merge合并成一棵大树来优化读取性能。

同时由于写入更新的时候都在内存中,为了防止数据丢失也会提供WAL机制(Write Ahead Log),在内存中操作之前会先将数据写入到wal日志中(这个写入也是顺序写磁盘)。

HBase就是基于LSM树结构的,其中的Memstore就对应了内存部分,HFile则是Memstored中内容写入到磁盘,HLog则实现WAL机制。

以上是关于数据结构之LSM树的主要内容,如果未能解决你的问题,请参考以下文章

LSM树在HBase中的应用

LSM和B+树区别

Cassandra-LSM树

HBase源码分析之HRegion上MemStore的flsuh流程

B+树vs. LSM树(转)

LSM树由来设计思想以及应用到HBase的索引