HBase的master重启时走的是failover流程。
由于在HMaster挂掉的瞬间有很多正在执行的事务,如:
1. 某个table可能正在disable到一半,master挂掉
2. create table到一半,master挂掉
3. move 动作到一半,master挂掉当
master挂掉的时候,这些动作是不一致的,即可能出于一个中间状态。如某张表的某些region上线,某些却无法访问。
更有甚者在master1挂掉期间,又发生了regionserver的宕机事件。
当master重启时需要把事务或者继续完成或者回滚,达到最终一致的效果。把hmaster的failover分成两部分来理解:
1.master挂掉期间没有regionserver挂掉这种情况比较简单。
1.1.扫描Meta表将所有region加入master内存中,除了以下几种情况:
1.1.1 region的server address不存在,发生在create table时候master挂掉,此时meta表中值写了该region
的info。(对于这种情况90似乎也没有好的解决办法,只能是在meta表中有垃圾信息存在)
1.1.2 region所在的table是disabling或是disabled(disabling是disable table到一半master挂掉导致zk状态
一直没有更新,disabled说明disabled已经成功了,region都已经关闭了也无需加入master内存)
1.1.3 父region是不上线的
1.2.找到zk上面所有unassigned节点进行如下处理(任何对region的ddl操作都是通过zk来保持一致性的,因此需要对
zk上面的节点进行整理和删除等)
1.2.1 如果RIT中有该节点的region(正常hmaster启动的时候rit是空的,但是有一种情况是,此时有RS挂了,要
处理ssh事件,会将该rs的region重新分配加入到rit中),因此对于rit已有的region就不需要再重新加入了
1.2.2 对于这些在rit中node节点数据
如果是M_ZK_REGION_CLOSING,说明有regionserver正在close该region,rs后续会更新zk上的信息的,故只需将
其加入RIT中即可
如果是RS_ZK_REGION_CLOSED,说明rs已经将region关闭了,但是有可能master未收到这个事件就挂了,所以要
将其加入RIT,然后继续调用closedRegionhandler.process来清除master内存数据
如果是RS_ZK_REGION_FAILED_OPEN,说明在open region时候出错,此时rs会关闭region,收到此事件master
一样加入RIT,并ClosedRegionHandler .process
如果是M_ZK_REGION_OFFLINE,此时也要ClosedRegionHandler .process,因为可能和rs的rpc通信尚未发出请
求就挂了,zk节点就一致不会更新,该region就不会再分配。
如果是RS_ZK_REGION_OPENING,region正在被rs打开,rs会更新zk节点,只要加入rit即可
如果是RS_ZK_REGION_OPENED,region已经打开,但该事件可能未被master收到,故要openedregionhanlder
更新master内存
以上如果有region处于disabling和disabled的状态的话是不会再open region的
注:processfailover以后master会对disabling的table重新disable。这样可防止region状态不一致的现象