读写首先根据rowid定位到reginserver:Zookeeper→-ROOT-→-META-→ReginServer
-META-表中存储了Regionserver的region分区信息,如果某台Regionserver挂掉(通过Zookeeper感知),那么master可以把托管在这台RegionServer上的regin分区分配到其他RegionServer上。
存储的最小单位是block,那么索引的最小单位也是block。
读缓存blockCache,写缓冲Memstore,都是针对一个列簇讲的。
读会查询blockCache,Memstore,HFile三个区域的信息。
写到WAL和Memstore后成功返回,当Memstore满的时候,有一个后台线程把memstore中的内容写到HDFS中形成一个HFile。为了提高读性能,会做小合并(部分HFile参与),大合并(一个列簇的所有HFile参与,这时候会把有delete标记的记录彻底清理掉)
HBase类似于聚簇索引表,而每个Region就是叶节点。另外Hbase只能保证行内事务,但是使用类似思想实现的分布式数据库(cobar)可是做到单台server内的事务。
HBase通过把一张表分散成不同的region保存在不同的RegionServer上,从而保证了表的容量可以无限扩展,HDFS的数据本地性保证了读写性能不会降低,replication保证了数据的安全性。但是牺牲了传统数据库的ACID特性。