HDFS-HA高可用
阿新 • • 發佈:2018-12-18
- HDFS-HA工作機制
- HDFS-HA工作要點
- HDFS-HA故障轉移機制
如果斷網,(單一 隔離Fence)則另一臺zkfc不會貿然上線,防止腦裂 使用命令hdfs haadmin -failover手動進行故障轉移,在該模式下,即使現役NameNode已經失效,系統也不會自動從現役NameNode轉移到待機NameNode,下面學習如何配置部署HA自動進行故障轉移。自動故障轉移為HDFS部署增加了兩個新元件:ZooKeeper和ZKFailoverController(ZKFC)程序,如圖3-20所示。ZooKeeper是維護少量協調資料,通知客戶端這些資料的改變和監視客戶端故障的高可用服務。HA的自動故障轉移依賴於ZooKeeper的以下功能: 1)故障檢測:叢集中的每個NameNode在ZooKeeper中維護了一個持久會話,如果機器崩潰,ZooKeeper中的會話將終止,ZooKeeper通知另一個NameNode需要觸發故障轉移。 2)現役NameNode選擇:ZooKeeper提供了一個簡單的機制用於唯一的選擇一個節點為active狀態。如果目前現役NameNode崩潰,另一個節點可能從ZooKeeper獲得特殊的排外鎖以表明它應該成為現役NameNode。 ZKFC是自動故障轉移中的另一個新元件,是ZooKeeper的客戶端,也監視和管理NameNode的狀態。每個執行NameNode的主機也運行了一個ZKFC程序,ZKFC負責: 1)健康監測:ZKFC使用一個健康檢查命令定期地ping與之在相同主機的NameNode,只要該NameNode及時地回覆健康狀態,ZKFC認為該節點是健康的。如果該節點崩潰,凍結或進入不健康狀態,健康監測器標識該節點為非健康的。 2)ZooKeeper會話管理:當本地NameNode是健康的,ZKFC保持一個在ZooKeeper中開啟的會話。如果本地NameNode處於active狀態,ZKFC也保持一個特殊的znode鎖,該鎖使用了ZooKeeper對短暫節點的支援,如果會話終止,鎖節點將自動刪除。 3)基於ZooKeeper的選擇:如果本地NameNode是健康的,且ZKFC發現沒有其它的節點當前持有znode鎖,它將為自己獲取該鎖。如果成功,則它已經贏得了選擇,並負責執行故障轉移程序以使它的本地NameNode為Active。故障轉移程序與前面描述的手動故障轉移相似,首先如果必要保護之前的現役NameNode,然後本地NameNode轉換為Active狀態。
<configuration> <!-- 把兩個NameNode)的地址組裝成一個叢集mycluster --> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <!-- 指定hadoop執行時產生檔案的儲存目錄 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/ha/hadoop-2.7.2/data/tmp</value> </property> </configuration> |
<configuration> <!-- 完全分散式叢集名稱 --> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- 叢集中NameNode節點都有哪些 --> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通訊地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>hadoop102:9000</value> </property> <!-- nn2的RPC通訊地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>hadoop103:9000</value> </property> <!-- nn1的http通訊地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>hadoop102:50070</value> </property> <!-- nn2的http通訊地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>hadoop103:50070</value> </property> <!-- 指定NameNode元資料在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value> qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value> </property> <!-- 配置隔離機制,即同一時刻只能有一臺伺服器對外響應 --> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <!-- 使用隔離機制時需要ssh無祕鑰登入--> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/zdsssg/.ssh/id_rsa</value> </property> <!-- 宣告journalnode伺服器儲存目錄--> <property> <name>dfs.journalnode.edits.dir</name> <value>/opt/ha/hadoop-2.7.2/data/jn</value> </property> <!-- 關閉許可權檢查--> <property> <name>dfs.permissions.enable</name> <value>false</value> </property> <!-- 訪問代理類:client,mycluster,active配置失敗自動切換實現方式--> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> </configuration> |
啟動HDFS-HA叢集 1. 在各個JournalNode節點上,輸入以下命令啟動journalnode服務 sbin/hadoop-daemon.sh start journalnode 2. 在[nn1]上,對其進行格式化,並啟動 bin/hdfs namenode -format sbin/hadoop-daemon.sh start namenode 3. 在[nn2]上,同步nn1的元資料資訊 bin/hdfs namenode -bootstrapStandby 4. 啟動[nn2] sbin/hadoop-daemon.sh start namenode 6. 在[nn1]上,啟動所有datanode sbin/hadoop-daemons.sh start datanode 7. 將[nn1]切換為Active bin/hdfs haadmin -transitionToActive nn1
- 檢視是否Active
- YARN-HA工作機制
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!--啟用resourcemanager ha--> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!--宣告兩臺resourcemanager的地址--> <property> <name>yarn.resourcemanager.cluster-id</name> <value>cluster-yarn1</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>hadoop102</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>hadoop103</value> </property> <!--指定zookeeper叢集的地址--> <property> <name>yarn.resourcemanager.zk-address</name> <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value> </property> <!--啟用自動恢復--> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!--指定resourcemanager的狀態資訊儲存在zookeeper叢集--> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> </configuration> |