centos

如何确保CentOS HDFS的高可用性

小樊
50
2025-09-20 10:44:36
栏目: 智能运维

1. 前提准备
确保所有节点(至少2台NameNode、3台JournalNode、多台DataNode)已安装JDK(1.8及以上)、Hadoop(2.7及以上),并配置好SSH免密登录(节点间可无密码互相访问),网络互通(能互相解析主机名)。

2. 配置JournalNode集群(元数据同步基础)
JournalNode用于存储NameNode的编辑日志(edits log),确保Active与Standby NameNode元数据一致。在每台JournalNode节点上:

3. 配置NameNode高可用(核心步骤)
hdfs-site.xml中添加以下关键配置(以集群名称mycluster为例):

<!-- 集群名称 -->
<property>
  <name>dfs.nameservices</name>
  <value>mycluster</value>
</property>
<!-- 集群内的NameNode列表(逗号分隔) -->
<property>
  <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value> <!-- nn1:Active NameNode; nn2:Standby NameNode -->
</property>
<!-- Active NameNode的RPC地址 -->
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  <value>namenode1-host:8020</value>
</property>
<!-- Standby NameNode的RPC地址 -->
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>namenode2-host:8020</value>
</property>
<!-- 共享编辑日志目录(JournalNode集群地址,奇数个节点,如3个) -->
<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://jn1-host:8485;jn2-host:8485;jn3-host:8485/mycluster</value>
</property>
<!-- 客户端故障转移代理(自动选择Active NameNode) -->
<property>
  <name>dfs.client.failover.proxy.provider.mycluster</name>
  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 自动故障转移开关(必须开启) -->
<property>
  <name>dfs.ha.automatic-failover.enabled</name>
  <value>true</value>
</property>
<!-- 故障转移隔离机制(防止脑裂,推荐sshfence) -->
<property>
  <name>dfs.ha.fencing.methods</name>
  <value>sshfence</value>
</property>
<!-- SSH私钥路径(用于故障转移时的隔离操作) -->
<property>
  <name>dfs.ha.fencing.ssh.private-key-files</name>
  <value>/home/hadoop/.ssh/id_rsa</value> <!-- 替换为实际私钥路径 -->
</property>

core-site.xml中配置默认文件系统:

<property>
  <name>fs.defaultFS</name>
  <value>hdfs://mycluster</value> <!-- 指向集群名称 -->
</property>

4. 同步NameNode元数据(初始化Standby节点)
在Active NameNode(如namenode1)上执行格式化:

hdfs namenode -format

启动Active NameNode:

$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode

在Standby NameNode(如namenode2)上同步元数据:

hdfs namenode -bootstrapStandby

启动Standby NameNode:

$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode

5. 配置ZooKeeper Failover Controller(ZKFC,自动故障转移核心)
ZKFC用于监控NameNode状态,触发自动故障转移。在hdfs-site.xml中添加:

<!-- 开启ZKFC服务 -->
<property>
  <name>dfs.zkfc.enable</name>
  <value>true</value>
</property>
<!-- ZKFC端口(默认8080,可自定义) -->
<property>
  <name>dfs.zkfc.port</name>
  <value>8080</value>
</property>
<!-- ZooKeeper集群地址(需与ZooKeeper配置一致,奇数个节点) -->
<property>
  <name>dfs.zkfc.hosts</name>
  <value>zk1-host:2181,zk2-host:2181,zk3-host:2181</value>
</property>

在每台NameNode节点上启动ZKFC服务:

$HADOOP_HOME/sbin/hadoop-daemon.sh start zkfc

6. 启动HDFS集群并验证

7. 后续维护与优化

0
看了该问题的人还看了