HMaster的failover 流程

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状态不一致的现象

猜你喜欢

转载自punishzhou.iteye.com/blog/1568590
今日推荐