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状态。

主备切换示意图
image.png

原理

ZK路径

2020-05-12 11:03:16,685 INFO org.apache.hadoop.ha.ActiveStandbyElector: Yielding from election

ZKFC

ActiveStandbyElector:选举
HealthMonitor:监控NN状态

JournalNode

注意事项

fencing配置注意事项

  1. <!-- 指定选择哪个隔离的方案,选择SSH -->
  2. <property>
  3. <name>dfs.ha.fencing.methods</name>
  4. <value>
  5. sshfence
  6. shell(/bin/true)
  7. </value>
  8. </property>
  9. <property>
  10. <name>dfs.ha.fencing.ssh.private-key-files</name>
  11. <value>/root/.ssh/id_rsa</value>
  12. </property>

启动命令注意事项

没有数据启动HA启动命令

  1. hdfs zkfc -formatZK
  2. # Active 第一
  3. hdfs namenode -format
  4. # StandBy节点
  5. hdfs namenode -bootstrapStandby

有数据的集群升级成HA启动命令

  1. hdfs zkfc -formatZK
  2. # namenode之前有数据
  3. hdfs namenode -initializeSharedEdits
  4. # StandBy节点
  5. hdfs namenode -bootstrapStandby

手动主备切换

  1. hdfs haadmin -failover nn1 nn2