图片来源https://issues.apache.org/jira/secure/attachment/12521279/zkfc-design.pdf
ZKFC 的作用: 监测NameNode,进行active, standby 之间的切换。
这张图显示ZKFC 的具体组成:由HealthMonitor, ActiveStandbyElector 组成。ZKFC 会把回调类
HealthCallbacks,ActiveStandbyElectorCallback注册到HealthMonitor,ActiveStandbyElector 中
HealthMonitor: 监测NN的状态
ActiveStandbyElecotor: 相当于zookeeper的Client,监视着znode(zkLockFilePath,zkBreadCrumbPath), 当znode 发生变化的时候,进行抢夺active namenode, 退化成standby namenode 等工作
org.apache.hadoop.ha.ZKFailoverController( 简称ZKFC), org.apache.hadoop.ha.HealthMonitor(简称HM), org.apache.hadoop.ha.ActiveStandbyElector(简称Elector)
两个NN启动时:
各自的HM 监测到各自的NN 状态发生变化,从State.INITIALIZING 转到State.SERVICE_HEALTHY 触发了ZKFC的org.apache.hadoop.ha.ZKFailoverController#recheckElectability函数,ZKFC 让Elector 执行org.apache.hadoop.ha.ActiveStandbyElector#joinElection函数参与选举,在joinElection函数中,Elector 要创建znode ,
其znode path 为zkLockFilePath,该znode类型为EPHEMERAL(临时类型)。并将自己(ELector)注册为zookeeper的watcher, 之后在org.apache.hadoop.ha.ActiveStandbyElector#processResult接收到事件。在这个函数里
决定了哪个NN 成为activeNameNode, 哪个NN 成为standby NameNode. 判断依据就是谁先创建了
zkLockFilePath znode, 谁就
becomeActive。另一个就becomeStandby
具体代码: