1)所謂HA(High Available),即高可用(7*24小時不中斷服務)。node
2)實現高可用最關鍵的策略是消除單點故障。HA嚴格來講應該分紅各個組件的HA機制:HDFS 的HA和YARN的HA。ssh
3)Hadoop2.0以前,在HDFS集羣中NameNode存在單點故障(SPOF)。oop
4)NameNode主要在如下兩個方面影響HDFS集羣:日誌
NameNode機器發生意外,如宕機,集羣將沒法使用,直到管理員重啓blog
NameNode機器須要升級,包括軟件、硬件升級,此時集羣也將沒法使用進程
針對這些個問題,大佬們提供了以下的解決方式:內存
HDFS HA功能經過配置Active/Standby兩個NameNodes實如今集羣中對NameNode的熱備來解決上述問題。若是出現故障,如機器崩潰或機器須要升級維護,這時可經過此種方式將NameNode很快的切換到另一臺機器。部署
總的來講就是:一臺機器不夠用,那我就多搞幾臺,畢竟多臺機器一塊兒掛掉的機率小一點嘛。這幾臺機器如何配合呢?注意提到節點的Active和Standby狀態,就是說有一臺節點是Active模式,也就是工做模式,其餘的呢,就是賣呆模式。幹活的若是掛了,賣呆的就選出一臺頂上去。it
1). 元數據管理方式須要發生以下的改變:集羣
兩個NameNode內存中各自保存一份元數據,原來只有一份,如今你們都有;
Edits日誌只有Active(工做)狀態的NameNode節點能夠作寫操做,賣呆的只能讀;
兩個NameNode均可以讀取Edits;
共享的Edits放在一個共享存儲中管理(qjournal和NFS兩個主流實現),這樣各個節點就都能看獲得;
2). 須要一個狀態管理功能模塊
每一個NameNode節點都有一個zkfailover客戶端,常駐在每個NameNode所在的節點,每個zkfailover負責監控本身所在NameNode節點,而且給本身的節點狀態進行標識,將這個標識註冊到zookeeper裏,當須要進行狀態切換時,由zkfailover來負責切換,切換時須要防止brain split(腦裂:即多個NameNode一塊兒工做,形成數據不一致)現象的發生。
3). 必須保證兩個NameNode之間可以ssh無密碼登陸,兩個節點要可以隨時通訊
4). 隔離(Fence),即同一時刻僅僅有一個NameNode對外提供服務(兩個同時,會腦裂噠)
前面已經瞭解了HA工做的要點,那麼如何配置部署HA自動進行故障轉移。自動故障轉移爲HDFS部署增長了兩個新組件:ZooKeeper和ZKFailoverController(ZKFC)進程,如圖所示。
ZooKeeper(在Zookeeper隨筆分類下有專門的詳細闡述)的功能主要是維護少許協調數據,通知客戶端這些數據的改變和監視客戶端故障的高可用服務。HA的自動故障轉移依賴於ZooKeeper的如下功能:
1)故障檢測:集羣中的每一個NameNode在ZooKeeper中維護了一個持久會話,若是機器崩潰,ZooKeeper中的會話將終止,ZooKeeper通知另外一個NameNode須要觸發故障轉移,趕忙上位。
2)現役NameNode選擇:ZooKeeper提供了一個簡單的機制用於惟一的選擇一個節點爲active狀態。若是目前現役NameNode崩潰,另外一個節點可能從ZooKeeper得到特殊的排外鎖以代表它應該成爲現役NameNode。ZKFC是自動故障轉移中的另外一個新組件,是ZooKeeper的客戶端,也監視和管理NameNode的狀態。每一個運行NameNode的主機也運行了一個ZKFC進程,ZKFC負責:
參考資料: 尚硅谷Hadoop(HDFS)講義