1 - 為什么需要聯邦
單 NameNode 的架構存在的問題:當集群中數據增長到一定規模后,NameNode 進程占用的內存可能會達到成百上千 GB(調大 NameNode 的 JVM 堆內存已無可能),此時,NameNode 成了集群的性能瓶頸。
為了提高 HDFS 的水平擴展能力,提出了Federation(聯邦,聯盟)機制。
Federation 是 NameNode 的 Federation,也就是會有多個 NameNode,而多個 NameNode 也就意味着有多個 namespac(命名空間),不同於 HA 模式下 Active 和 Standby 有各自的命名空間,聯邦環境下的多 NameNode 共享同一個 namespace。
來看一下命名空間在 HDFS 架構中的位置:
現有的 HDFS 可以簡單分為 數據管理 和 數據存儲 2層:
所有關於存儲數據的信息和管理,都是由 NameNode 負責;
而真實數據的存儲則是在各個 DataNode 下完成。
這些被同一個 NameNode 所管理的數據都在同一個 namespace 下,一個 namespace 對應一個Block Pool(所有數據塊的集合)。
2 - Federation 架構設計
再強調一遍:HDFS Federation 是用來解決 NameNode 內存瓶頸問題的橫向擴展方案。
Federation 意味着在集群中將會有多個 NameNode,這些 NameNode 相互獨立且不需要協調,它們只需要管理自己所屬的數據塊即可。
分布式的 DataNode 作為公共的數據塊存儲設備,被所有的 NameNode 共用:每個 DataNode 都要向集群中所有的 NameNode 注冊,且周期性地向所有 NameNode 發送心跳和塊報告,並執行所有 NameNode 下發的命令。
Federation 架構中,DataNode上 會有多個 Block Pool 下,在 DataNode 的 datadir 目錄下能看到以 BP-xx.xx.xx.xx
開頭的目錄。
從上圖可以看出來:
多個 NameNode 共用一個集群里的所有存儲資源,每個 NameNode 都可以單獨對外提供服務;
每個 NameNode 都會定義一個 Block Pool,有單獨的 id,每個 DataNode 都為所有 Block Pool 提供存儲。
DataNode 會按照存儲池 id 向其對應的 NameNode 匯報塊信息,同時,DataNode 會向所有 NameNode 匯報本地存儲可用資源情況。
3 HDFS Federation 的不足
HDFS Federation 並沒有完全解決單點故障問題。
雖然集群中有多個 NameNode(namespace),但是從單個 NameNode(namespace)看,仍然存在單點故障:
如果某個 NameNode 服務發生故障,其管理的文件便不能被訪問。
Federation 架構中每個NameNode 同樣配有一個 Secondary NameNode,用於協助 NameNode 管理元數據信息(FSImage 和 EditLog)。
所以超大規模的集群,一般都會采用 HA + Federation 的部署方案,也就是每個聯合的 NameNode 都是 HA 的,這樣就解決了 NameNode 的單點故障問題 和 橫向擴容問題。
版權聲明
出處:博客園-瘦風的南牆(https://www.cnblogs.com/shoufeng)
感謝閱讀,公眾號 「瘦風的南牆」 ,手機端閱讀更佳,還有其他福利和心得輸出,歡迎掃碼關注🤝
本文版權歸博主所有,歡迎轉載,但 [必須在頁面明顯位置標明原文鏈接],否則博主保留追究相關人士法律責任的權利。