HDFS - NameNode的高可用

高可用

咱們已經知道了,讀取文件、上傳文件,都須要通過NameNode,若是NameNode宕機了,那客戶端就不知道往哪裏讀寫數據,整個集羣就不可用了。
image.png
Hadoop的高可用是經過zookeeper來實現的,Hadoop - 集羣安裝(高可用),這篇文章也提到了zookeeper的做用,實際上對於大數據的各個組件來講,不少高可用都是經過zookeeper來作的,咱們下面看看zookeeper是若是實現Hadoop的高可用。在zookeeper中實現master選舉的,能夠看以前的文章zookeeper之master選舉,這裏不作細節補充。
高可用通常都是經過冗餘的方式,部署多個節點,其中一個做爲活動的節點,對外提供服務,剩餘的節點做爲處於待機狀態,當活動節點不能夠的時候,頂替成爲活動節點。
在高可用的Hadoop中,NameNode的節點數量是2個,而且每一個NameNode都有zkfc,用於和zookeeper進行通信。
image.png
當其中一個NameNode成功的在zookeeper建立一個節點後,他就成了active節點,另一個就是standby節點。active節點對外提供服務,standby節點監聽zookeeper的節點,當發現active節點不能夠的時候,就去zookeeper上建立節點,變成active節點。
image.png
DataNode須要定時的給NameNode發送心跳,NameNode就會在內存中記錄每一個DataNode最後發送心跳的時間,做爲DataNode存活的依據,那此時是有兩個NameNode的,若是僅僅把心跳發送到active節點上面,那故障轉移的時候,新的active是不知道哪些DataNode是存活的,爲了快速的實現故障轉移,因此DataNode發送心跳的時候,就會獲取到兩個NameNode的地址和端口,一塊兒發送本身的心跳信息。
image.png
NameNode內存中除了保存DataNode的心跳信息,還保存了元數據信息。爲了讓兩個NameNode的元數據也同步,每次元數據有變動的時候,active節點也會把數據發送到journalnode集羣,standby節點就會按期的從journalnode集羣讀取元數據信息。
image.png
爲了保證NameNode的高可用,HDFS引入了zookeeper和journalnode,若是這兩個不是高可用的,那也會影響到NameNode的高可用,因此這兩個也要是高可用的。node

聯邦集羣

高可用的NameNode也是有他的瓶頸,好比全部的訪問都要通過active節點的NameNode,高可用的NameNode並無減小active節點的壓力,另一個瓶頸就是元數據的管理,元數據會一直增加,NameNode的內存總有被消耗完的一天,而且一直加內存會致使每次加載元數據過多讓啓動變得異常慢,而且full gc的時間也很長。爲了解決這兩個問題,HDFS推出了聯邦集羣。
既然一個NameNode有瓶頸,那就多幾個NameNode來分單壓力,如圖下所示,有三組的NameNode,每組的NameNode都有active節點和standby節點。他們和zookeeper以及journalnode的關係跟高可用同樣。
image.png
那這些NameNode是怎麼管理元數據和DataNode的呢?聯邦集羣裏引入了塊池的概念,好比咱們有三組的NameNode,那就有三個塊池,每一個DataNode就會劃分紅多個邏輯概念的塊。
好比下圖,假設每一個DataNode分爲三塊,每一個塊都有對應的塊池,第一組的NameNode往塊池1讀寫數據,並保存對應的元數據信息。第二組的NameNode往塊池2讀寫數據,並保存對應的元數據信息。第三組的NameNode往塊池3讀寫數據,並保存對應的元數據信息。假設元數據原先爲600G,那此時每一個NameNode只要管理200G的元數據就行了。另外在讀寫上,也下降爲原來的三分之一,大大減小了NameNode的壓力。
image.pngsegmentfault