温馨提示×

如何确保CentOS HDFS的高可用性

小樊
41
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节点上:

  • 编辑hdfs-site.xml,添加JournalNode数据目录配置:
    <property> <name>dfs.journalnode.edits.dir</name> <value>/path/to/journalnode/data</value> <!-- 本地存储路径,需提前创建 --> </property> 
  • 启动JournalNode服务(所有JournalNode节点执行):
    $HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode 
  • 格式化JournalNode(任选一台NameNode执行,仅首次启动需要):
    hdfs namenode -formatJournalNode 

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集群并验证

  • 启动所有JournalNode(已在步骤2完成)。
  • 启动所有DataNode:
    $HADOOP_HOME/sbin/start-datanode.sh 
  • 启动HDFS集群(可选,若已单独启动各组件可跳过):
    $HADOOP_HOME/sbin/start-dfs.sh 
  • 验证集群状态:
    hdfs dfsadmin -report # 查看NameNode、DataNode状态 
  • 测试故障转移:手动停止Active NameNode(如namenode1的NameNode服务),观察Standby NameNode(namenode2)是否自动切换为Active状态(可通过Web界面或hdfs dfsadmin -report确认)。

7. 后续维护与优化

  • 监控告警:部署Prometheus+Grafana监控集群状态(如NameNode CPU、内存、磁盘使用率,DataNode心跳,ZooKeeper连接数),设置异常告警(邮件、短信)。
  • 数据备份:定期备份JournalNode数据目录(如/path/to/journalnode/data)和NameNode元数据目录(如/path/to/namenode/name),防止数据丢失。
  • 日志分析:定期检查NameNode、DataNode日志(位于$HADOOP_HOME/logs),排查潜在问题(如元数据同步延迟、节点通信故障)。
  • 配置优化:根据业务需求调整HDFS参数(如dfs.replication副本数,默认3;dfs.blocksize块大小,默认128MB),提升性能与可靠性。

0