HBase系统架构

HBase是基于列式存储的分布式数据库,底层存储采用的是LSM树,是Hadoop生态下核心技术之一。它构建在HDFS之上,内置容错恢复与数据冗余,扩展性好(可横向扩展);采用列式存储,完全分布式(数据分区、故障自动恢复)。

HBase架构

HBase采用主-从(Master/Slave)架构,由以下类型节点组成:

  • HMaster节点
  • RegionServer节点
  • ZooKeeper集群

HMaster和NameNode都支持多个热备份,使用ZooKeeper来做协调。

ZooKeeper一般由三台机器组成一个集群,内部使用PAXOS算法,可以支持同时少于半数的宕机。

HMaster节点

HMaster是HBase集群中的主控服务器。

HMaster主要用于HRegion的分配和管理,DDL(既Table的新建、删除、修改等)的实现等,既它主要有两方面的职责:

  • 1) 协调HRegionServer。启动时HRegion的分配,以及负载均衡和修复时HRegion的重新分配。监控集群中所有HRegionServer的状态(通过心跳和监听ZooKeeper中的状态)。
  • 2) 管理职能。创建、删除、修改Table的定义(namespace和table的增删改,column familiy的增删改等)。

默认,HMaster运行在端口16000,其HTTP Web UI使用端口16010。

HMaster没有单点故障问题,可以启动多个HMaster,通过ZooKeeper的Master Election机制保证同时只有一个HMaster出于Active状态,其他的HMaster则处于热备份状态。一般情况下会启动两个HMaster,非Active的HMaster会定期的和Active HMaster通信以获取其最新状态,从而保证它是实时更新的,因而如果启动了多个HMaster反而增加了Active HMaster的负担。

HRegionServer

HRegionServer是HBase集群中具体对外提供服务的进程。其功能可总结如下:

  • 服务于分配给它的regions(表)
  • 处理客户端的读/写请求
  • 将缓存刷新(flush)到HDFS
  • 维护WAL预写日志(Write-Ahead logs)
  • 执行compactions
  • 负责处理region split(拆分region)

HRegion

HBase使用RowKey(行键)将表水平切割成多个HRegion。从HMaster的角度,每个HRegion都纪录了它的StartKey和EndKey。

RowKey是排序的,Client可以通过HMaster快速定位每个RowKey在哪个Region中。

Region由HMaster分配到相应的RegionServer中,然后由RegionServer负责Region的启动和管理、和Client的通信、负责数据的读(使用HDFS)。

每个RegionServer可以同时管理1000个左右的Region(实际少(20-200)而大(5-20G))。

ZooKeeper

ZooKeeper是HBase集群的协调者,为HBase集群提供协调服务。

它存放整个HBase集群的元数据以及集群的状态信息。

它存储HMaster的地址,并存储HBase中表的设计模式。

它实时管理着HMaster和HRegionServer的状态,并且会在它们宕机时通知给HMaster,从而HMaster可以实现HMaster之间的failover,或对宕机的HRegionServer中的HRegion的修复(将它们分配给其他的HRegionServer)。

ZooKeeper集群本身使用一致性协议(PAXOS协议)保证每个节点状态的一致性。

组件协同工作流程:

ZooKeeper协调集群所有节点的共享信息,在HMaster和HRegionServer连接到ZooKeeper后创建Ephemeral节点,并使用Heartbeat机制维持这个节点的存活状态,如果某个Ephemeral节点实效,则HMaster会收到通知,并做相应的处理。

另外,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节点。


《Spark原理深入与编程实战》