以我的经验,杀死原来ACTIVE namenode上的NameNode进程,会成功自动切换;而采用down掉网卡(ifdown <dev>命令)的方法,不一定能够成功切换。根据我的经验这主要是与fencing方法的设置有关。Hadoop提供的两种fencing方法是sshfence和shell,其中sshfence要求ssh登录到目标结点杀死NameNode进程,因此当仅仅配置fencing方法是sshfence之后,当原active namenode的网卡down掉之后,原standby namenode的zkfc实际上已经不能ssh到原active namenode上杀死NameNode进程,因此该fencing不能成功执行,因此无法继续切换自己的状态成active,只能不断尝试。这可以通过tail -f命令观察原standby namenode的zkfc日志知道这个问题。查看这个日志,应该可以包括下面消息在内的信息:
“INFO org.apache.hadoop.ha.ZKFailoverController: Should fence: NameNode at ...”。
sshfence失败导致不能切换之后,如果这时候恢复网卡连通性(ifup <dev>),那么切换过程又可以继续进行下去,仍然完成将原来active/standby结点状态对调的切换。
修改dfs.ha.fencing.methods的配置,增加shell(/bin/true)方法或仅仅配置这个方法,可以使得网卡中断后切换成功进行。注意,我注意到dfs.ha.fencing.methods这个属性和dfs.ha.fencing.ssh.private-key-files属性都在core-default.xml找到,所以我将配置移到了core-site.xml中(不过感觉没有影响)。
成功切换之后,也有一种情况下需要注意一下,就是当网卡恢复连通后,原来active namenode的NameNode进程反而因为恢复连通后导致的写edits log的问题退出进程(可以在该结点的namenode日志看到“FATAL org.apache.hadoop.hdfs.server.namenode.FSEditLog: Error: flush failed for required journal”的信息)。因此可能还有手工重新启动一下namenode进程(启动后是standby状态)。
大致的图示如下: