1 异常场景
1.1 kill ANN
现象:SNN变为ANN
解释:
- ANN所在HealthMonitor检测到健康状态为SERVICE_NOT_RESPONDING,发生状态切换,执行回调函数
- 在回调函数中执行quitElection(true)方法(参数为true代表不删除ActiveBreadCrumb节点,该节点存在代表需要fence)退出选举,设置服务状态为INITIALIZING
- 在quitElection()方法中会断开与zookeeper的连接并销毁zookeeper客户端对象
- 在会话超时时间过期后,zookeeper中的ActiveStandbyElectorLock节点被销毁
- SNN所在节点的ZKFC观察到ActiveStandbyElectorLock节点被删除(在构造zookeeper客户端对象时就关联了watch,会观察连接和节点变化情况),会调用joinElectionInternal()方法加入选举,尝试创建ActiveStandbyElectorLock节点成功,变为ANN。
此时,如果再启动原ANN节点的Namenode进程,则该Namenode状态会保持为Standby,因为此时ActiveStandbyElectorLock节点已经被原SNN节点持有。
1.2 kill ANN节点所在的DFSZKFailoverController
现象:ANN节点变为SNN,SNN节点变为ANN
解释:
- DFSZKFailoverController被kill,与zookeeper的会话超时,ActiveStandbyElectorLock节点被自动删除。
- SNN所在节点的ZKFC观察到ActiveStandbyElectorLock节点被删除,会调用joinElectionInternal()方法加入选举,尝试创建ActiveStandbyElectorLock节点成功,变为ANN。
- 再调用becomeActive()变为ANN之前会执行fence过程,fence会首先通过代理对另一个Namenode调用transitionToStandby()方法令其优雅的变为Standby状态,在这个场景中会执行成功。
1.3 删除znode
现象:重新进行选举,随机变为ANN和SNN
解释:
- 两个ZKFC都观察到ActiveStandbyElectorLock节点被删除,ANN节点会调用enterNeutralMode()方法和joinEletionInternal()方法,SNN节点会调用joinEletionInternal()方法。
- 之后流程和正常启动过程类似
1.4 kill zookeeper集群
现象:没有变化,集群仍正常提供服务
解释:
- 两个ZKFC都观察到和zookeeper的连接断开(DISCONNECTED状态)
- 两个ZKFC都调用enterNeutralMode()方法,这个方法不会执行任何功能逻辑,只是改变现在的一个状态标识
- 此时