在Hadoop2.0.0以前,NameNode(NN)在HDFS集羣中存在單點故障(single point of failure),每個集羣中存在一個NameNode,若是NN所在的機器出現了故障,那麼將致使整個集羣沒法利用,直到NN重啓或者在另外一臺主機上啓動NN守護線程。
主要在兩方面影響了HDFS的可用性:
(1)、在不可預測的狀況下,若是NN所在的機器崩潰了,整個集羣將沒法利用,直到NN被從新啓動;
(2)、在可預知的狀況下,好比NN所在的機器硬件或者軟件須要升級,將致使集羣宕機。
HDFS的高可用性將經過在同一個集羣中運行兩個NN(active NN & standby NN)來解決上面兩個問題,這種方案容許在機器破潰或者機器維護快速地啓用一個新的NN來恢復故障。
在典型的HA集 羣中,一般有兩臺不一樣的機器充當NN。在任什麼時候間,只有一臺機器處於Active狀態;另外一臺機器是處於Standby狀態。Active NN負責集羣中全部客戶端的操做;而Standby NN主要用於備用,它主要維持足夠的狀態,若是必要,能夠提供快速的故障恢復。
爲了讓Standby NN的狀態和Active NN保持同步,即元數據保持一致,它們都將會和JournalNodes守護進程通訊。當Active NN執行任何有關命名空間的修改,它須要持久化到一半以上的JournalNodes上(經過edits log持久化存儲),而Standby NN負責觀察edits log的變化,它可以讀取從JNs中讀取edits信息,並更新其內部的命名空間。一旦Active NN出現故障,Standby NN將會保證從JNs中讀出了所有的Edits,而後切換成Active狀態。Standby NN讀取所有的edits可確保發生故障轉移以前,是和Active NN擁有徹底同步的命名空間狀態。
爲了提供快速的故障恢復,Standby NN也須要保存集羣中各個文件塊的存儲位置。爲了實現這個,集羣中全部的Database將配置好Active NN和Standby NN的位置,並向它們發送塊文件所在的位置及心跳,以下圖所示:
oop
Hadoop2.2.0中HDFS的高可用性實現原理spa
在任什麼時候候,集羣中只有一個NN處於Active 狀態是極其重要的。不然,在兩個Active NN的狀態下NameSpace狀態將會出現分歧,這將會致使數據的丟失及其它不正確的結果。爲了保證這種狀況不會發生,在任什麼時候間,JNs只容許一個 NN充當writer。在故障恢復期間,將要變成Active 狀態的NN將取得writer的角色,並阻止另一個NN繼續處於Active狀態。
爲了部署HA集羣,你須要準備如下事項:
(1)、NameNode machines:運行Active NN和Standby NN的機器須要相同的硬件配置;
(2)、JournalNode machines:也就是運行JN的機器。JN守護進程相對來講比較輕量,因此這些守護進程能夠可其餘守護線程(好比NN,YARN ResourceManager)運行在同一臺機器上。在一個集羣中,最少要運行3個JN守護進程,這將使得系統有必定的容錯能力。固然,你也能夠運行3 個以上的JN,可是爲了增長系統的容錯能力,你應該運行奇數個JN(三、五、7等),當運行N個JN,系統將最多容忍(N-1)/2個JN崩潰。
在HA集羣中,Standby NN也執行namespace狀態的checkpoints,因此沒必要要運行Secondary NN、CheckpointNode和BackupNode;事實上,運行這些守護進程是錯誤的。線程