温馨提示×

centos如何部署hdfs高可用

小樊
44
2026-10-20 23:31:06
栏目: 智能运维

下面以 CentOS 7/8 为例,系统讲解 HDFS 高可用(HA) 的部署思路与关键步骤。HDFS HA 的核心是:NameNode 主备 + JournalNode + ZKFC + ZooKeeper。


一、HDFS HA 架构说明

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

三、基础环境准备(所有节点)

1. 关闭防火墙 & SELinux

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

2. 配置主机名与 hosts

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

3. 配置 SSH 免密(NameNode 之间)

ssh-keygen
ssh-copy-id node1
ssh-copy-id node2

4. 安装 JDK

yum install java-1.8.0-openjdk-devel -y

四、部署 ZooKeeper(3 节点)

1. 下载并解压

tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz -C /opt

2. 配置 zoo.cfg

dataDir=/data/zookeeper
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888

3. 创建 myid

echo 1 > /data/zookeeper/myid  # node1
echo 2 > /data/zookeeper/myid  # node2
echo 3 > /data/zookeeper/myid  # node3

4. 启动

zkServer.sh start

五、部署 Hadoop(HDFS HA)

1. 解压 Hadoop

tar -zxvf hadoop-3.3.6.tar.gz -C /opt

2. 配置 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>

3. 配置 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 HA

1. 启动 JournalNode

hdfs --daemon start journalnode

2. 格式化 NameNode(仅第一次)

hdfs namenode -format

3. 初始化 HA 状态到 ZooKeeper

hdfs zkfc -formatZK

4. 启动 NameNode

hdfs --daemon start namenode

5. 备 NameNode 同步

hdfs namenode -bootstrapStandby

6. 启动 ZKFC

hdfs --daemon start zkfc

7. 启动 DataNode

hdfs --daemon start datanode

七、验证 HA

hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2

杀死 Active NameNode:

kill -9 <nn_pid>

观察 Standby 是否自动切换为 Active。


八、常见问题

  • 脑裂:必须配置 fencing
  • JournalNode 必须奇數
  • ZooKeeper 必须先启动
  • 格式化只能做一次

如果你需要:

  • ✅ 一键部署脚本
  • ✅ 基于 Docker / K8s
  • ✅ 安全模式(Kerberos)
  • ✅ HDFS + YARN HA

告诉我你的环境和版本即可。

0 踩