HBase支持集群动态扩容,都归功于HMaster对HRegionServer的动态感知。本文基于hbase-1.2.0-cdh5.7.2版本进行讲述,不能的版本存在细微的差别,大体一致。
RegionServer的动态感知流程如下图所示:
分别从启动Master和RegionServer两个角度来讲解。
一、启动Master
1、Master启动后会尝试去ZK注册为active master
2、Active Master注册成功后,Master会从zk的/hbase/rs下获取RegionServer列表并封装成ServerName对象,同时阻塞等待(阻塞的条件较多,包括时间、注册rs的数量)rs的心跳注册;
3、完成阻塞等待后,将接收到心跳的rs列表与从ZK获取的rs列表合并,并存储在其内存中;
4、Master向ZK注册watcher,监听/hbase/rs node下的delete和change动作(注意这里并没有监听create动作,不能通过zk感知rs的上线)
二、启动RegionServer
1、首先在ZK /hbase/rs下创建当前rs的node(如果是重启rs,会先删除再重建);
2、调用master提供的rpc接口regionServerStartup方法,向Master正式注册
3、定期汇报心跳
RegionServer动态感知比较简单,建议在配置linux主机时,将主机别名与主机名设置一致,否则可能出现RegionServer向ZK注册的机器名与通过rpc向Master注册的机器名不一致,从而在下一次Active Master切换时,在Master web ui中出现单台机器的多个主机名。