hadoop集群中zkfc的作用和工作過程
一、 簡單了解NameNode的ZKFC機制
NameNode的HA可以個人認為簡單分為共享editLog機制和ZKFC對NameNode狀態的控制
-
一般導致NameNode切換的原因
-
ZKFC的作用是什麽?如何判斷一個NN是否健康
一般導致NameNode切換的原因
隨著集群規模的變大和任務量變多,NameNode的壓力會越來越大,一些默認參數已經不能滿足集群的日常需求,除此之外,異常的Job在短時間內創建和刪除大量文件,引起NN節點頻繁更新內存的數據結構從而導致RPC的處理時間變長,CallQueue裏面的RpcCall堆積,甚至嚴重的情況下打滿CallQueue,導致NameNode響應變慢,甚至無響應,ZKFC的HealthMonitor監控自己的NN異常時,則會斷開與ZooKeeper的鏈接,從而釋放鎖,另外一個NN上的ZKFC進行搶鎖進行Standby到Active狀態的切換。這是一般引起的切換的流程。
當然,如果你是手動去切換這也是可以的,當Active主機出現異常時,有時候則需要在必要的時間內進行切換。
ZKFC的作用是什麽?如何判斷一個NN是否健康
在正常的情況下,ZKFC的HealthMonitor主要是監控NameNode主機上的磁盤還是否可用(空間),我們都知道,NameNode負責維護集群上的元數據信息,當磁盤不可用的時候,NN就該進行切換了。
二、基本概念
首先我們要明確ZKFC 是什麽,有什麽作用:
zkfc是什麽? ZooKeeperFailoverController
它是什麽?是Hadoop中通過ZK實現FC功能的一個實用工具。
主要作用:作為一個ZK集群的客戶端,用來監控NN的狀態信息。
三、有啥功能?
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節點的變更。
四、基本原理
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
五、 模塊
(1) ZKFailoverController(DFSZKFailoverController): 驅動整個ZKFC的運轉,通過向HealthMonitor和ActiveStandbyElector註冊回調函數的方式,subscribe HealthMonitor和ActiveStandbyElector的事件,並做相應的處理
(2) HealthMonitor: 定期check NN的健康狀況,在NN健康狀況發生變化時,通過回調函數把變化通知給ZKFailoverController
(3) ActiveStandbyElector: 管理NN在zookeeper上的狀態,zookeeper上對應node的結點發生變化時,通過回調函數把變化通知給ZKFailoverController
(4) FailoverController: 提供做graceful failover的相關功能(dfs admin可以通過命令行工具手工發起failover)
六、系統架構
如上圖所示,通常情況下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
七、線程模型
ZKFC的線程模型總體上來講比較簡單的,它主要包括三類線程,一是主線程;一是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,做出相應的變化
八、 類關系圖
hadoop集群中zkfc的作用和工作過程