Hadoop集羣高可用
Hadoop 高可用 (High Availability) 分爲 HDFS 高可用和 YARN 高可用,兩者的實現基本類似,但 HDFS NameNode 對數據存儲及其一致性的要求比 YARN ResourceManger 高得多。對於HDFS來說,高可用其實就是針對NameNode的高可用。因爲NameNode保存着集羣的元數據信息,一旦丟失整個集羣將不復存在。
我們來看上面的HDFS高可用框架:
- 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 上報數據塊的位置信息。
個人理解:
ZKFC -> Zookeeper Failover Controller 是Zookeeper用來維護HDFS HA的實例,監控NameNode健康狀況,當主NameNode死亡,通過Zookeeper的選舉自動完成主備切換
Zookeeper Failover Controller -> healthy message / exchange active-standby
JN -> 作爲共享存儲系統,用來共享主備節點的editLog,即向備NameNode共享主NameNode的meta data
Journal Node -> as a cluster to synchronized EditLog
基於 QJM 的共享存儲系統的數據同步機制分析
目前 Hadoop 支持使用 Quorum Journal Manager (QJM) 或 Network File System (NFS) 作爲共享的存儲系統,這裏以 QJM 集羣爲例進行說明:Active NameNode 首先把 EditLog 提交到 JournalNode 集羣,然後 Standby NameNode 再從 JournalNode 集羣定時同步 EditLog,當 Active NameNode 宕機後, Standby NameNode 在確認元數據完全同步之後就可以對外提供服務。
需要說明的是向 JournalNode 集羣寫入 EditLog 是遵循 “過半寫入則成功” 的策略,所以你至少要有 3 個 JournalNode 節點,當然你也可以繼續增加節點數量,但是應該保證節點總數是奇數。同時如果有 2N+1 臺 JournalNode,那麼根據過半寫的原則,最多可以容忍有 N 臺 JournalNode 節點掛掉。
NameNode 主備切換
1.HealthMonitor 初始化完成之後會啓動內部的線程來定時調用對應 NameNode 的 HAServiceProtocol RPC 接口的方法,對 NameNode 的健康狀態進行檢測。 2. HealthMonitor 如果檢測到 NameNode 的健康狀態發生變化,會回調 ZKFailoverController 註冊的相應方法進行處理。 3. 如果 ZKFailoverController 判斷需要進行主備切換,會首先使用 ActiveStandbyElector 來進行自動的主備選舉。 4. ActiveStandbyElector 與 Zookeeper 進行交互完成自動的主備選舉。 5. ActiveStandbyElector 在主備選舉完成後,會回調 ZKFailoverController 的相應方法來通知當前的 NameNode 成爲主 NameNode 或備 NameNode。 6. ZKFailoverController 調用對應 NameNode 的 HAServiceProtocol RPC 接口的方法將 NameNode 轉換爲 Active 狀態或 Standby 狀態。
YARN高可用
YARN ResourceManager 的高可用與 HDFS NameNode 的高可用類似,但是 ResourceManager 不像 NameNode ,沒有那麼多的元數據信息需要維護,所以它的狀態信息可以直接寫到 Zookeeper 上,並依賴 Zookeeper 來進行主備選舉。
YARN HA
Zookeeper -> synchronized Resource Manager meta data
https://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-name-node/index.html#icomments
https://www.edureka.co/blog/how-to-set-up-hadoop-cluster-with-hdfs-high-availability/