本文主要是介绍下HBase一些背景知识,希望通过这篇文章可以让大家对HBase的认识能有一个大致的轮廓。
在LSM之前,常用的有三种基本存储引擎,分别是
哈希
B树
LSM-Tree(Log-StructuredMergeTree)
哈希哈希存储引擎是哈希表的持久化实现,支持增、删、改,以及随机读取操作,但不支持顺序扫描,对应的存储系统为键值(Key-Value)存储系统,如Bitcask。它仅支持追加操作,删除也只是通过标识value为特殊值,通过定期合并(Compaction)实现垃圾回收。B树B树存储引擎是B树的持久化实现,不仅支持单条记录的增、删、读、改操作,还支持顺序扫描,对应的存储系统是关系数据库。关系数据库中通过索引访问数据,在MysqlInnoDB中,有一个称为聚集索引的东西,行的数据存于其中,组织成B+树的结构。更多B系树的内容可以参考这里。
重点是看LSM-TreeLSM-Tree
图片来源lsm-tree论文。LSM-Tree原理把一棵大树拆分成N棵小树,它首先写入内存中,随着小树越来越大,内存中的小树会flush到磁盘中,磁盘中的树定期可以做merge操作,合并成一棵大树,以优化读性能。内存中树的一部分和磁盘中第一层树做merge,对于磁盘中的树直接做update操作有可能会破坏物理block的连续性,但是实际应用中,一般lsm有多层,当磁盘中的小树合并成一个大树的时候,可以重新排好顺序,使得写入block连续,优化读性能。
HBase存储引擎采用LSM-Tree架构,大体原理图如下
当RegionServer(RS)收到写请求的时候(writerequest),RS会将请求转至相应的Region。每一个Region都存储着一些列(asetofrows),根据其列族的不同,将这些列数据存储在相应的列族中(ColumnFamily,简写CF)。不同的CFs中的数据存储在各自的HStore中,HStore由一个Memstore及一系列StoreFile组成(StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile)。Memstore位于RS的主内存中,而HFiles被写入到HDFS中。当RS处理写请求的时候,数据首先写入到Memstore,然后当Memstore到达一定的阀值的时候,Memstore中的数据会被flush到HFile中,当HFiles达到一定的阈值后,就会触发