centos

如何实现CentOS HDFS高可用

小樊
47
2025-10-22 06:07:28
栏目: 智能运维

一、前期准备

  1. 集群规划:至少需要3台CentOS服务器(建议奇数台,如3或5台),分别部署NameNode(2台,一主一备)、JournalNode(3台,奇数台保证多数派)、ZooKeeper(3台,用于故障转移协调)、DataNode(根据存储需求配置)。所有节点需处于同一局域网,确保网络互通(延迟<100ms)。
  2. 基础环境配置
    • 安装Java JDK 8+:sudo yum install java-1.8.0-openjdk-devel,配置JAVA_HOME环境变量(/etc/profile.d/java.sh)并生效。
    • 下载并解压Hadoop(建议3.x版本):wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz,解压至/opt/,配置HADOOP_HOME环境变量(/etc/profile.d/hadoop.sh)并生效。
    • 配置SSH免密登录:在所有节点间生成密钥(ssh-keygen -t rsa),并将公钥(id_rsa.pub)追加到~/.ssh/authorized_keys,实现无密码远程操作。

二、配置JournalNode(共享编辑日志存储) JournalNode用于存储NameNode的edits log(操作日志),确保Active与Standby NameNode的元数据同步。

  1. hdfs-site.xml中添加JournalNode配置:
    <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>/var/hadoop/hdfs/journal</value> <!-- 日志存储路径,需提前创建并授权(chown -R hadoop:hadoop /var/hadoop/hdfs/journal) -->
    </property>
    
  2. 启动JournalNode服务:在所有JournalNode节点上执行hadoop-daemon.sh start journalnode,通过jps命令检查JournalNode进程是否运行。

三、配置ZooKeeper(故障转移协调) ZooKeeper用于监控NameNode状态,触发自动故障转移(ZKFC,ZooKeeper Failover Controller)。

  1. 在所有ZooKeeper节点上解压并配置ZooKeeper(建议3.4+版本):
    • 创建数据目录:mkdir -p /var/lib/zookeeper
    • 配置zoo.cfg/opt/zookeeper/conf/zoo.cfg):
      tickTime=2000
      initLimit=10
      syncLimit=5
      dataDir=/var/lib/zookeeper
      clientPort=2181
      server.1=zoo1:2888:3888
      server.2=zoo2:2888:3888
      server.3=zoo3:2888:3888
      
    • dataDir下创建myid文件(内容为节点ID,如zoo1节点写入1)。
  2. 启动ZooKeeper服务:在所有ZooKeeper节点上执行zkServer.sh start,通过zkServer.sh status检查Leader状态。

四、配置HDFS高可用(NameNode与ZKFC)

  1. 修改core-site.xml(全局配置):
    <property>
      <name>fs.defaultFS</name>
      <value>hdfs://mycluster</value> <!-- 集群名称,需与hdfs-site.xml中的dfs.nameservices一致 -->
    </property>
    <property>
      <name>ha.zookeeper.quorum</name>
      <value>zoo1:2181,zoo2:2181,zoo3:2181</value> <!-- ZooKeeper集群地址 -->
    </property>
    
  2. 修改hdfs-site.xml(HDFS高可用核心配置):
    <property>
      <name>dfs.nameservices</name>
      <value>mycluster</value> <!-- 集群名称 -->
    </property>
    <property>
      <name>dfs.ha.namenodes.mycluster</name>
      <value>nn1,nn2</value> <!-- NameNode标识(逗号分隔) -->
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn1</name>
      <value>namenode1:8020</value> <!-- Active NameNode RPC地址 -->
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn2</name>
      <value>namenode2:8020</value> <!-- Standby NameNode RPC地址 -->
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn1</name>
      <value>namenode1:50070</value> <!-- Active NameNode HTTP地址 -->
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn2</name>
      <value>namenode2:50070</value> <!-- Standby NameNode HTTP地址 -->
    </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>/home/hadoop/.ssh/id_rsa</value> <!-- SSH私钥路径(用于隔离) -->
    </property>
    <property>
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://journalnode1:8485;journalnode2:8485;journalnode3:8485/mycluster</value> <!-- JournalNode共享日志地址 -->
    </property>
    
  3. 格式化NameNode:在Active NameNode(如namenode1)上执行hdfs namenode -format,初始化元数据。
  4. 启动JournalNode:在所有JournalNode节点上执行hadoop-daemon.sh start journalnode,确保服务正常。
  5. 启动NameNode:在Active NameNode上执行hadoop-daemon.sh start namenode,格式化完成后,将元数据同步到Standby NameNode(hdfs namenode -bootstrapStandby)。
  6. 启动ZKFC:在所有NameNode节点上执行hadoop-daemon.sh start zkfc,ZKFC会监控NameNode状态,自动触发故障转移。
  7. 启动DataNode:在所有DataNode节点上执行hadoop-daemon.sh start datanode,注册到NameNode。

五、验证高可用性

  1. 检查集群状态:执行hdfs dfsadmin -report,查看NameNode状态(应显示activestandby)。
  2. 测试故障转移:
    • 手动停止Active NameNode(hadoop-daemon.sh stop namenode)。
    • 观察Standby NameNode是否自动切换为Active(通过hdfs dfsadmin -report或Web界面http://namenode1:50070查看)。
  3. 测试客户端访问:使用hdfs dfs -put命令上传文件,停止Active NameNode后,再次上传,验证客户端是否自动连接到Standby NameNode。

六、后续维护

  1. 监控告警:部署Prometheus+Grafana监控集群状态(如NameNode心跳、DataNode块数量、ZooKeeper连接数),设置异常告警(如邮件、短信)。
  2. 数据备份:定期备份NameNode元数据(hdfs namenode -backup)和JournalNode数据,防止数据丢失。
  3. 安全加固:启用Kerberos认证(kinit命令获取票据),配置HDFS权限(hdfs dfs -chmod),限制防火墙端口(仅开放必要端口,如8020、50070、2181)。

0
看了该问题的人还看了