實現架構:安全
組件描述:架構
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 上報數據塊的位置信息。內存
實現架構:同步
切換流程:it
基於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 才能安全地對外提供服務。