HA启动流程
1.健康监控
HealthMonitor调用doHealthChecks()发送两个远程调用:HAServiceProtocol#getServiceStatus
HAServiceProtocol#monitorHealth
确认NameNode状态为SERVICE_HEALTHY,如果此时NameNode没启动,ZKFC会关闭重启,直到NameNode进程启动。
2.选举
/hadoop-ha/${nameservice}/ActiveStandbyElectorLock
3.触发fencing
如果ActiveBreadCrumb节点有值会触发fencing。
4.写ZK
ActiveStandbyElector将Active的主机地址写入ZK的/hadoop-ha/${nameservice}/ActiveBreadCrumb节点
5.选举成功后
ZKFailoverController通知NameNode转换为Active状态。
原理
ZK路径
2020-05-12 11:03:16,685 INFO org.apache.hadoop.ha.ActiveStandbyElector: Yielding from election
ZKFC
ActiveStandbyElector:选举
HealthMonitor:监控NN状态
JournalNode
注意事项
fencing配置注意事项
<!-- 指定选择哪个隔离的方案,选择SSH -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
启动命令注意事项
没有数据启动HA启动命令
hdfs zkfc -formatZK
# Active 第一
hdfs namenode -format
# StandBy节点
hdfs namenode -bootstrapStandby
有数据的集群升级成HA启动命令
hdfs zkfc -formatZK
# namenode之前有数据
hdfs namenode -initializeSharedEdits
# StandBy节点
hdfs namenode -bootstrapStandby
手动主备切换
hdfs haadmin -failover nn1 nn2