TOP

HDFS高可用(HA)之ZKFC詳解
2018-12-02 16:29:25 】 瀏覽:1309
Tags:

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/u012736748/article/details/79541311

對于NameNode的高可用可以簡單分為共享editLog機制和ZKFC對NameNode狀態的控制。有關共享editlog機制已經在上篇文章做了詳述,感興趣的朋友可以去看看。
這篇文章的重點放在ZKFC對于Namenode的控制上。

部署示意圖
這里寫圖片描述

這里寫圖片描述
FC是要和NN一一對應的,兩個NN就要部署兩個FC。它負責監控NN的狀態,并及時的把狀態信息寫入ZK。它通過一個獨立線程周期性的調用NN上的一個特定接口來獲取NN的健康狀態。FC也有選擇誰作為Active NN的權利,因為最多只有兩個節點优乐棋牌app下载,目前選擇策略還比較簡單(先到先得,輪換)。

基本概念

首先我們要明確ZKFC 是什么,有什么作用:

zkfc是什么? ZooKeeperFailoverController
它是什么?是Hadoop中通過ZK實現FC功能的一個實用工具。
主要作用:作為一個ZK集群的客戶端,用來監控NN的狀態信息。
誰會用它?每個運行NN的節點必須要運行一個zkfc

有啥功能?
1.Health monitoring
zkfc定期對本地的NN發起health-check的命令,如果NN正確返回,那么這個NN被認為是OK的。否則被認為是失效節點。

2.ZooKeeper Session Management
當本地NN是健康的時候,zkfc將會在zk中持有一個session。如果本地NN又正好是active的,那么zkfc還有持有一個”ephemeral”的節點作為,一旦本地NN失效了,那么這個節點將會被自動刪除。

3.ZooKeeper-based election
如果本地NN是健康的,并且zkfc發現沒有其他的NN持有那個獨占鎖。那么他將試圖去獲取該鎖,一旦成功,那么它就需要執行Failover,然后成為active的NN節點。Failover的過程是:第一步,對之前的NN執行fence,如果需要的話。第二步,將本地NN轉換到active狀態。

另外:
如果一個Active因HealthMonitor監控到狀態異常,這里會作出判斷,先通過Fencing功能關閉它(確保關閉或者不能提供服務),然后在ZK上刪除它對應ZNode。

發送上述事件后,在另外一臺機器上的ZKFC中的ActiveStandbyElector 會收到事件,并重新進行選舉(嘗試創建特定ZNode),它將獲得成功并更改NN中狀態,從而實現Active節點的變更。

1.基本原理

zk的基本特性:
(1) 可靠存儲小量數據且提供強一致性
(2) ephemeral node(創建的鎖節點), 在創建它的客戶端關閉后,可以自動刪除
(3) 對于node狀態的變化,可以提供異步的通知(watcher)

zk在zkfc中可以提供的功能:
(1) Failure detector(通過watcher監聽機制實現): 及時發現出故障的NN,并通知zkfc
(2) Active node locator: 幫助客戶端定位哪個是Active的NN
(3) Mutual exclusion of active state(通過加鎖): 保證某一時刻只有一個Active的NN

2. 模塊

(1) ZKFailoverController(DFSZKFailoverController): 驅動整個ZKFC的運轉,通過向HealthMonitor和ActiveStandbyElector注冊回調函數的方式,subscribe HealthMonitor和ActiveStandbyElector的事件,并做相應的處理
(2) HealthMonitor: 定期check NN的健康狀況优乐棋牌app下载,在NN健康狀況發生變化時,通過回調函數把變化通知給ZKFailoverController
(3) ActiveStandbyElector: 管理NN在zookeeper上的狀態,zookeeper上對應node的結點發生變化時,通過回調函數把變化通知給ZKFailoverController
(4) FailoverController: 提供做graceful failover的相關功能(dfs admin可以通過命令行工具手工發起failover)
這里寫圖片描述

3. 系統架構

如上圖所示,通常情況下Namenode和ZKFC同布署在同一臺物理機器上, HealthMonitor, FailoverController, ActiveStandbyElector在同一個JVM進程中(即ZKFC), Namenode是一個單獨的JVM進程。如上圖所示,ZKFC在整個系統中有幾個重要的作用:
(1) Monitor and try to take active lock: 向zookeeper搶鎖,搶鎖成功的zkfc,指導對應的NN成為active的NN; watch鎖對應的znode,當前active NN的狀態發生變化導致失鎖時,及時搶鎖,努力成為active NN
(2) Monitor NN liveness and health: 定期檢查對應NN的狀態, 當NN狀態發生變化時,及時通過ZKFC做相應的處理
(3) Fences other NN when needed: 當前NN要成為active NN時,需要fence其它的NN,不能同時有多個active NN

4. 線程模型

ZKFC的線程模型總體上來講比較簡單的,它主要包括三類線程优乐棋牌app下载,一是主線程;一是HealthMonitor線程; 一是zookeeper客戶端的線程。它們的主要工作方式是:
(1) 主線程在啟動所有的服務后就開始循環等待
(2) HealthMonitor是一個單獨的線程,它定期向NN發包,檢查NN的健康狀況
(3) 當NN的狀態發生變化時,HealthMonitor線程會回調ZKFailoverController注冊進來的回調函數,通知ZKFailoverController NN的狀態發生了變化
(4) ZKFailoverController收到通知后,會調用ActiveStandbyElector的API,來管理在zookeeper上的結點的狀態
(5) ActiveStandbyElector會調用zookeeper客戶端API監控zookeeper上結點的狀態,發生變化時,回調ZKFailoverController的回調函數,通知ZKFailoverController,做出相應的變化

5. 類關系圖

這里寫圖片描述

請關注公眾號獲取更多資料



】【打印繁體】【】【】 【】【】【】 【關閉】 【返回頂部
上一篇hdfs的搭建 下一篇HDFS中高可用性HA的講解