HBase中LSM(Log-Structed Merge)的原理

LSM(Log-Structed Merge)树的原理

把一棵大树拆分成N棵小树,它首先写入内存中,随着小树越来越大,内存中的小树会flush到磁盘中,磁盘中的树定期可以做merge操作,合并成一棵大树,以优化读性能。
LSM树与B树相比,牺牲了部分的读性能,大幅提高写性能。

LSM树的存储引擎和B树存储引擎一样,同样支持增、删、读、改、顺序扫描操作。而且通过批量存储技术规避磁盘随机写入问题。

HBase中的LSM树

原理

数据会先写到内存中,为了防止内存数据丢失,写内存的同时需要持久化到磁盘,对应了HBase的MemStore和HLog;
MemStore中的数据达到一定的阈值之后,需要将数据刷写到磁盘,即生成HFile(也是一颗小的B+树)文件;
hbase中的minor(少量HFile小文件合并)major(一个region的所有HFile文件合并)执行compact操作,同时删除无效数据(过期及删除的数据),多棵小树在这个时机合并成大树,来增强读性能。

针对LSM树读性能hbase的优化:

Bloom-filter:就是个带随机概率的bitmap,可以快速的告诉你,某一个小的有序结构里有没有指定数据的。于是就可以不用二分查找,而只需简单的计算几次就能知道数据是否在某个小集合里啦。效率得到了提升,但付出的是空间代价。
compact:小树合并为大树:因为小树性能有问题,所以要有个进程不断地将小树合并到大树上,这样大部分的老数据查询也可以直接使用log2N的方式找到,不需要再进行(N/m)*log2n的查询了。

总结

其实,HBase中不仅用到了LSM树,同时也用到了B+树,但是用到的地方不同。
LSM树中的最小单元可以理解为HFile,当接收到操作HBase的命令时,先把它存到memStore(内存)中,达到一定阈值才会以HFile的形式flush到StoreFile中,当StoreFile数量过多的时候,对其进行合并(Merge),这是LSM树的主要思想。
而B+树,是在HFile的索引机制中使用到的,目的是为了加快在HFile中查询的速度。
HFile的索引结果会发在后续博客中。

猜你喜欢

转载自blog.csdn.net/weixin_43857365/article/details/89208672