1. 程式人生 > >HDFS ZKFC實現NameNode自動切換原理

HDFS ZKFC實現NameNode自動切換原理

當一個NameNode被成功切換為Active狀態時,它會在ZK內部建立一個臨時的znode,在znode中將會保留當前Active NameNode的一些資訊,比如主機名等等。當Active NameNode出現失敗或連線超時的情況下,監控程式會將ZK上對應的臨時znode進行刪除,znode的刪除事件會主動觸發到下一次的Active NamNode的選擇。

因為ZK是具有高度一致性的,它能保證當前最多隻能有一個節點能夠成功建立znode,成為當前的Active Name。

現在檢視zookeeper的znode資訊:

[[email protected] ~]# /etc/init.d/zookeeper-client 
Connecting to localhost:2181 Welcome to ZooKeeper! JLine support is enabled WATCHER:: WatchedEvent state:SyncConnected type:None path:null [zk: localhost:2181(CONNECTED) 0] ls / [cluster, controller_epoch, brokers, zookeeper, hadoop-ha, admin, isr_change_notification, consumers, config, hbase] [zk: localhost:2181(CONNECTED) 2] get /hadoop-ha cZxid
= 0x100000002 ctime = Tue Dec 05 19:43:07 EST 2017 mZxid = 0x100000002 mtime = Tue Dec 05 19:43:07 EST 2017 pZxid = 0x700000017 cversion = 3 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 1 [zk: localhost:2181(CONNECTED) 3] ls /hadoop-ha [myCluster] [zk: localhost:2181(CONNECTED) 4]

HDFS HA自動切換機制的核心物件是ZKFC,也就是我們平常在NameNode節點上會啟動的ZKFC程序。

在ZKFC的程序內部,執行著3個物件服務:

  • HealthMonitor:監控NameNode是否不可用或是進入了一個不健康的狀態。
  • ActiveStandbyElector:控制和監控ZK上的節點的狀態。
  • ZKFailoverController:協調HealMonitor和ActiveStandbyElector物件,處理它們發來的event變化事件,完成自動切換的過程。

這裡寫圖片描述
通常情況下Namenode和ZKFC同佈署在同一臺物理機器上, HealthMonitor, FailoverController, ActiveStandbyElector在同一個JVM程序中(即ZKFC), Namenode是一個單獨的JVM程序。

這裡寫圖片描述
(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,做出相應的變化

public enum State {
    /**
     *  1.The health monitor is still starting up.HealMonitor
     *    初始化啟動狀態
     */
    INITIALIZING,

    /**
     * 2.The service is not responding to health check RPCs.
     *  健康檢查無響應狀態
     */
    SERVICE_NOT_RESPONDING,

    /**
     * 3.The service is connected and healthy. 
     *   服務檢測健康狀態
     */ 
    SERVICE_HEALTHY,

    /**
     * 4.The service is running but unhealthy.
     *   服務檢查不健康狀態
     */ 
    SERVICE_UNHEALTHY,

    /**
     * 5.The health monitor itself failed unrecoverably and can no longer provide accurate information.
     * 監控服務本身失敗不可用狀態
     * /
    HEALTH_MONITOR_FAILED;
  }

HealMonitor物件檢測NameNode的健康狀況的邏輯其實非常簡單:傳送一個RPC請求,檢視是否有響應。

相關推薦

HDFS ZKFC實現NameNode自動切換原理

當一個NameNode被成功切換為Active狀態時,它會在ZK內部建立一個臨時的znode,在znode中將會保留當前Active NameNode的一些資訊,比如主機名等等。當Active NameNode出現失敗或連線超時的情況下,監控程式會將ZK上對

html+css+jQuery+JavaScript實現tab自動切換功能

() conf charset 臨時 effect 保存 sheet http oat tab1.html內容 <!DOCTYPE html> <html> <head> <meta charset="U

js實現圖片自動切換

<!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>圖片切換</title>     <sty

Spring Boot配置多資料來源並實現Druid自動切換

SpringBoot多資料來源切換,先上配置檔案: 1.pom: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"

純css3實現圖片自動切換

實現圖片自動切換需要用到的主要是css3裡面的過渡這一節的內容。 大致思路是這樣的: 1、將圖片設定為li的背景圖片; 2、規定一個@keyframes的規則使得圖片按照這個規則進行切換; 3、設定每

js實現幻燈片自動切換

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html

[Java中實現國際化] - 配合thymeleaf實現中英文自動切換(多語言)

-type charset please menu register times ase http word MOOC該鏈接第三章第二節 尚矽谷SpringBoot全集 web開發國際化 xjbo (7天,過期可以留言索取) resources下建立文件 上到下

原生js+css3實現圖片自動切換,圖片輪播

運用CSS3transition及opacity屬性 製作圖片輪播動畫 自己這兩天根據用js來控制觸發CSS3中transition屬性,從而寫出來的以CSS3動畫為基礎,js控制過程的圖片輪播

AbstractRoutingDataSource 實現動態資料來源切換原理簡單分析

# AbstractRoutingDataSource 實現動態資料來源切換原理簡單分析 > 寫在前面,專案中用到了動態資料來源切換,記錄一下其執行機制。 ## 程式碼展示 下面列出一些關鍵程式碼,後續分析會用到 1. 資料配置 ```java @Configuration @PropertySou

Dledger是如何實現主從自動切換

  前言 hello小夥伴們,今天王子又來繼續和大家聊RocketMQ了,之前的文章我們一直說Broker的主從切換是可以基於Dledger實現自動切換的,那麼小夥伴們是不是很好奇它究竟是如何實現的呢?今天我們就來聊一聊這個話題。 首先我們回顧一下上一篇文章深入研究Broker是如何持久化的中,pr

HDFS叢集搭建,高可用雙機熱備模式(HA)自動切換hdfs+zookeeper+journalnode,步驟分步原理詳解(適合初學者)

有寫的不對的地方,歡迎各位同學評論指正,博主會進行修改。 前言 作者也是初學hadoop,瞭解各元件的用途,並且專案中有些東西用不到,所以作者用最簡化的元件搭建,避免多餘資源的浪費,作者最初構想是zookeeper+hdfs搭建一個分散式檔案系統,不用yarn和ma

Tab選項卡 自動切換效果js實現

one asc hidden abs 公告 turn get 實現 pla try.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <

corosync+pacemaker實現pg流復制自動切換

mov out ros 綁定 節點 war backend 故障恢復 pgsql 一、環境 $ cat /etc/redhat-release CentOS Linux release 7.0.1406 (Core) node1: 192.168.111.128 n

動態創建table,按回車鍵自動切換光標位置及金額統計Js代碼實現

tex move break mov sel 自動 false click ipp 1.JS頁面輸出拼接的Table代碼,參數來自於Ajax請求響應回來的Json數據 $("#rightTipPayBackTb").append("<tr><td>

SpringBoot(三)通過properties實現多個數據庫環境自動切換配置

方式 info 本地 所有 -c int 安裝 style 過多 前面的文章已經介紹了CentOS部署SpringBoot項目從0到1的詳細過程,包括Linux安裝ftp、Tomcat以及Java jdk的全部過程。這篇文章主要介紹關於springboot如何通過多

解決Nginx + Keepalived主從雙機熱備+自動切換實現負載均衡及高可用

解決Nginx + Keepalived主從雙機熱備+自動切換,實現負載均衡及高可用 IP 伺服器 服務 192.168.1.10 lb-node1 Nginx、kee

ArrayList自動擴容原理(底層實現

探索ArrayList      ArrayList的列表物件實質上是儲存在一個引用型數組裡的,有人認為該陣列有“自動增長機制”可以自動改變size大小。正式地說,該陣列是無法改變 大小的,實際上它只是改變了該引用型陣列的指向而已。下面,讓我們來看看java是怎樣實現ArrayList類的。

ViewFlipper實現螢幕自動播放及手勢滑動切換

【例1】實現自動播放 【步驟一】在res目錄下新建資料夾anim,下面有四個檔案,如下:     right_out.xml內容也類似。 &nbs

Spring boot 的profile功能如何實現多環境配置自動切換

通常服務端應用開發需要經過以下幾個流程: 開發 -> 測試 -> RC驗證 -> 上線 這就涉及到四個不同的環境,開發環境、測試環境、RC環境以及生產環境,為了避免不同環境之間相互干擾,通常需要獨立部署資料庫、快取伺服器等,那麼應用配置也要做相應的調整。

Nginx+Tomcat做負載均衡時一臺伺服器宕機實現自動切換

思路:有兩種方式。 第一種:設定一臺伺服器為備機,只有當訪問的伺服器異常時才會訪問它; 第二種:設定伺服器轉發請求超時時間。 一、設定備機: 在安裝目錄下(例E:\nginx-1.14.0\conf)開啟nginx.conf修改 upstream netitcast.com {