HDFS高可用主要依赖**core-site.xml(定义命名空间)和hdfs-site.xml**(定义HA行为)两个配置文件。
core-site.xml<configuration>
<!-- 指定HDFS的默认命名空间(集群名称) -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定ZooKeeper集群地址(用于自动故障转移) -->
<property>
<name>ha.zookeeper.quorum</name>
<value>zk1:2181,zk2:2181,zk3:2181</value>
</property>
</configuration>
hdfs-site.xml<configuration>
<!-- 定义命名空间(与core-site.xml中的fs.defaultFS一致) -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 定义该命名空间下的NameNode列表(如nn1、nn2) -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- 指定每个NameNode的RPC地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>nn1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>nn2:8020</value>
</property>
<!-- 指定每个NameNode的HTTP地址(用于Web UI) -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>nn1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>nn2:50070</value>
</property>
<!-- 指定JournalNode共享编辑日志的地址(用于NameNode元数据同步) -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://jn1:8485;jn2:8485;jn3:8485/mycluster</value>
</property>
<!-- 客户端故障转移代理(自动切换Active/Standby NameNode) -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 故障转移策略(ssh免密登录是常用方式) -->
<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实现自动故障转移(ZKFC,ZooKeeper Failover Controller),需提前部署ZooKeeper集群(至少3台),并在core-site.xml中配置ha.zookeeper.quorum(如上文)。
JournalNode是HDFS高可用的核心组件,负责存储NameNode的编辑日志(EditLog),确保主备NameNode元数据一致。
在所有JournalNode节点上执行:
hdfs --daemon start journalnode
验证状态:
jps | grep JournalNode # 应看到JournalNode进程
hdfs namenode -format
hdfs --daemon start namenode
hdfs namenode -bootstrapStandby
hdfs --daemon start namenode
注:若启用了ZooKeeper自动故障转移,还需启动ZKFC(ZooKeeper Failover Controller):
hdfs --daemon start zkfc
hdfs --daemon start datanode
hdfs haadmin -getServiceState nn1 # 应返回"active"
hdfs haadmin -getServiceState nn2 # 应返回"standby"
hdfs dfsadmin -report
nn1),观察备用NameNode(nn2)是否自动变为Active(若启用了ZKFC,切换会在几秒内完成)。ssh-keygen和ssh-copy-id命令),否则故障转移时无法远程执行命令。通过以上步骤,HDFS集群即可实现高可用,当主NameNode故障时,备用NameNode能自动接管服务,确保数据访问不中断。