温馨提示×

怎样在Linux上实现HDFS的高可用

小樊
53
2025-09-25 10:00:46
栏目: 智能运维

一、前期准备

  1. 节点规划:至少需要3台服务器(用于部署NameNode、JournalNode、ZooKeeper),建议采用奇数台JournalNode(如3台)以保证多数派原则(避免脑裂)。所有节点需安装相同版本的Hadoop,并配置好JDK环境(建议JDK 1.8及以上)。
  2. 网络与权限:确保所有节点间IP可达,关闭防火墙或开放必要端口(如HDFS默认端口8020、JournalNode端口8485、ZooKeeper端口2181等)。配置节点间SSH免密登录(使用ssh-keygen生成密钥并分发至所有节点),便于后续元数据同步和故障转移。

二、配置核心组件

1. 配置JournalNode(共享存储层)

JournalNode是HDFS高可用的关键组件,用于在Active和Standby NameNode之间同步编辑日志(EditLog),确保元数据一致性。

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

2. 配置ZooKeeper(故障转移协调层)

ZooKeeper用于监控NameNode状态,实现自动故障转移(需提前安装ZooKeeper并配置集群)。

  • 编辑ZooKeeper配置文件zoo.cfg(所有ZooKeeper节点一致):
    server.1=zk1:2888:3888
    server.2=zk2:2888:3888
    server.3=zk3:2888:3888
    
  • 在每个ZooKeeper节点的dataDir目录下创建myid文件,内容为对应服务器ID(如zk1节点的myid内容为1)。
  • 启动ZooKeeper集群(在所有ZooKeeper节点上执行):
    zkServer.sh start
    

3. 配置HDFS高可用(NameNode层)

在所有NameNode节点上,修改core-site.xmlhdfs-site.xml

  • core-site.xml(指定HDFS默认文件系统和ZooKeeper集群):
    <property>
      <name>fs.defaultFS</name>
      <value>hdfs://mycluster</value> <!-- HDFS集群名称 -->
    </property>
    <property>
      <name>ha.zookeeper.quorum</name>
      <value>zk1:2181,zk2:2181,zk3:2181</value> <!-- ZooKeeper集群地址 -->
    </property>
    
  • hdfs-site.xml(配置NameNode高可用参数):
    <property>
      <name>dfs.nameservices</name>
      <value>mycluster</value> <!-- 与core-site.xml中的fs.defaultFS一致 -->
    </property>
    <property>
      <name>dfs.ha.namenodes.mycluster</name>
      <value>nn1,nn2</value> <!-- NameNode标识(Active为nn1,Standby为nn2) -->
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn1</name>
      <value>nn1:8020</value> <!-- Active NameNode RPC地址 -->
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn2</name>
      <value>nn2:8020</value> <!-- Standby NameNode RPC地址 -->
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn1</name>
      <value>nn1:50070</value> <!-- Active NameNode HTTP地址 -->
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn2</name>
      <value>nn2:50070</value> <!-- Standby NameNode HTTP地址 -->
    </property>
    <property>
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://zk1:8485;zk2:8485;zk3:8485/mycluster</value> <!-- JournalNode共享存储路径 -->
    </property>
    <property>
      <name>dfs.client.failover.proxy.provider.mycluster</name>
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> <!-- 客户端故障转移代理 -->
    </property>
    <property>
      <name>dfs.ha.fencing.methods</name>
      <value>sshfence</value> <!-- 故障转移隔离方法(防止脑裂) -->
    </property>
    <property>
      <name>dfs.ha.fencing.ssh.private-key-files</name>
      <value>/path/to/private/key</value> <!-- SSH私钥路径(用于隔离) -->
    </property>
    <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>/path/to/journalnode/data</value> <!-- JournalNode数据目录(与之前一致) -->
    </property>
    

4. 同步NameNode元数据

在其中一个NameNode节点(如nn1)上执行格式化操作,生成元数据:

hdfs namenode -format

将格式化后的元数据同步到另一个NameNode节点(如nn2):

hdfs namenode -bootstrapStandby

三、启动HDFS高可用集群

  1. 启动JournalNode:已在前面完成(所有JournalNode节点执行hadoop-daemon.sh start journalnode)。
  2. 启动NameNode:在Active NameNode节点(如nn1)上启动NameNode:
    $HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
    
  3. 启动Standby NameNode:在Standby NameNode节点(如nn2)上启动NameNode(会自动同步Active节点的元数据):
    $HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
    
  4. 启动DataNode:在所有DataNode节点上启动DataNode服务:
    $HADOOP_HOME/sbin/start-dfs.sh
    

四、验证高可用功能

  1. 检查集群状态:使用以下命令查看NameNode状态,确认Active和Standby节点正常:
    hdfs dfsadmin -report
    
    输出应显示两个NameNode,其中一个为active,另一个为standby
  2. 测试故障转移:模拟Active NameNode故障(如在nn1上执行stop-dfs.sh停止NameNode),等待1-2分钟后,检查Standby NameNode(nn2)是否自动切换为Active状态:
    hdfs dfsadmin -getServiceState nn2  # 应返回"active"
    
  3. 客户端访问测试:在客户端节点上配置core-site.xmlfs.defaultFS指向hdfs://mycluster),执行HDFS操作(如hdfs dfs -ls /),确认能正常访问。故障转移后,客户端应自动连接新的Active NameNode。

注意事项

  • 数据副本:配置HDFS数据副本因子(dfs.replication,默认3),确保数据冗余。
  • 监控告警:使用Prometheus+Grafana等工具监控NameNode、JournalNode、ZooKeeper的状态,设置告警规则(如节点宕机、元数据同步延迟)。
  • 定期维护:定期备份JournalNode数据,更新Hadoop版本以修复安全漏洞。

0