在 Linux 上搭建 HDFS 高可用(HA,High Availability),核心目标是:NameNode 不成为单点故障,通常通过 多个 NameNode + 共享存储(JournalNode)+ ZooKeeper 自动故障转移 来实现。
下面给你一套实战可用的 HDFS HA 搭建思路(基于 Hadoop 3.x,最常用方案)。
典型 HDFS HA 包含:
| 节点 | 角色 |
|---|---|
| node1 | NameNode(Active) |
| node2 | NameNode(Standby) |
| node1/node2/node3 | JournalNode |
| node1/node2/node3 | ZooKeeper |
| node3/node4/node5 | DataNode |
cat /etc/hosts
192.168.1.11 node1
192.168.1.12 node2
192.168.1.13 node3
# zoo.cfg
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
hdfs-site.xml<configuration>
<!-- Nameservice -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- NameNode RPC -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node2:8020</value>
</property>
<!-- HTTP -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node1:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node2:9870</value>
</property>
<!-- JournalNode -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/data/hadoop/journal</value>
</property>
<!-- 故障转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 隔离机制 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
</configuration>
core-site.xml<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>
</configuration>
hdfs --daemon start journalnode
# 在 node1
hdfs namenode -format
# 初始化 ZKFC
hdfs zkfc -formatZK
# node2
hdfs namenode -bootstrapStandby
hdfs --daemon start namenode
hdfs --daemon start zkfc
hdfs --daemon start datanode
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
杀掉 Active NameNode:
kill -9 <nn_pid>
观察是否 自动切换 Standby → Active
✅ ZKFC 没切换
→ 检查 ZooKeeper / SSH 免密 / fencing
✅ EditLog 不一致
→ JournalNode 必须奇数且全部启动
✅ Hadoop 3 端口变化
→ 8020(RPC) / 9870(Web)
如果你愿意,我可以:
你现在是 学习 / 生产环境 / 考试 用?