1. 程式人生 > >NameNode 高可用整體架構概述

NameNode 高可用整體架構概述

在 Hadoop 1.0 時代,Hadoop 的兩大核心元件 HDFS NameNode 和 JobTracker 都存在著單點問題,這其中以 NameNode 的單點問題尤為嚴重。因為 NameNode 儲存了整個 HDFS 的元資料資訊,一旦 NameNode 掛掉,整個 HDFS 就無法訪問,同時 Hadoop 生態系統中依賴於 HDFS 的各個元件,包括 MapReduce、Hive、Pig 以及 HBase 等也都無法正常工作,並且重新啟動 NameNode 和進行資料恢復的過程也會比較耗時。這些問題在給 Hadoop 的使用者帶來困擾的同時,也極大地限制了 Hadoop 的使用場景,使得 Hadoop 在很長的時間內僅能用作離線儲存和離線計算,無法應用到對可用性和資料一致性要求很高的線上應用場景中。

所幸的是,在 Hadoop2.0 中,HDFS NameNode 和 YARN ResourceManger(JobTracker 在 2.0 中已經被整合到 YARN ResourceManger 之中) 的單點問題都得到了解決,經過多個版本的迭代和發展,目前已經能用於生產環境。HDFS NameNode 和 YARN ResourceManger 的高可用 (High Availability,HA) 方案基本類似,兩者也複用了部分程式碼,但是由於 HDFS NameNode 對於資料儲存和資料一致性的要求比 YARN ResourceManger 高得多,所以 HDFS NameNode 的高可用實現更為複雜一些,本文從內部實現的角度對 HDFS NameNode 的高可用機制進行詳細的分析。


Active NameNode 和 Standby NameNode:兩臺 NameNode 形成互備,一臺處於 Active 狀態,為主 NameNode,另外一臺處於 Standby 狀態,為備 NameNode,只有主 NameNode 才能對外提供讀寫服務。

主備切換控制器 ZKFailoverController:ZKFailoverController 作為獨立的程序執行,對 NameNode 的主備切換進行總體控制。ZKFailoverController 能及時檢測到 NameNode 的健康狀況,在主 NameNode 故障時藉助 Zookeeper 實現自動的主備選舉和切換,當然 NameNode 目前也支援不依賴於 Zookeeper 的手動主備切換。

Zookeeper 叢集:為主備切換控制器提供主備選舉支援。

共享儲存系統:共享儲存系統是實現 NameNode 的高可用最為關鍵的部分,共享儲存系統儲存了 NameNode 在執行過程中所產生的 HDFS 的元資料。主 NameNode 和

NameNode 通過共享儲存系統實現元資料同步。在進行主備切換的時候,新的主 NameNode 在確認元資料完全同步之後才能繼續對外提供服務。

DataNode 節點:除了通過共享儲存系統共享 HDFS 的元資料資訊之外,主 NameNode 和備 NameNode 還需要共享 HDFS 的資料塊和 DataNode 之間的對映關係。DataNode 會同時向主 NameNode 和備 NameNode 上報資料塊的位置資訊。