温馨提示×

Ubuntu HDFS如何进行高可用配置

小樊
40
2025-10-29 13:56:43
栏目: 智能运维

Ubuntu环境下HDFS高可用(HA)配置步骤

1. 集群规划与环境准备

  • 节点角色规划:至少需要3类节点(可根据规模扩展):
    • NameNode节点:2个(1个Active,1个Standby),负责元数据管理;
    • JournalNode节点:3个(或奇数个,推荐),负责同步NameNode元数据编辑日志(edits);
    • ZooKeeper集群:3个(或奇数个),用于协调NameNode的主备切换;
    • DataNode节点:多个(存储实际数据,可与NameNode/ JournalNode共用)。
  • 环境要求
    • 所有节点安装相同版本的Hadoop(如3.3.4+);
    • 配置SSH无密码登录(所有节点之间),确保Hadoop服务能自动远程操作;
    • 关闭防火墙或开放必要端口(如8020/rpc、50070/http、2181/zk等)。

2. 配置核心文件

2.1 修改core-site.xml

所有节点$HADOOP_HOME/etc/hadoop/core-site.xml中添加以下配置,指定默认文件系统和ZooKeeper集群:

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value> <!-- 集群名称,自定义 -->
    </property>
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>zk1:2181,zk2:2181,zk3:2181</value> <!-- ZooKeeper集群地址 -->
    </property>
</configuration>

2.2 修改hdfs-site.xml

所有节点$HADOOP_HOME/etc/hadoop/hdfs-site.xml中添加以下配置,定义HA相关参数:

<configuration>
    <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标识,自定义(如nn1、nn2) -->
    </property>
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>nn1_host:8020</value> <!-- Active NameNode的RPC地址 -->
    </property>
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>nn2_host:8020</value> <!-- Standby NameNode的RPC地址 -->
    </property>
    <property>
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>nn1_host:50070</value> <!-- Active NameNode的HTTP地址 -->
    </property>
    <property>
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>nn2_host:50070</value> <!-- Standby NameNode的HTTP地址 -->
    </property>
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://jn1:8485;jn2:8485;jn3: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> <!-- 防脑裂机制:通过SSH杀死Standby进程 -->
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value> <!-- SSH私钥路径(需提前配置无密码登录) -->
    </property>
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/var/hadoop/journalnode/data</value> <!-- JournalNode本地数据目录 -->
    </property>
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value> <!-- 启用自动故障转移 -->
    </property>
</configuration>

2.3 配置ZooKeeper(可选但推荐)

若未单独配置ZooKeeper集群,可在所有ZooKeeper节点$ZOOKEEPER_HOME/conf/zoo.cfg中添加:

server.1=zk1:2888:3888
server.2=zk2:2888:3888
server.3=zk3:2888:3888

并在每个节点的dataDir目录下创建myid文件(内容为对应server ID,如zk1节点写1)。

3. 启动JournalNode集群

所有JournalNode节点上执行以下命令,启动JournalNode服务:

hdfs --daemon start journalnode

使用jps命令检查是否出现JournalNode进程,确认服务正常运行。

4. 初始化共享编辑日志

在**其中一个NameNode(如nn1)**上执行以下命令,初始化共享编辑日志:

hdfs namenode -initializeSharedEdits

此命令会将本地NameNode的编辑日志同步到JournalNode集群。

5. 格式化并启动NameNode

  • 格式化主NameNode:在nn1节点上执行:
    hdfs namenode -format
    
    此操作会创建HDFS的元数据目录(如/var/hadoop/dfs/name),仅需执行一次
  • 启动NameNode:在nn1节点上启动HDFS服务:
    start-dfs.sh
    
    此时nn1会成为Active NameNode,nn2为Standby NameNode

6. 启动ZooKeeper集群

所有ZooKeeper节点上执行以下命令,启动ZooKeeper服务:

zkServer.sh start

使用zkServer.sh status检查状态,确保有1个Leader和2个Follower。

7. 验证高可用配置

7.1 检查NameNode状态

使用hdfs haadmin命令查看NameNode状态,确认Active/Standby状态:

hdfs haadmin -getServiceState nn1  # 应返回"active"
hdfs haadmin -getServiceState nn2  # 应返回"standby"

7.2 测试故障转移

  • 模拟故障:在nn1节点上杀死NameNode进程:
    kill -9 $(jps | grep NameNode | awk '{print $1}')
    
  • 验证切换:等待1-2分钟后,在nn2节点上检查状态:
    hdfs haadmin -getServiceState nn2  # 应返回"active"
    
  • 恢复服务:重启nn1节点的NameNode进程,应自动切换回Standby状态。

注意事项

  • 数据一致性:所有NameNode节点的dfs.namenode.name.dir(元数据目录)必须一致;
  • JournalNode数量:需至少3个,确保数据可靠性;
  • SSH配置dfs.ha.fencing.methods需配置有效的防脑裂机制(如sshfence),避免脑裂问题;
  • 版本兼容:Hadoop 2.x与3.x的配置略有差异,需根据版本调整(如3.x中dfs.ha.automatic-failover.enabled默认为true)。

0