在Hadoop1.x版本的時候,Namenode存在着單點失效的問題。若是namenode失效了,那麼全部的基於HDFS的客戶端——包括MapReduce做業均沒法讀,寫或列文件,由於namenode是惟一存儲元數據與文件到數據塊映射的地方。而從一個失效的namenode中恢復的步驟繁多,系統恢復時間太長,也會影響到平常的維護。node
Hadoop的2.x版本在HDFS中增長了對高可用性的支持來解決單點失效的問題。架構
這一實現中簡單說就是配置了一對活動-備用namenode。當活動namenode失效的時候,備用namenode就會接管它的任務並開始服務於來自客戶端的請求,不會有任何明顯中斷。oop
下面咱們來看一下HDFS實現高可用性的架構圖:blog
從架構圖咱們能夠看到:進程
Active NameNode 和 Standby NameNode:兩臺 NameNode 造成互備,一臺處於 Active 狀態,爲主 NameNode,另一臺處於 Standby 狀態,爲備 NameNode,只有主 NameNode 才能對外提供讀寫服務。同步
主備切換控制器又稱故障轉移控制器,ZKFailoverController:ZKFailoverController 做爲獨立的進程運行,對 NameNode 的主備切換進行整體控制。ZKFailoverController 能及時檢測到NameNode 的健康情況,在主NameNode 故障時藉助 Zookeeper 實現自動的主備選舉和切換。集羣
Zookeeper 集羣:爲主備切換控制器提供主備選舉支持。配置
共享存儲系統:共享存儲系統是實現NameNode 的高可用最爲關鍵的部分,共享存儲系統保存了 NameNode 在運行過程當中所產生的 HDFS 的元數據。主NameNode和備NameNode 經過共享存儲系統實現元數據同步。在進行主備切換的時候,新的主 NameNode 在確認元數據徹底同步以後才能繼續對外提供服務。高可用
DataNode 節點:除了經過共享存儲系統共享 HDFS 的元數據信息以外,主 NameNode 和備 NameNode 還須要共享 HDFS 的數據塊和 DataNode 之間的映射關係。DataNode 會同時向主 NameNode 和備 NameNode 上報數據塊的位置信息。請求