- HealthMonitor:用于监控nameNode(NN)是否unavailable或者处于unhealth状态,定期check NN的健康状况,在NN健康状况发生变化时,通过回调函数把变化通知给ZKFailoverController
- ActiveStandbyElector:用于监控NN在zk中的状态,管理NN在zookeeper上的状态,zookeeper上对应node的结点发生变化时,通过回调函数把变化通知给ZKFailoverController
- ZKFailoverController: 驱动整个ZKFC的运转,通过向HealthMonitor和ActiveStandbyElector注册回调函数的方式订阅subscribe HealthMonitor和ActiveStandbyElector的事件并管理NN的状态,并做相应的处理。另外ZKFC还需要负责fencing。
- FailoverController: 提供做graceful failover的相关功能(dfs admin可以通过命令行工具手工发起failover)
通过增加了fencing的回调机制对ASE进行增强,详细如下:
1.1在获取了ActiveLock之后,通知本地NN成为了Active之前,检查breadcrumb znode的存在性
1)面包屑Znode存在的话,调用fenceOldActive(data)从那个NN上传入data数据,如果成功了,删除面包屑Znode
2)如果fencing失败,log一个error,扔掉lock,sleep一会,重新进行Election。这样也给其他NN有机会成为ActiveNN
3)使用本地NN的标识数据,创建一个新的breadcrumb node。
1.2当退出Election的时候,quiting的NN能够自己判定是否需要fencing。如果需要,将删除breadcrumb node,然后关闭ZK session。
2.zk(zookeeper)在zkfc中可以提供的功能:
(1) Failure detector: 及时发现出故障的NN,并通知zkfc
(2) Active node locator: 帮助客户端定位哪个是Active的NN
(3) Mutual exclusion of active state: 保证某一时刻只有一个Active的NN
架构图: