温馨提示×

如何在Ubuntu HDFS上配置高可用性

小樊
38
2025-11-21 05:31:05
栏目: 智能运维

Ubuntu 上配置 HDFS 高可用 HA 实操指南

一 架构与前置准备

  • 架构要点
    • 使用 Active/Standby 双 NameNode,通过 **QJM(Quorum Journal Manager)**共享编辑日志,消除单点故障。
    • JournalNode 至少 3 台且为奇数,保证写入过半成功与可用性。
    • ZooKeeper 集群 3/5 台配合 **ZKFC(ZooKeeper Failover Controller)**实现自动故障转移;ZKFC 需与 NameNode 同机部署。
    • DataNode 向两台 NameNode 同时上报块信息,Standby 可快速接管。
  • 推荐节点规划(示例)
    • NameNode/ZKFC:ubuntu1、ubuntu2
    • JournalNode:ubuntu1、ubuntu2、ubuntu3
    • DataNode:ubuntu3、ubuntu4、ubuntu5
  • 基础环境
    • 关闭防火墙或放行端口(如 8020/8485/9870/2181),配置 /etc/hosts 主机映射,配置 SSH 免密,安装 JDK 1.8+,时间同步(如 chrony/ntp)。
    • 安装并启动 ZooKeeper 集群(3 节点为示例)。

二 核心配置示例

  • 说明
    • 以下为最小可用示例,按你的实际主机名与目录调整;端口示例:QJM 8485,NameNode RPC 8020,HTTP 9870(Hadoop 3.x),ZooKeeper 2181
  • core-site.xml
<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://mycluster</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/hadoop/tmp</value>
  </property>
  <property>
    <name>io.file.buffer.size</name>
    <value>4096</value>
  </property>
  <property>
    <name>fs.trash.interval</name>
    <value>10080</value>
  </property>
  <!-- ZooKeeper 地址 -->
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>ubuntu1:2181,ubuntu2:2181,ubuntu3:2181</value>
  </property>
</configuration>
  • hdfs-site.xml
<configuration>
  <!-- 基本目录 -->
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///home/hadoop/dfs/name</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///home/hadoop/dfs/data</value>
  </property>

  <!-- 命名服务与 NN 列表 -->
  <property>
    <name>dfs.nameservices</name>
    <value>mycluster</value>
  </property>
  <property>
    <name>dfs.ha.namenodes.mycluster</name>
    <value>nn1,nn2</value>
  </property>

  <!-- RPC 与 HTTP 地址 -->
  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn1</name>
    <value>ubuntu1:8020</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    <value>ubuntu2:8020</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.mycluster.nn1</name>
    <value>ubuntu1:9870</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.mycluster.nn2</name>
    <value>ubuntu2:9870</value>
  </property>

  <!-- QJM 共享编辑日志 -->
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://ubuntu1:8485;ubuntu2:8485;ubuntu3:8485/mycluster</value>
  </property>
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/home/hadoop/journal</value>
  </property>

  <!-- 客户端故障转移代理 -->
  <property>
    <name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>

  <!-- 隔离方法(SSH 示例,需免密) -->
  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
  </property>
  <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/hadoop/.ssh/id_rsa</value>
  </property>

  <!-- 启用自动故障转移 -->
  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>
</configuration>
  • 分发与权限
    • core-site.xml、hdfs-site.xml 分发到所有节点相同路径;确保 ubuntu1/ubuntu2SSH 免密 与私钥路径一致;如以 root 运行,需在 start-dfs.sh/stop-dfs.sh 等脚本顶部设置用户环境变量(如 HDFS_DATANODE_USER、HDFS_NAMENODE_USER、HDFS_ZKFC_USER 等)。

三 启动与验证

  • 启动顺序
    1. 启动 ZooKeeper(3 台)
      • zkServer.sh start
    2. 启动 JournalNode(3 台)
      • hadoop-daemon.sh start journalnode
    3. 格式化第一个 NameNode(仅一次)
      • hdfs namenode -format
    4. 在另一台 NameNode 引导 Standby(首次)
      • hdfs namenode -bootstrapStandby
    5. 初始化 ZKFC(任一 NN 执行)
      • hdfs zkfc -formatZK
    6. 启动 HDFS
      • start-dfs.sh
  • 常用验证
    • 查看进程:jps(应见到 NameNode/DataNode/JournalNode/ZKFC
    • 查看状态:hdfs haadmin -getServiceState nn1 / nn2(返回 active/standby
    • Web UI:访问 http://ubuntu1:9870http://ubuntu2:9870 查看 Active/Standby 与集群概况
    • 故障演练:kill -9 <Active NN 进程> 或断网,观察自动切换与恢复。

四 常见问题与排错要点

  • JournalNode 无法启动或未过半:确认 3 台 JN 已启动且磁盘可写,编辑日志目录权限正确;QJM 写入需多数派成功。
  • 自动故障转移失败:检查 ZooKeeper 连通性、ZKFC 是否运行、隔离方法(如 sshfence)与私钥路径是否正确;首次需执行 zkfc -formatZK
  • 两个 NameNode 同时 Active:多因未配置或失效的 fencing 方法,导致隔离不彻底;启用并验证 sshfence 能成功隔离旧 Active。
  • 客户端连不通/切换慢:确认 core-site.xmlfs.defaultFS=hdfs://mycluster,客户端能解析 mycluster;必要时调整故障转移代理与重试策略。
  • 端口与防火墙:放行 8020/8485/9870/2181;浏览器访问 9870 检查 Active/Standby 状态与 JournalNode 健康。

0