温馨提示×

Debian如何实现HDFS高可用性

小樊
32
2025-12-23 04:03:54
栏目: 智能运维

在 Debian 上实现 HDFS 高可用

一、架构与前置条件

  • 架构要点
    • 部署 2 个 NameNode(Active/Standby),通过 ZooKeeper + ZKFailoverController(ZKFC) 实现自动故障转移。
    • 使用 QJM(Quorum Journal Manager) 共享编辑日志,通常部署 3 个 JournalNode(奇数,过半写入成功),保证元数据一致性与可用性。
    • DataNode 同时向两台 NameNode 上报块信息,保证故障切换后数据块映射可用。
    • 高可用启用后,传统的 SecondaryNameNode 不再承担故障接管职责,仅用于周期性检查点(Checkpoint),可与集群并存但不参与主备切换。
  • 节点与网络建议
    • 至少准备 5 台 Debian 主机nn1、nn2(NameNode)、jn1–jn3(JournalNode)、其余为 DataNode;也可将 JournalNode 与 DataNode 混部以节省节点。
    • 配置 主机名解析(/etc/hosts 或 DNS)SSH 免密时间同步(NTP/chrony)防火墙放行端口(如 8020 RPC、50070 HTTP、2181 ZK、8485 QJM)。

二、安装与基础配置

  • 安装 Java 与 Hadoop(以 Hadoop 3.3.x 为例)
    • 安装 JDK(示例采用 Adoptium Temurin 8):
      • 添加仓库并安装:sudo apt-get update && sudo apt-get install -y temurin-8-jdk
    • 下载并解压 Hadoop 至统一目录(如 /opt/hadoop),配置环境变量 HADOOP_HOMEPATH
  • 安装并启动 ZooKeeper 集群(3 节点示例)
    • 配置 conf/zoo.cfg
      • dataDir=/var/lib/zookeeper
      • clientPort=2181
      • server.1=zk1:2888:3888
      • server.2=zk2:2888:3888
      • server.3=zk3:2888:3888
    • 各节点 dataDir 下创建 myid 文件写入 1/2/3,分别启动 ZooKeeper。
  • Hadoop 目录准备
    • 为 NameNode 与 JournalNode 创建本地元数据与日志目录(如 /var/lib/hadoop/dfs/name/var/lib/hadoop/journal),并确保目录权限正确。

三、关键配置

  • 编辑 core-site.xml
    • 指定 HDFS 命名服务与 ZooKeeper 地址:
      • fs.defaultFS:hdfs://mycluster
      • ha.zookeeper.quorum:zk1:2181,zk2:2181,zk3:2181
  • 编辑 hdfs-site.xml
    • 启用 HA 与自动故障转移,并配置 QJM 与 fencing:
      • dfs.nameservices:mycluster
      • dfs.ha.namenodes.mycluster:nn1,nn2
      • dfs.namenode.rpc-address.mycluster.nn1:nn1:8020
      • dfs.namenode.rpc-address.mycluster.nn2:nn2:8020
      • dfs.namenode.http-address.mycluster.nn1:nn1:50070
      • dfs.namenode.http-address.mycluster.nn2:nn2:50070
      • dfs.namenode.shared.edits.dir:qjournal://jn1:8485;jn2:8485;jn3:8485/mycluster
      • dfs.client.failover.proxy.provider.mycluster:org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
      • dfs.ha.automatic-failover.enabled:true
      • dfs.ha.fencing.methods:sshfence(或 shell(/bin/true) 仅测试)
      • dfs.ha.fencing.ssh.private-key-files:/root/.ssh/id_rsa
      • dfs.replication:3(建议与 DataNode 数量匹配)
  • 说明
    • 端口示例:8020(RPC)、50070(HTTP)、8485(QJM);如与系统端口冲突请调整。
    • 若需手动故障转移,可将 dfs.ha.automatic-failover.enabled 设为 false,使用 hdfs haadmin 执行手动切换。

四、启动与初始化步骤

  • 启动 JournalNode
    • jn1–jn3 执行:hdfs --daemon start journalnode(或 $HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode)
  • 格式化并引导 Active NameNode
    • nn1 执行:hdfs namenode -format
    • 启动 nn1:hdfs --daemon start namenode
    • nn2 执行同步引导:hdfs namenode -bootstrapStandby
    • 启动 nn2:hdfs --daemon start namenode
  • 初始化 ZooKeeper 故障转移控制器(ZKFC)
    • nn1、nn2 执行:hdfs zkfc -formatZK
    • 启动 ZKFC:hdfs --daemon start zkfc
  • 启动 DataNode
    • 在各 DataNode 执行:hdfs --daemon start datanode
  • 验证
    • 查看 NameNode 状态:hdfs haadmin -report
    • 查看集群健康:hdfs dfsadmin -report
    • 访问 http://nn1:50070http://nn2:50070 观察 Active/Standby 状态。

五、验证与运维要点

  • 故障转移测试
    • 方式一(安全):hdfs haadmin -failover --forcefence --forceactive nn1 nn2
    • 方式二(模拟宕机):在 Active NameNode 上停止进程或关机,观察 ZKFC 是否在约数十秒内完成 Active/Standby 切换,并确认客户端写入不中断(重试机制生效)。
  • 常见注意事项
    • JournalNode 数量应为 奇数(≥3),满足“过半写入”以保证可用性。
    • 启用自动故障转移时,务必配置 fencing 方法(如 sshfence),避免脑裂;生产环境不建议使用 shell(/bin/true)
    • 高可用启用后,SecondaryNameNode 不替代 Standby,仅用于 Checkpoint;如需保留,可与集群并存但请勿依赖其进行故障接管。
    • 客户端连接建议使用命名服务 hdfs://mycluster,由 ConfiguredFailoverProxyProvider 实现透明故障切换;确保应用具备重试逻辑以容忍短暂切换抖动。

0