下面以 CentOS 7/8 为例,系统讲解 HDFS 高可用(HA) 的部署思路与关键步骤。HDFS HA 的核心是:NameNode 主备 + JournalNode + ZKFC + ZooKeeper。
HDFS HA 至少需要以下角色:
| 角色 | 数量 | 说明 |
|---|---|---|
| NameNode (Active) | 1 | 主 NameNode |
| NameNode (Standby) | 1 | 备 NameNode |
| JournalNode | 3(奇数) | 编辑日志共享 |
| DataNode | ≥3 | 存储数据 |
| ZooKeeper | 3(奇数) | 选主与故障切换 |
| ZKFC | 每 NameNode 1 个 | 故障检测与切换 |
node1: NameNode + ZKFC + JournalNode + ZooKeeper
node2: NameNode + ZKFC + JournalNode + ZooKeeper
node3: JournalNode + DataNode + ZooKeeper
node4: DataNode
node5: DataNode
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
hostnamectl set-hostname node1
/etc/hosts
192.168.1.11 node1
192.168.1.12 node2
192.168.1.13 node3
192.168.1.14 node4
192.168.1.15 node5
ssh-keygen
ssh-copy-id node1
ssh-copy-id node2
yum install java-1.8.0-openjdk-devel -y
tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz -C /opt
zoo.cfgdataDir=/data/zookeeper
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
echo 1 > /data/zookeeper/myid # node1
echo 2 > /data/zookeeper/myid # node2
echo 3 > /data/zookeeper/myid # node3
zkServer.sh start
tar -zxvf hadoop-3.3.6.tar.gz -C /opt
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-site.xml<configuration>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<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>
<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>
<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/journalnode</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</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>
</configuration>
hdfs --daemon start journalnode
hdfs namenode -format
hdfs zkfc -formatZK
hdfs --daemon start namenode
hdfs namenode -bootstrapStandby
hdfs --daemon start zkfc
hdfs --daemon start datanode
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
杀死 Active NameNode:
kill -9 <nn_pid>
观察 Standby 是否自动切换为 Active。
fencing如果你需要:
告诉我你的环境和版本即可。