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_HOME 与 PATH。
- 安装并启动 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:50070 与 http://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 实现透明故障切换;确保应用具备重试逻辑以容忍短暂切换抖动。