温馨提示×

linux hdfs怎么搭高可用

小樊
45
2026-10-10 10:53:13
栏目: 智能运维

在 Linux 上搭建 HDFS 高可用(HA,High Availability),核心目标是:NameNode 不成为单点故障,通常通过 多个 NameNode + 共享存储(JournalNode)+ ZooKeeper 自动故障转移 来实现。

下面给你一套实战可用的 HDFS HA 搭建思路(基于 Hadoop 3.x,最常用方案)。


一、HDFS HA 架构组成

典型 HDFS HA 包含:

  1. Active NameNode
  2. Standby NameNode
  3. JournalNode(奇数台,≥3)
    • 用于 NameNode 之间共享 EditLog
  4. ZooKeeper(≥3 台)
    • 用于自动故障转移(ZKFC)
  5. DataNode(多台)
    • 同时向 Active / Standby NameNode 汇报

二、节点规划示例

节点 角色
node1 NameNode(Active)
node2 NameNode(Standby)
node1/node2/node3 JournalNode
node1/node2/node3 ZooKeeper
node3/node4/node5 DataNode

三、基础环境准备

1. 所有节点

  • JDK 8+
  • Hadoop 3.x
  • 主机名 + hosts 配置
  • SSH 免密(NameNode 之间)
  • 时间同步(NTP)
cat /etc/hosts
192.168.1.11 node1
192.168.1.12 node2
192.168.1.13 node3

四、配置 ZooKeeper(略,重点在 HDFS)

# zoo.cfg
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888

五、HDFS HA 核心配置

1. 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>

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>

六、启动 HDFS HA

1. 启动 JournalNode

hdfs --daemon start journalnode

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

# 在 node1
hdfs namenode -format

# 初始化 ZKFC
hdfs zkfc -formatZK

3. 同步 Standby NameNode

# node2
hdfs namenode -bootstrapStandby

4. 启动 NameNode & ZKFC

hdfs --daemon start namenode
hdfs --daemon start zkfc

5. 启动 DataNode

hdfs --daemon start datanode

七、验证 HA

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)


如果你愿意,我可以:

  • 给你 一键部署脚本
  • 或按 CDH / 原生 Hadoop 区分讲
  • 或画一张 HA 架构图

你现在是 学习 / 生产环境 / 考试 用?

0 踩