NameNode之間共享數據(NFS 、Quorum Journal Node(用得多)) node
兩個NameNode爲了數據同步,會經過一組稱做JournalNodes的獨立進程進行相互通訊。當active狀態的NameNode的命名空間有任何修改時,會告知大部分的JournalNodes進程。standby狀態的NameNode有能力讀取JNs中的變動信息,而且一直監控edit log的變化,把變化應用於本身的命名空間。standby能夠確保在集羣出錯時,命名空間狀態已經徹底同步了。 linux
Hadoop中的NameNode比如是人的心臟,很是重要,絕對不能夠中止工做。在hadoop1時代,只有一個NameNode。若是該NameNode數據丟失或者不能工做,那麼整個集羣就不能恢復了。這是hadoop1中的單點問題,也是hadoop1不可靠的表現,如圖1所示。hadoop2就解決了這個問題。 服務器
圖1 架構
hadoop2.2.0(HA)中HDFS的高可靠指的是能夠同時啓動2個NameNode。其中一個處於工做狀態,另外一個處於隨時待命狀態。這樣,當一個NameNode所在的服務器宕機時,能夠在數據不丟失的狀況下,手工或者自動切換到另外一個NameNode提供服務。 oop
這些NameNode之間經過共享數據,保證數據的狀態一致。多個NameNode之間共享數據,能夠經過Nnetwork File System或者Quorum Journal Node。前者是經過linux共享的文件系統,屬於操做系統的配置;後者是hadoop自身的東西,屬於軟件的配置。 spa
咱們這裏講述使用Quorum Journal Node的配置方式,方式是手工切換。 操作系統
集羣啓動時,能夠同時啓動2個NameNode。這些NameNode只有一個是active的,另外一個屬於standby狀態。active狀態意味着提供服務,standby狀態意味着處於休眠狀態,只進行數據同步,時刻準備着提供服務,如圖2所示。 進程
圖2 hadoop
在一個典型的HA集羣中,每一個NameNode是一臺獨立的服務器。在任一時刻,只有一個NameNode處於active狀態,另外一個處於standby狀態。其中,active狀態的NameNode負責全部的客戶端操做,standby狀態的NameNode處於從屬地位,維護着數據狀態,隨時準備切換。 資源
兩個NameNode爲了數據同步,會經過一組稱做JournalNodes的獨立進程進行相互通訊。當active狀態的NameNode的命名空間有任何修改時,會告知大部分的JournalNodes進程。standby狀態的NameNode有能力讀取JNs中的變動信息,而且一直監控edit log的變化,把變化應用於本身的命名空間。standby能夠確保在集羣出錯時,命名空間狀態已經徹底同步了,如圖3所示。
圖3
爲了確保快速切換,standby狀態的NameNode有必要知道集羣中全部數據塊的位置。爲了作到這點,全部的datanodes必須配置兩個NameNode的地址,發送數據塊位置信息和心跳給他們兩個。
對於HA集羣而言,確保同一時刻只有一個NameNode處於active狀態是相當重要的。不然,兩個NameNode的數據狀態就會產生分歧,可能丟失數據,或者產生錯誤的結果。爲了保證這點,JNs必須確保同一時刻只有一個NameNode能夠向本身寫數據。
爲了部署HA集羣,應該準備如下事情:
* NameNode服務器:運行NameNode的服務器應該有相同的硬件配置。
* JournalNode服務器:運行的JournalNode進程很是輕量,能夠部署在其餘的服務器上。注意:必須容許至少3個節點。固然能夠運行更多,可是必須是奇數個,如三、五、七、9個等等。當運行N個節點時,系統能夠容忍至少(N-1)/2(N至少爲3)個節點失敗而不影響正常運行。
在HA集羣中,standby狀態的NameNode能夠完成checkpoint操做,所以不必配置Secondary NameNode、CheckpointNode、BackupNode。若是真的配置了,還會報錯。