HA 高可用集羣概述及其原理解析

HA 高可用集羣概述及其原理解析

1. 概述

1)所謂HA(High Available),即高可用(7*24小時不中斷服務)。

2)實現高可用最關鍵的策略是消除單點故障。HA嚴格來說應該分成各個組件的HA機制:HDFS 的HA和YARN的HA。

3)Hadoop2.0之前,在HDFS集羣中NameNode存在單點故障(SPOF)。

4)NameNode主要在以下兩個方面影響HDFS集羣:

​ NameNode機器發生意外,如宕機,集羣將無法使用,直到管理員重啓

​ NameNode機器需要升級,包括軟件、硬件升級,此時集羣也將無法使用

針對這些個問題,大佬們提供瞭如下的解決方式:

HDFS HA功能通過配置Active/Standby兩個NameNodes實現在集羣中對NameNode的熱備來解決上述問題。如果出現故障,如機器崩潰或機器需要升級維護,這時可通過此種方式將NameNode很快的切換到另外一臺機器。

總的來說就是:一臺機器不夠用,那我就多搞幾臺,畢竟多臺機器一起掛掉的概率小一點嘛。這幾臺機器如何配合呢?注意提到節點的Active和Standby狀態,就是說有一臺節點是Active模式,也就是工作模式,其他的呢,就是賣呆模式。幹活的如果掛了,賣呆的就選出一臺頂上去。

2 . HDFS-HA工作要點

1). 元數據管理方式需要發生如下的改變:

​ 兩個NameNode內存中各自保存一份元數據,原來只有一份,現在大家都有;

​ Edits日誌只有Active(工作)狀態的NameNode節點可以做寫操作,賣呆的只能讀;

​ 兩個NameNode都可以讀取Edits;

​ 共享的Edits放在一個共享存儲中管理(qjournal和NFS兩個主流實現),這樣各個節點就都能看得到;

2). 需要一個狀態管理功能模塊

​ 每個NameNode節點都有一個zkfailover客戶端,常駐在每一個NameNode所在的節點,每一個zkfailover負責監控自己所在NameNode節點,並且給自己的節點狀態進行標識,將這個標識註冊到zookeeper裏,當需要進行狀態切換時,由zkfailover來負責切換,切換時需要防止brain split(腦裂:即多個NameNode一起工作,造成數據不一致)現象的發生。

3). 必須保證兩個NameNode之間能夠ssh無密碼登錄,兩個節點要能夠隨時通信

4). 隔離(Fence),即同一時刻僅僅有一個NameNode對外提供服務(兩個同時,會腦裂噠)

3. HDFS-HA自動故障轉移工作機制

前面已經瞭解了HA工作的要點,那麼如何配置部署HA自動進行故障轉移。自動故障轉移爲HDFS部署增加了兩個新組件:ZooKeeper和ZKFailoverController(ZKFC)進程,如圖所示。

ZooKeeper(在Zookeeper隨筆分類下有專門的詳細闡述)的功能主要是維護少量協調數據,通知客戶端這些數據的改變和監視客戶端故障的高可用服務。HA的自動故障轉移依賴於ZooKeeper的以下功能:

1)故障檢測:集羣中的每個NameNode在ZooKeeper中維護了一個持久會話,如果機器崩潰,ZooKeeper中的會話將終止,ZooKeeper通知另一個NameNode需要觸發故障轉移,趕緊上位。

2)現役NameNode選擇:ZooKeeper提供了一個簡單的機制用於唯一的選擇一個節點爲active狀態。如果目前現役NameNode崩潰,另一個節點可能從ZooKeeper獲得特殊的排外鎖以表明它應該成爲現役NameNode。ZKFC是自動故障轉移中的另一個新組件,是ZooKeeper的客戶端,也監視和管理NameNode的狀態。每個運行NameNode的主機也運行了一個ZKFC進程,ZKFC負責:

  • 健康監測:ZKFC使用一個健康檢查命令定期地ping與之在相同主機的NameNode,只要該NameNode及時地回覆健康狀態,ZKFC認爲該節點是健康的。如果該節點崩潰,凍結或進入不健康狀態,健康監測器標識該節點爲非健康的。
  • ZooKeeper會話管理:當本地NameNode是健康的,ZKFC保持一個在ZooKeeper中打開的會話。如果本地NameNode處於active狀態,ZKFC也保持一個特殊的znode鎖,該鎖使用了ZooKeeper對短暫節點的支持,如果會話終止,鎖節點將自動刪除。
  • 基於ZooKeeper的選擇:如果本地NameNode是健康的,且ZKFC發現沒有其它的節點當前持有znode鎖,它將爲自己獲取該鎖。如果成功,則它已經贏得了選擇,並負責運行故障轉移進程以使它的本地NameNode爲Active。故障轉移進程與前面描述的手動故障轉移相似,首先如果必要保護之前的現役NameNode,然後本地NameNode轉換爲Active狀態。

參考資料: 尚硅谷Hadoop(HDFS)講義

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章