hadoop之 Hadoop2.2.0中HDFS的高可用性實現原理

張衝andy發表於2017-09-06

 在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的位置,並向它們傳送塊檔案所在的位置及心跳,如下圖所示:

 

 

  在任何時候,叢集中只有一個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(3、5、7等),當執行N個JN,系統將最多容忍(N-1)/2個JN崩潰。
  在HA叢集中,Standby NN也執行namespace狀態的checkpoints,所以不必要執行Secondary NN、CheckpointNode和BackupNode;事實上,執行這些守護程式是錯誤的。

source : https://www.iteblog.com/archives/833.html#comments

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31383567/viewspace-2144604/,如需轉載,請註明出處,否則將追究法律責任。

相關文章