HDFS的高可用性(HA)通过双NameNode(Active/Standby)架构解决单点故障问题。其中,Active NameNode处理客户端请求,Standby NameNode同步Active节点的元数据,当Active节点故障时,Standby节点通过ZooKeeper协调快速切换为Active状态,确保服务连续性。核心组件包括:
/etc/hosts),避免DNS解析问题。core-site.xml设置HDFS的默认文件系统地址(指向HA集群名称)和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>
hdfs-site.xml配置HA相关参数,包括NameNode标识、RPC/HTTP地址、共享编辑日志路径、JournalNode目录等:
<configuration>
<!-- 集群逻辑名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- NameNode列表(Active:nn1, Standby:nn2) -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- Active NameNode RPC地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>namenode1:8020</value>
</property>
<!-- Standby NameNode RPC地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>namenode2:8020</value>
</property>
<!-- Active NameNode HTTP地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>namenode1:50070</value>
</property>
<!-- Standby NameNode HTTP地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>namenode2:50070</value>
</property>
<!-- 共享编辑日志路径(JournalNode集群地址) -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://journalnode1:8485;journalnode2:8485;journalnode3:8485/mycluster</value>
</property>
<!-- JournalNode数据目录 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop/journaldata</value>
</property>
<!-- 客户端故障转移代理(自动选择Active节点) -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 故障转移策略(SSH强制终止Standby进程) -->
<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>
</configuration>
JournalNode负责存储NameNode的编辑日志(EditLog),确保Active与Standby元数据一致。在所有JournalNode节点上执行:
$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode
验证状态:
jps | grep JournalNode # 应看到JournalNode进程
在第一个NameNode节点(如namenode1)上执行格式化(仅第一次启动时需要):
hdfs namenode -format
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
在第二个NameNode节点(如namenode2)上执行,同步Active节点的元数据:
hdfs namenode -bootstrapStandby
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
验证两个NameNode状态:
hdfs haadmin -getServiceState nn1 # 应显示"active"
hdfs haadmin -getServiceState nn2 # 应显示"standby"
若使用ZooKeeper实现自动故障转移,需提前部署ZooKeeper集群(3节点):
zoo.cfg(指定集群节点ID和地址)。zkServer.sh start
zkCli.sh -server zk1:2181 create /hadoop-ha/mycluster ""
hdfs dfsadmin -report
应显示两个NameNode(一个Active、一个Standby)和多个DataNode。$HADOOP_HOME/sbin/hadoop-daemon.sh stop namenode
观察Standby NameNode(namenode2)是否自动切换为Active(通过hdfs haadmin -getServiceState nn2验证)。hdfs dfs命令读写数据,验证故障切换后客户端仍能正常访问HDFS。/opt/hadoop/dfs/name/current),防止数据丢失。