转自:http://www.cnblogs.com/yanghuahui/p/3483754.htmlhtml
讲LSM树以前,须要提下三种基本的存储引擎,这样才能清楚LSM树的由来:sql
经过以上的分析,应该知道LSM树的由来了,LSM树的设计思想很是朴素:将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操做批量写入磁盘,不过读取的时候稍微麻烦,须要合并磁盘中历史数据和内存中最近修改操做,因此写入性能大大提高,读取时可能须要先看是否命中内存,不然须要访问较多的磁盘文件。极端的说,基于LSM树实现的HBase的写性能比Mysql高了一个数量级,读性能低了一个数量级。数据库
LSM树原理把一棵大树拆分红N棵小树,它首先写入内存中,随着小树愈来愈大,内存中的小树会flush到磁盘中,磁盘中的树按期能够作merge操做,合并成一棵大树,以优化读性能。数据结构
以上这些大概就是HBase存储的设计主要思想,这里分别对应说明下:oop
关于LSM Tree,对于最简单的二层LSM Tree而言,内存中的数据和磁盘你中的数据merge操做,以下图性能
图来自lsm论文优化
lsm tree,理论上,能够是内存中树的一部分和磁盘中第一层树作merge,对于磁盘中的树直接作update操做有可能会破坏物理block的连续性,可是实际应用中,通常lsm有多层,当磁盘中的小树合并成一个大树的时候,能够从新排好顺序,使得block连续,优化读性能。ui
hbase在实现中,是把整个内存在必定阈值后,flush到disk中,造成一个file,这个file的存储也就是一个小的B+树,由于hbase通常是部署在hdfs上,hdfs不支持对文件的update操做,因此hbase这么总体内存flush,而不是和磁盘中的小树merge update,这个设计也就能讲通了。内存flush到磁盘上的小树,按期也会合并成一个大树。总体上hbase就是用了lsm tree的思路。设计