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)進程,如圖所示。

![](https://img2018.cnblogs.com/blog/1610225/201910/1610225-20191027235109266-1737840524.png)

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)講義


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM