NameNode HA的實現原理

1. NameNode HA架構概述

實現架構:安全

組件描述:架構

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

主備切換控制器 ZKFC:ZKFailoverController 做爲獨立的進程運行,對 NameNode 的主備切換進行整體控制。ZKFC能及時檢測到 NameNode 健康情況,在主 NameNode 故障時藉助 Zookeeper 實現自動的主備選舉和切換,固然 NameNode 目前也支持不依賴於 Zookeeper 的手動主備切換。線程

Zookeeper 集羣:爲主備切換控制器提供主備選舉支持。接口

共享存儲系統:共享存儲系統保存了 NameNode 在運行過程當中所產生的 HDFS 元數據。Active NN 和standby NN 經過共享存儲系統實現元數據同步。在進行主備切換的時候,新的主 NameNode 在確認元數據徹底同步以後才能繼續對外提供服務。進程

DataNode 節點:兩NN之間除了共享HDFS 元數據信息以外,還須要共享 HDFS 的數據塊和 DataNode 之間的映射關係。DataNode 會同時向主 NameNode 和備 NameNode 上報數據塊的位置信息。內存

2. NameNode HA實現原理

實現架構:同步

切換流程:it

  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 狀態。

3. NameNode 共享存儲

基於QJM的共享存儲的數據同步機制:集羣

機制描述:

基於 QJM 的共享存儲主要用於保存 EditLog,FSImage 文件仍是在 NameNode 的本地磁盤上。多個JournalNode 構成的集羣來存儲 EditLog,每一個 JournalNode 保存一樣的 EditLog 副本。每次 NameNode 寫 EditLog 的時候,除了向本地磁盤寫入 EditLog 以外,也會並行地向 JournalNode 集羣之中的每個 JournalNode 發送寫請求,只要大多數 (majority) 的 JournalNode 節點返回成功就認爲向 JournalNode 集羣寫入 EditLog 成功。若是有 2N+1 臺 JournalNode,那麼根據大多數的原則,最多能夠容忍有 N 臺 JournalNode 節點掛掉。

基於QJM的共享存儲的數據恢復機制:

處於 Standby 狀態的 NameNode 轉換爲 Active 狀態的時候,有可能上一個 Active NameNode 發生了異常退出,那麼 JournalNode 集羣中各個 JournalNode 上的 EditLog 就可能會處於不一致的狀態,因此首先要作的事情就是讓 JournalNode 集羣中各個節點上的 EditLog 恢復爲一致。另外如前所述,當前處於 Standby 狀態的 NameNode 的內存中的文件系統鏡像有很大的多是落後於舊的 Active NameNode 的,因此在 JournalNode 集羣中各個節點上的 EditLog 達成一致以後,接下來要作的事情就是從 JournalNode 集羣上補齊落後的 EditLog。只有在這兩步完成以後,當前新的 Active NameNode 才能安全地對外提供服務。

相關文章
相關標籤/搜索