core-site.xml
設置HDFS的默認文件系統地址和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
配置NameNode高可用相關的關鍵參數:
<configuration>
<!-- 集群邏輯名稱 -->
<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地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>nn1-host:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>nn2-host:8020</value>
</property>
<!-- 每個NameNode的HTTP地址(用于Web UI) -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>nn1-host:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>nn2-host:50070</value>
</property>
<!-- 共享編輯日志目錄(JournalNode存儲地址) -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://jn1-host:8485;jn2-host:8485;jn3-host: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進程) -->
<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>/path/to/journalnode/data</value>
</property>
</configuration>
JournalNode負責存儲NameNode的編輯日志(EditLog),確保Active和Standby NameNode的元數據一致。在所有JournalNode節點上執行:
$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode
$HADOOP_HOME/bin/hdfs namenode -format
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
$HADOOP_HOME/bin/hdfs namenode -bootstrapStandby
$HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
ZKFC用于監控NameNode的狀態,并在Active NameNode故障時自動觸發故障轉移。在每個NameNode節點上啟動ZKFC:
$HADOOP_HOME/sbin/hadoop-daemon.sh start zkfc
在所有DataNode節點上啟動DataNode服務,向Active和Standby NameNode報告數據塊信息:
$HADOOP_HOME/sbin/hadoop-daemon.sh start datanode
hdfs dfsadmin -report
輸出應顯示Active和Standby NameNode均處于“live”狀態。$HADOOP_HOME/sbin/stop-dfs.sh --config $HADOOP_HOME/etc/hadoop nn1
等待10-30秒后,再次執行hdfs dfsadmin -report
,應看到Standby NameNode(如nn2)已切換為Active狀態。此時訪問HDFS(如hdfs dfs -ls /
)仍能正常工作,驗證了自動故障轉移的有效性。通過以上步驟,HDFS在Linux環境下實現了高可用性,能夠有效應對NameNode單點故障,保障數據服務的連續性。