HBase采用Master/Slave架构搭建集群,它隶属于Hadoop生态系统,由以下节点组成:
HMaster节点
HMaster是HBase主从集群架构中的中央节点,通常一个HBase集群存在多个HMaster节点,其中一个为Active Master,其余为Backup Master
HBase每时每刻都只有一个hmaster主服务器程序在运行,hmaster将region分配给region服务器,协调region服务器的负载并维护集群的状态。HMaster不会对外提供数据服务,而是由HRegionServer负载所有的regions的读写请求及操作。
由于HMaster只维护表和region的元数据,而不参与数据的输入/输出过程,hmaster失效仅仅会导致所有的元数据无法被修改,但表的数据读/写还是可以正常进行的
HMaster没有单点故障问题,可以启动多个HMaster,通过Zookeeper的Master Election
机制保证同时只有一个HMaster处于Action状态,其他的HMaster则处于热备状态,一般
情况下会启动两个HMaster,非Active的HMater会定期的和Active HMaster通信以获得其
最新状态,从而保证它是实时更新的,因而如果已启动了多个HMaster反而会增加Active
HMaster的负担。前边已经介绍过HMaster主要用于HRegion的分配和管理,DDK(Data
Defuinition Language。table的对新建、删除、修改等)的实现等。即它主要有两方面的
职责:
HRegionServer节点
HRegionServer一般和DataNode在同一台机器上运行,实现数据的本地性.HRegionServer存活和管理多个HRegion,由WAL(HLog)、BlockCache、MemStore、HFile组成。
1、WAL即Write Ahead Log,在早期版本中成为HLog,它是HDFS上的一个文件,如其名字所表示的,所有写操作都会先保证将写操作写入这个Log文件后才会真正更新MemStroe,最后写入HFile正,采用这种模式,可以保证HRegionServer宕机之后,我们依然可以从该Log文件中恢复数据,Replay(重新执行)所有的操作,而不至于数据丢失。
2.BlockCache是一个读缓存,
每个服务器只有一个BlockCache,即“引用局部性”原理(也应用于cpu,分空间局部性和时间局部性,空间局部性是指cpu在某一时刻需要某个数据A,那么有很大的概率在下一时候cpu需要另一个数据在A数据的附近;时间局部性是指某个数据再被访问过一次之后,它有很大的概率在不就得将来会再次被访问)因此会将读取的数据周围的数据也预读取到内存中,以提升读的性能。
这样设计的目的是为了提高缓存的命中率
HBase中默认on-heap LruBlockCache。(LRU -evicted,是一种数据的回收策略, LRU– 最近最少使用的:移除最长时间不被使用的对象。)
3.HRegion是一个Table中的一个Region在一个HRegionServer中的表达。
一个Table可以有一个或者多个HRegion,它们可以在一个相同的HRegionServer上,也可以分布在不同的HRegionServer上,一个HRegionServer可以有多个HRegion,它们分别属于不同的Table。
HRegion由多个Store(HStore)构成,每个HStore对应了一个Tabke在这个HRegion中的一个列族(column family),即每个Colums就是一个集中存储单元,因而最好将具有相近I/O特性的列存储在同一个列族中,以实现高效读取(数据局部性原理,可以提高缓存的命中率)。HStore是HBase中存储的核心,它实现了读写HDFS功能,一个HStore由一个MemStore和0或多个StoreFile(HFile)组成
4.MemStore是一个写缓存(In Memory Sorted Buffer)
所有数据的写在完成WAL日志写后,会写入MemStore中,由MemStore根据一定的算法(LSM-TREE算法 日志合并树算法,这个算法的作用是将数据顺序写磁盘,而不是随机写,减少磁头调度时间,从而提高写入性能)将数据Flush到底层的HDFS文件中(HFile),通常每个HRegion中的每个 Column Family有一个自己的MemStore。
5.HFile(StoreFile) 用于存储HBase的数据(Cell/KeyValue)。
在HFile中的数据是按RowKey、Column Family、Column排序,对相同的Cell(即这三个值都一样),则按timestamp倒序排列。
因为Hbase的HFile是存到HDFS上,所以Hbase实际上是具备数据的副本冗余机制的。
Zookeeper集群—协调者
ZooKeeper(根据Google的《The Chubby lock service for loosely coupled distributed System》)为HBase集群提供协调服
务,它管理者HMaster和HRegionServer的状态(available/alive等),并且会在它们宕机时通知给HMaster,从而HMaster可以
实现HMaster之间的failover(失败恢复),或者对宕机的HRegionServer中的HRegion集合的修复(将它们分配给其他的
HRegionServer)。Zookeeper集群本身使用一致性协议(PAXOS协议,PAXOS算法的思想是:在分布式的环境下,如何就
某个决议达成一致性的算法,PAXOS算法的缺点就是存在活锁的问题,ZK是基于PAXOS实现的Fast PAXOS)保证每个节点状态的一致性。
另外,HMaster通过监听ZooKeeper中的Ephemeral节点(默认:/hbase/rs/*)来监控HRegionServer的加入和宕机。在第一个HMaster连接到ZooKeeper时会创建Ephemeral节点(默认:/hbasae/master)来表示Active的HMaster,其后加进来的HMaster则监听该Ephemeral节点,如果当前Active的HMaster宕机,则该节点消失,因而其他HMaster得到通知,而将自身转换成Active的HMaster,在变为Active的HMaster之前,它会创建在/hbase/back-masters/下创建自己的Ephemeral节点。
HBase使用RowKey将表水平切割成多个HRegion,从HMaster的角度,每个HRegion都记录了它的StartKey和EndKey,由于RowKey是排序的,因而Client可以通过HMaster快速的定位每个RowKey在哪个HRegion中。HRegion有HMaster分配到响应的HRegionServer中,然后又HRegionServer负责HRegion的启动和管理,和Client的通信,负责数据的读(使用HDFS)。每个HRegionServer可以同时管理1000个左右的HRegion,超过1000个会引起性能问题