1. 程式人生 > >Zookeeper工作過程詳解

Zookeeper工作過程詳解

一、Zookeeper工作機制

分散式和集中式系統相比,有很多優勢,比如更強的計算能力,儲存能力,避免單點故障等問題。但是由於在分散式部署的方式遇到網路故障等問題的時候怎麼保證各個節點資料的一致性和可用性是比較關鍵的問題。

那麼,對於分散式叢集來說,我們需要一個能夠在各個服務和節點之間進行協調和服務的中間人——Zookeeper。

Zookeeper從設計模式角度來理解:是一個基於觀察者模式設計的分散式服務管理框架,負責儲存和管理大家都關心的資料,然後接受觀察者的註冊,一旦這些資料的狀態發生變化,Zookeeper就將負責通知已經在Zookeeper上註冊的那些觀察者做出相應的迴應。

二、資料結構

Zookeeper的資料結構和linux的目錄結構類似,也像資料結構中的樹,如下圖:

Zookeeper的資料儲存基於節點,這種節點稱為Znode。Znode的引用方式是路徑的引用,每個Znode都可以通過其路徑唯一標識。

其中Znode中包含有:資料,子節點引用,訪問許可權等,如下圖:

  • data:Znode儲存的資料資訊
  • ACL:記錄Znode的訪問許可權,即哪些人或哪些IP可以訪問本節點
  • child:當前節點的子節點引用,類似於二叉樹的左孩子右孩子
  • stat:包含Znode的各種元資料,比如事務ID、版本號、時間戳、大小等等

stat 檢視根目錄的詳細資訊:

[zk: localhost:2181(CONNECTED) 0] stat /
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1

三、選舉機制

Zookeeper叢集是一主多從的模式,主為leader,從為follower,其中leader是通過選舉得到。

Zookeeper叢集有如下特點:

  • Zookeeper:一個領導者(leader),多個跟隨者(follower)組成的叢集
  • Leader負責進行投票的發起和決議,更新系統狀態
  • Follower用於接收客戶請求並向客戶端返回結果,在選舉Leader過程中參與投票
  • 叢集中只要有半數以上節點存活,Zookeeper叢集就能正常服務,所以Zookeeper適合安裝奇數臺伺服器
  • 全域性資料一致:每個server儲存一份相同的資料副本,client無論連線到哪個server,資料都是一致的
  • 更新請求順序進行,來自同一個client的更新請求按其傳送順序依次執行
  • 資料更新原子性,一次資料更新要麼成功,要麼失敗
  • 實時性,在一定時間範圍內,client能讀到最新資料

Leader選舉是保證分散式資料一致性的關鍵所在,當Zookeeper進入以下兩種狀態時,需要進入leader選舉:

  1. 伺服器初始化啟動
  2. leader宕機掛掉
  1. 伺服器初始化啟動時的選舉

(1)以三臺伺服器組成的叢集為例,在叢集的初始化階段,當server1啟動時,其單獨無法完成選舉;當server2啟動時,此時兩臺機器可以互相通訊,每臺機器都試圖找到leader,於是進入選舉狀態

(2)每個server首先給自己投票:初始階段,每個伺服器都將自己作為leader來投票,每次投票包含的資訊有(myid,ZXID,epoch),此時Server1的投票為(1, 0),Server2的投票為(2, 0),然後各自將這個投票發給叢集中其他機器

其中epoch用來判斷多個投票是否在同一輪選舉週期中,該值在服務端是一個自增序列,每次進入新一輪的投票後,都會對該值進行加1操作

(3)每個server接受來自各個伺服器的投票:叢集的每個伺服器收到投票後,首先判斷該投票的有效性,如檢查是否是本輪投票、是否來自LOOKING狀態的伺服器

(4)處理投票。針對每一個投票,伺服器都需要將別人的投票和自己的投票進行PK,PK規則如下:

  • 優先檢查ZXID。ZXID比較大的伺服器優先作為Leader
  • 如果ZXID相同,那麼就比較myid。myid較大的伺服器作為Leader伺服器

對於Server1而言,它的投票是(1, 0),接收Server2的投票為(2, 0),首先會比較兩者的ZXID,均為0,再比較myid,此時Server2的myid最大,於是更新自己的投票為(2, 0),然後重新投票,對於Server2而言,其無須更新自己的投票,只是再次向叢集中所有機器發出上一次投票資訊即可

(5)統計投票。每次投票後,伺服器都會統計投票資訊,判斷是否已經有過半機器接受到相同的投票資訊,對於Server1、Server2而言,都統計出叢集中已經有兩臺機器接受了(2, 0)的投票資訊,此時便認為已經選出了Leader,一旦選出leader,後邊的機器不管myid和ZXID多大,都自動成為leader的小弟

(6)改變伺服器狀態。一旦確定了Leader,每個伺服器就會更新自己的狀態,如果是Follower,那麼就變更為FOLLOWING,如果是Leader,就變更為LEADING

  1. leader伺服器掛掉的投票機制

與啟動時不同的就是,每個伺服器上都有歷史資料,在選舉之前,首先非leader的伺服器改變狀態為LOOKING狀態,因為執行期間每個伺服器ZXID不同,會和啟動時的選舉一樣進行重新投票選舉。

四、監聽機制

  1. 首先要有一個main()執行緒
  2. 在main執行緒中建立Zookeeper客戶端,這時就會建立兩個執行緒,一個負責網路連線通訊(connet),一個負責監聽(listener)
  3. 通過connect執行緒將註冊的監聽事件傳送給Zookeeper
  4. 在Zookeeper的註冊監聽器列表中將註冊的監聽事件新增到列表中
  5. Zookeeper監聽到有資料或路徑變化,就會將這個訊息傳送給listener執行緒
  6. listener執行緒內部呼叫了process()方法

五、API應用

Zookeeper常用的API如下:

create
建立節點

delete
刪除節點

exists
判斷節點是否存在

getData
獲得一個節點的資料

setData
設定一個節點的資料

getChildren
獲取節點下的所有子節點

這其中,exists,getData,getChildren屬於讀操作。Zookeeper客戶端在請求讀操作的時候,可以選擇是否設定Watch。

Watch是什麼意思呢?

我們可以理解成是註冊在特定Znode上的觸發器。當這個Znode發生改變,也就是呼叫了create,delete,setData方法的時候,將會觸發Znode上註冊的對應事件,請求Watch的客戶端會接收到非同步通知。

具體互動過程如下:

  1. 客戶端呼叫getData方法,watch引數是true。服務端接到請求,返回節點資料,並且在對應的雜湊表裡插入被Watch的Znode路徑,以及Watcher列表。
  2. 當被Watch的Znode已刪除,服務端會查詢雜湊表,找到該Znode對應的所有Watcher,非同步通知客戶端,並且刪除雜湊表中對應的Key-Value

六、應用場景

Zookeeper提供的服務包括:統一命名服務、統一配置管理、統一叢集管理、伺服器節點動態上下線、軟負載均衡等。

歡迎關注下方公眾號,獲取更多文章資訊

相關推薦

Zookeeper工作過程

一、Zookeeper工作機制 分散式和集中式系統相比,有很多優勢,比如更強的計算能力,儲存能力,避免單點故障等問題。但是由於在分散式部署的方式遇到網路故障等問題的時候怎麼保證各個節點資料的一致性和可用性是比較關鍵的問題。 那麼,對於分散式叢集來說,我們需要一個能夠在各個服務和節點之間進行協調和服務的中間人—

大資料技術學習筆記之Hadoop框架基礎4-MapReduceshuffer過程zookeeper框架學習

一、MapReduce Shuffle     -》MapReduce執行五個階段         input           

ZooKeeper故障節點替換過程

作者介紹 康壯,大連樓蘭科技股份資料庫運維組負責人,主要負責集團內部MySQL、MongoDB、Redis資料庫運維管理工作。曾在第三方資料庫運維公司任職技術部經理,負責政府行業的Oracle資料庫運維工作,具有Oracle OCP、OCM、MySQL OCP等相關認證、對資料庫架構設計、故障處理、

Nginx實現集群的負載均衡配置過程

post 發現 forward too strong eight glin 內容 請求 Nginx實現集群的負載均衡配置過程詳解 Nginx 的負載均衡功能,其實實際上和 nginx 的代理是同一個功能,只是把代理一臺機器改為多臺機器而已。 Nginx 的負載均衡

使用HeartBeat實現高可用HA的配置過程

接口 dea ive for 64位 doc 主機名 停止 enforce 使用HeartBeat實現高可用HA的配置過程詳解 一、寫在前面 HA即(high available)高可用,又被叫做雙機熱備,用於關鍵性業務。簡單理解就是,有2臺機器 A 和 B,正常

OC學習小結之ios運行過程

for cat 用戶 with res nbsp c學習 launch cati 1)ios核心類 UIView 視圖,屏幕上能看得見的東西都是視圖,例如:按鈕、文本標簽、和表格等 UIViewController:內部默認有個視圖(UIView),負責管理UIView的

storm集群部署和配置過程

多少 帶來 進程 創建 使用 命令 介紹 aml 可能 ---恢復內容開始--- 先整體介紹一下搭建storm集群的步驟: 設置zookeeper集群 安裝依賴到所有nimbus和worker節點 下載並解壓storm發布版本到所有nimbus和worker節點 配置s

lvs和keeplived的工作原理

lvs+keeplived的工作原理一、lvs的工作原理 使用集群的技術和liunx的操作系統實現一個高性能、高可用的服務器。可伸縮性、可靠性、很好的管理性。 特點:可伸縮網絡服務的幾種結構,它們都需要一個前端的負載調度器(或者多個進行主從備份)。我們先分析實現虛擬網絡服務的主要技術,指出IP負載均衡技術

SSL協議握手工作流程(雙向HTTPS流程)

包含 style strong 雙向認證 包括 返回 情況 身份認證 ssl 參考學習文檔:http://www.cnblogs.com/jifeng/archive/2010/11/30/1891779.html SSL協議的工作流程: 服務器認證階段: 1)客戶端向服務

TCP協議的3次握手與4次揮手過程

進行 發送數據 不存在 信息 隊列 協議 標識 方式 ar9 所謂三次握手(Three-Way Handshake)即建立TCP連接,就是指建立一個TCP連接時,需要客戶端和服務端總共發送3個包以確認連接的建立。所謂四次揮手(Four-Way Wavehand)即終止TCP

轉-Linux啟動過程(inittab、rc.sysinit、rcX.d、rc.local)

dha mage 模塊 都是 交換 如何配置 mas 完全 打開 http://blog.chinaunix.net/space.php?uid=10167808&do=blog&id=26042 1)BIOS自檢2)啟動Grub/Lilo3)加載內

TCP數據傳輸過程

握手 ron 布爾 位域 fcm 打開 數據段 2個 處理 在學習三次握手的時候,我們知道其中有seq、ack兩個序列號。 如果不仔細了解,那麽可能只知道發回去的時候要加一。 下文將著重介紹,關於序列號的傳輸過程。 最關鍵的一句話:序列號為當前端成功發送的數據位數,確認號為

嵌入式開發學習(2)<S5PV210啟動過程>

nan ios eight img 啟動方式 margin 需要 外部 啟動 基本概念: 內存:   SRAM 靜態內存 特點:容量小、價格高,優點:不需要軟件初始化,上電就能用。   DRAM 動態內存 特點:容量大、價格低,缺點:上電不能用,需要軟件初始化。  

linux--系統啟動及安裝過程

linux啟動先通過一張圖來簡單了解下整個系統啟動的流程,整個過程基本可以分為POST-->BIOS-->MBR(GRUB)-->Kernel-->Init-->Runlevel本文出自 “運維自動化” 博客,請務必保留此出處http://shower.blog.51cto.co

HBase寫過程

family region -s ont 流程 size 詳解 put 時機 1基本流程 (1)客戶端發起PUT請求 (2)Zookeeper返回hbase:meta所在的region server (3)去(2)返回的server上,根據rowkey查詢寫操作所在的reg

Mysql加鎖過程

插入記錄 控制 uniq null 詳細 server 讀者 index 理論知識 1、背景   MySQL/InnoDB的加鎖分析,一直是一個比較困難的話題。我在工作過程中,經常會有同事咨詢這方面的問題。同時,微博上也經常會收到MySQL鎖相關的私信,讓我幫助解決一些死

Mysql加鎖過程(4)-select for update/lock in share mode 對事務並發性影響

per inno targe 允許 evel transacti 修改 not null warn select for update/lock in share mode 對事務並發性影響 事務並發性理解 事務並發性,粗略的理解就是單位時間內能夠執行的事務數量,常見的單

CentOS 7系統KVM虛擬機安裝過程

選項 安裝 svm roc 支持 linu 系統 kvm flags 一、如何安裝KVM 這裏我是在Windows系統中使用VMware Workstaion安裝了一臺Linux的虛擬機來進行KVM的安裝操作的。首先,我們需要了解我們安裝的Linux系統的CPU是否支持KV

JVM結構、GC工作機制

固定 本地方法棧 內存池 為什麽 water aml 並且 兩種 數據區 轉自:http://blog.csdn.net/tonytfjing/article/details/44278233 JVM結構、內存分配、垃圾回收算法、垃圾收集器。下面我們一一來看。 一、JVM結

LVS負載均衡器NAT和DR工作模式

lvs 在試驗之前為了更好理解設置的參數,所以先講解一下命令。 一、lvs配置文件和命令: 程序包:ipvsadm(LVS管理工具) 配置文件:/etc/sysconfig/ipvsadm-config 【rpm -ql ipvsadm 查詢包的具體列表】 -A 在服務器列表中新添加一條新的虛擬服務