配置了hadoop ha后,namenode kill后,另一个namenode没有变为active,相当于ha配置白配了。然后看了官网的ha配置,发现是dfs.ha.fencing.methods属性的问题。
我原先是这样配置的:
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
后来改掉就可以了:
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
系统任意时间内只有一个namenode处于active状态,所以系统不能有两个active的NameNode。在发生failover时fencing的方法可以是sshfence和shell来防止有两个active的namenode。
sshfence ----- 使用ssh登录到active的namenode节点,然后杀掉进程。所以需要ssh无密码登录,以及指定私钥的位置。
shell ------ 是指运行shell命令来防止。
QJM方式本身有fencing功能,能保证只有一个namenode可以写journalnodes文件。但是在发生failover时,原来的active的namenode可能还在读请求,可能读到过时的数据,所以还是需要配置dfs.ha.fencing.methods方法,可以提高系统的可用性,可以配置为一个返回成功的方法(没有fencing作用),例如shell(/bin/true)。