ssh-keygen和ssh-copy-id命令),用于后续Standby NameNode切换时的操作。HDFS高可用的关键配置集中在core-site.xml和hdfs-site.xml中,需在所有节点上保持一致。
core-site.xml定义了HDFS的默认文件系统和ZooKeeper集群信息(用于故障转移协调):
<configuration>
<!-- 指定HDFS的逻辑集群名称,客户端将通过该名称访问集群 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定ZooKeeper集群地址,用于监控NameNode状态和管理故障转移 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>zk1:2181,zk2:2181,zk3:2181</value>
</property>
</configuration>
hdfs-site.xml是HDFS高可用的核心配置文件,主要包含NameNode、JournalNode和故障转移相关参数:
<configuration>
<!-- 定义HDFS集群的逻辑名称(需与core-site.xml中的fs.defaultFS一致) -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 列出集群中的所有NameNode ID(如nn1、nn2) -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- 配置每个NameNode的RPC地址(Active和Standby节点的通信地址) -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>namenode1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>namenode2:8020</value>
</property>
<!-- 配置每个NameNode的HTTP地址(Web UI访问地址) -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>namenode1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>namenode2:50070</value>
</property>
<!-- 指定JournalNode集群地址(用于存储NameNode的编辑日志,确保Active和Standby元数据一致) -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://journalnode1:8485;journalnode2:8485;journalnode3: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>
<!-- 配置故障转移时的隔离方法(如SSH杀死Standby进程,确保只有一个Active NameNode) -->
<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>
<!-- 配置JournalNode的数据存储目录 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop/journalnode/data</value>
</property>
</configuration>
若使用ZooKeeper实现自动故障转移,需在ZooKeeper节点上部署并启动ZooKeeper集群(至少3个节点),并确保Hadoop集群能访问ZooKeeper服务。
JournalNode是HDFS高可用的关键组件,用于同步Active NameNode的编辑日志到Standby NameNode,确保两者元数据一致。在所有JournalNode节点上执行以下命令启动服务:
$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode
启动后,可通过jps命令检查JournalNode进程是否运行(显示JournalNode进程即成功)。
$HADOOP_HOME/bin/hdfs namenode -format
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
bootstrapStandby命令,将Active NameNode的元数据同步到Standby NameNode:$HADOOP_HOME/bin/hdfs namenode -bootstrapStandby
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
在所有DataNode节点上启动DataNode服务,DataNode会自动向Active NameNode和Standby NameNode报告数据块信息:
$HADOOP_HOME/sbin/hadoop-daemon.sh start datanode
hdfs dfsadmin -report
输出应显示两个NameNode(一个Active,一个Standby)和多个DataNode。hdfs --daemon stop namenode),等待10-30秒后,再次执行hdfs dfsadmin -report,确认Standby NameNode已自动切换为Active状态,且集群仍能正常提供服务。通过以上步骤,即可在Linux环境下实现HDFS的高可用,确保在NameNode故障时快速切换,保障数据的高可用性和集群的持续运行。