目錄
HDFS F
HDFS HA
為了解決HDFS1.0 中單點(diǎn)故障問題和內(nèi)存受問題。提出了HDFS HA 和HDFS F。
解決單點(diǎn)故障問題:
- HDFS HA: 通過NameNode 解決
- 如果 NameNode 發(fā)生故障,就切換到備用NameNode
解決內(nèi)存受限問題:
- HDFS Federation
- 水平擴(kuò)展,支持多個NameNode
- 所有的NameNode 共享所有的DataNode存儲資源
- 每一個NameNode 分管一部分目錄
1. HDFS F
聯(lián)邦 HDFS 是 namenode 水平擴(kuò)展方案。聯(lián)邦 HDFS 允許每個 namenode之間的命名空間相互獨(dú)立。數(shù)據(jù)塊池不再切分,所以每個DataNode 需要注冊到每個 namenode。
HDFS 的底層存儲是可以水平拓展的(底層存儲指的是 datanode,當(dāng)集群存儲 空間不夠時,可簡單的添加機(jī)器以進(jìn)行水平拓展),但 namespace 不可以。 當(dāng)前的 namespace 只能存放在單個 namenode 上,而 namenode 在內(nèi)存中存儲了整個分布式文件系統(tǒng)中的元數(shù)據(jù)信息,這限制了集群中數(shù)據(jù)塊,文件和目錄的數(shù)目。
1.多個 NN 共用一個集群 DN 的存儲資源,每個 NN 都可以單獨(dú)對外??供服 務(wù)。
2.每個 NN 都會定義一個存儲池,有單獨(dú)的 id,每個 DN 都為所有存儲池??供 存儲。
3.DN 會按照存儲池 id 向其對應(yīng)的 NN 匯報塊信息,同時,DN 會向所有 NN 匯 報本地存儲可用資源情況。
4.如果需要在客戶端方便的訪問若干個 NN 上的資源,可以使用客戶端掛載 表,把不同的目錄映射到不同的 NN,但 NN 上必須存在相應(yīng)的目錄。
2.HDFS HA

HA 的 namenode 主要分為共享 editLog 機(jī)制和 ZKFC 對 namenode 狀態(tài)的控
制。
- 集群中存在多個 namenode,這些 namenode 都有狀態(tài),分為 active 和 standby 狀態(tài)。
- 然后各個 namenode 之間通過共享文件系統(tǒng)存儲編輯日志文件。active master 將信息寫入共享存儲系統(tǒng),而 standby master 則讀取該信息以保持與 active master 的同步,從而減少切換時間。
- 此外,datanode 還需同時向各個 namenode 發(fā)送數(shù)據(jù)塊處理報告。
- 每一個 namenode 運(yùn)行著一個輕量級的故障轉(zhuǎn)移控制器 ZKFC。用于監(jiān)視和 控制 namenode 進(jìn)程。ZKFC 是基于 Zookeeper 實(shí)現(xiàn)的,啟動的時候會創(chuàng)建 HealthMonitor 和 ActiveStandbyElector 這兩個組件,創(chuàng)建的同時也會向 HealthMonitor 和 ActiveStandbyElector 注冊相應(yīng)的回調(diào)方法。
HealthMonitor:主要負(fù)責(zé)檢測 NameNode 的健康狀態(tài),如果檢測到 NameNode 的狀態(tài)發(fā)生變化,會回調(diào) ZKFailoverController 的相應(yīng)方法進(jìn)行自動的主備選舉。
ActiveStandbyElector:主要負(fù)責(zé)完成自動的主備選舉,內(nèi)部封裝了 Zookeeper 的處理邏輯,一旦 Zookeeper 主備選舉完成,會回調(diào) ZKFailoverController 的 相應(yīng)方法來進(jìn)行 NameNode 的主備狀態(tài)切換。

- HealthMonitor 初始化完成之后會啟動內(nèi)部的線程來定時調(diào)用對應(yīng) NameNode 的 HAServiceProtocol RPC 接口,對 NameNode 的健康狀態(tài)進(jìn)行 檢測。
- HealthMonitor 如果檢測到 NameNode 的健康狀態(tài)發(fā)生變化,會回調(diào) ZKFailoverController 注冊的相應(yīng)方法進(jìn)行處理。
- 如果 ZKFailoverController 判斷需要進(jìn)行主備切換,會首先使用 ActiveStandbyElector 來進(jìn)行自動的主備選舉。
- ActiveStandbyElector 與 Zookeeper 進(jìn)行交互完成自動的主備選舉。
- ActiveStandbyElector 與 Zookeeper 進(jìn)行交互完成自動的主備選舉完成后, 會回調(diào) ZKFailoverController 的相應(yīng)方法來通知當(dāng)前的 NameNode 成為主 NameNode 或備 NameNode.
- ZKFailoverController 調(diào)用對應(yīng) NameNode 的 HAServiceProtocol RPC 接口 的方法將 NameNode 轉(zhuǎn)換為 Active 狀態(tài)或 Standby 狀態(tài)。
Fencing(防御腦裂)實(shí)現(xiàn): Hadoop 公共庫中對外??供了兩種 fencing 實(shí)現(xiàn), 分別是 sshfence 和 shelllfence(缺省實(shí)現(xiàn)) ,其中 sshfence 是指通過 ssh 登陸 目標(biāo) Master 節(jié)點(diǎn)上,使用命令 kill 將進(jìn)程殺死(通過 tcp 端口號定位進(jìn)程 pid,該方法比 jps 命令更準(zhǔn)確);shellfence 執(zhí)行自定義腳本。
判斷是否腦裂: 自身故障,它會先刪除持久化節(jié)點(diǎn)然后再關(guān)閉。如果是腦裂的 話,它只是臨時節(jié)點(diǎn)消息,持久化還存在。 所以我們這邊可以通過判斷持久化 節(jié)點(diǎn)是否存在,來判斷是否是因?yàn)樽陨砉收稀?/p>