溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Zookeeper的ZAB協(xié)議有什么用

發(fā)布時間:2021-07-10 11:35:02 來源:億速云 閱讀:155 作者:chen 欄目:編程語言

這篇文章主要講解了“Zookeeper的ZAB協(xié)議有什么用”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Zookeeper的ZAB協(xié)議有什么用”吧!


前言

Zab(Zookeeper Atomic Broadcast)是為ZooKeeper協(xié)設計的崩潰恢復原子廣播協(xié)議,它保證zookeeper集群數(shù)據(jù)的一致性和命令的全局有序性。

概念介紹

在介紹zab協(xié)議之前首先要知道zookeeper相關的幾個概念,才能更好的了解zab協(xié)議。

  • 集群角色

  1. Leader:同一時間集群總只允許有一個Leader,提供對客戶端的讀寫功能,負責將數(shù)據(jù)同步至各個節(jié)點;

  2. Follower:提供對客戶端讀功能,寫請求則轉(zhuǎn)發(fā)給Leader處理,當Leader崩潰失聯(lián)之后參與Leader選舉;

  3. Observer:與Follower不同的是但不參與Leader選舉。

  • 服務狀態(tài)

  1. LOOKING:當節(jié)點認為群集中沒有Leader,服務器會進入LOOKING狀態(tài),目的是為了查找或者選舉Leader;

  2. FOLLOWING:follower角色;

  3. LEADING:leader角色;

  4. OBSERVING:observer角色;

可以知道Zookeeper是通過自身的狀態(tài)來區(qū)分自己所屬的角色,來執(zhí)行自己應該的任務。

  • ZAB狀態(tài)Zookeeper還給ZAB定義的4中狀態(tài),反應Zookeeper從選舉到對外提供服務的過程中的四個步驟。狀態(tài)枚舉定義:

 
  1.  

        public enum ZabState {  

  2.  

            ELECTION,  

  3.  

            DISCOVERY,  

  4.  

            SYNCHRONIZATION,  

  5.  

            BROADCAST  

  6.  

        }  

  1. ELECTION: 集群進入選舉狀態(tài),此過程會選出一個節(jié)點作為leader角色;

  2. DISCOVERY:連接上leader,響應leader心跳,并且檢測leader的角色是否更改,通過此步驟之后選舉出的leader才能執(zhí)行真正職務;

  3. SYNCHRONIZATION:整個集群都確認leader之后,將會把leader的數(shù)據(jù)同步到各個節(jié)點,保證整個集群的數(shù)據(jù)一致性;

  4. BROADCAST:過渡到廣播狀態(tài),集群開始對外提供服務。

  • ZXID

Zxid是極為重要的概念,它是一個long型(64位)整數(shù),分為兩部分:紀元(epoch)部分和計數(shù)器(counter)部分,是一個全局有序的數(shù)字。

epoch代表當前集群所屬的哪個leader,leader的選舉就類似一個朝代的更替,你前朝的劍不能斬本朝的官,用epoch代表當前命令的有效性,counter是一個遞增的數(shù)字。

選舉

基礎概念介紹完了,下面開始介紹zab協(xié)議是怎么支持leader選舉的。

進行l(wèi)eader有三個問題,什么時候進行?選舉規(guī)則?選擇流程?

下面我會一一解答這三個問題:

  1. 選舉發(fā)生的時機Leader發(fā)生選舉有兩個時機,一個是服務啟動的時候當整個集群都沒有l(wèi)eader節(jié)點會進入選舉狀態(tài),如果leader已經(jīng)存在就會告訴該節(jié)點leader的信息,自己連接上leader,整個集群不用進入選舉狀態(tài)。

    還有一個就是在服務運行中,可能會出現(xiàn)各種情況,服務宕機、斷電、網(wǎng)絡延遲很高的時候leader都不能再對外提供服務了,所有當其他幾點通過心跳檢測到leader失聯(lián)之后,集群也會進入選舉狀態(tài)。

  2. 選舉規(guī)則進入投票選舉流程,怎么才能選舉出leader?或者說按照什么規(guī)則來讓其他節(jié)點都能選舉你當leader。

  3. zab協(xié)議是按照幾個比較規(guī)則來進行投票的篩選,如果你的票比我更好,就修改自身的投票信息,改投你當leader。

    下面代碼是zookeeper投票比較規(guī)則:

 
  1.  

            /*  

  2.  

             * We return true if one of the following three cases hold:  

  3.  

             * 1- New epoch is higher  

  4.  

             * 2- New epoch is the same as current epoch, but new zxid is higher  

  5.  

             * 3- New epoch is the same as current epoch, new zxid is the same  

  6.  

             *  as current zxid, but server id is higher.  

  7.  

             */  

  8.  

     

  9.  

            return ((newEpoch > curEpoch)  

  10.  

                    || ((newEpoch == curEpoch)  

  11.  

                        && ((newZxid > curZxid)  

  12.  

                            || ((newZxid == curZxid)  

  13.  

                                && (newId > curId)))));  

當其他節(jié)點的紀元比自身高投它,如果紀元相同比較自身的zxid的大小,選舉zxid大的節(jié)點,這里的zxid代表節(jié)點所提交事務最大的id,zxid越大代表該節(jié)點的數(shù)據(jù)越完整。

最后如果epoch和zxid都相等,則比較服務的serverId,這個Id是配置zookeeper集群所配置的,所以我們配置zookeeper集群的時候可以把服務性能更高的集群的serverId配置大些,讓性能好的機器擔任leader角色。

  1. 選舉流程

時機和規(guī)則都有了,下面就是leader的選舉流程:Zookeeper的ZAB協(xié)議有什么用

  • 所有節(jié)點第一票先選舉自己當leader,將投票信息廣播出去;

  • 從隊列中接受投票信息;

  • 按照規(guī)則判斷是否需要更改投票信息,將更改后的投票信息再次廣播出去;

  • 判斷是否有超過一半的投票選舉同一個節(jié)點,如果是選舉結(jié)束根據(jù)投票結(jié)果設置自己的服務狀態(tài),選舉結(jié)束,否則繼續(xù)進入投票流程。

  1. 舉例Zookeeper的ZAB協(xié)議有什么用

上圖來自《ZooKeeper:分布式過程協(xié)同技術詳解》,整體流程還是比較簡單,這里就不具體分析了。

廣播

集群在經(jīng)過leader選舉之后還會有連接leader和同步兩個步驟,這里就不具體分析這兩個步驟的流程了,主要介紹集群對外提供服務如何保證各個節(jié)點數(shù)據(jù)的一致性。

zab在廣播狀態(tài)中保證以下特征

  • 可靠傳遞:  如果消息m由一臺服務器傳遞,那么它最終將由所有服務器傳遞。

  • 全局有序: 如果一個消息a在消息b之前被一臺服務器交付,那么所有服務器都交付了a和b,并且a先于b。

  • 因果有序: 如果消息a在因果上先于消息b并且二者都被交付,那么a必須排在b之前。

有序性是zab協(xié)議必須要保證的一個很重要的屬性,因為zookeeper是以類似目錄結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)存儲數(shù)據(jù)的,必須要求命名的有序性。

比如一個命名a創(chuàng)建路徑為/test,然后命名b創(chuàng)建路徑為/test/123,如果不能保證有序性b命名在a之前,b命令會因為父節(jié)點不存在而創(chuàng)建失敗。Zookeeper的ZAB協(xié)議有什么用

如上圖所示,整個寫請求類似一個二階段的提交。

當收到客戶端的寫請求的時候會經(jīng)歷以下幾個步驟:

  1. Leader收到客戶端的寫請求,生成一個事務(Proposal),其中包含了zxid;

  2. Leader開始廣播該事務,需要注意的是所有節(jié)點的通訊都是由一個FIFO的隊列維護的;

  3. Follower接受到事務之后,將事務寫入本地磁盤,寫入成功之后返回Leader一個ACK;

  4. Leader收到過半的ACK之后,開始提交本事務,并廣播事務提交信息

  5. 從節(jié)點開始提交本事務。

有以上流程可知,zookeeper通過二階段提交來保證集群中數(shù)據(jù)的一致性,因為只需要收到過半的ACK就可以提交事務,所以zookeeper的數(shù)據(jù)并不是強一致性。

zab協(xié)議的有序性保證是通過幾個方面來體現(xiàn)的,第一是,服務之前用TCP協(xié)議進行通訊,保證在網(wǎng)絡傳輸中的有序性;第二,節(jié)點之前都維護了一個FIFO的隊列,保證全局有序性;第三,通過全局遞增的zxid保證因果有序性。

狀態(tài)流轉(zhuǎn)

前面介紹了zookeeper服務狀態(tài)有四種,ZAB狀態(tài)也有四種。這里就簡單介紹一個他們之間的狀態(tài)流轉(zhuǎn),更能加深對zab協(xié)議在zookeeper工作流程中的作用。Zookeeper的ZAB協(xié)議有什么用

  1. 服務在啟動或者和leader失聯(lián)之后服務狀態(tài)轉(zhuǎn)為LOOKING;

  2. 如果leader不存在選舉leader,如果存在直接連接leader,此時zab協(xié)議狀態(tài)為ELECTION;

  3. 如果有超過半數(shù)的投票選擇同一臺server,則leader選舉結(jié)束,被選舉為leader的server服務狀態(tài)為LEADING,其他server服務狀態(tài)為FOLLOWING/OBSERVING;

  4. 所有server連接上leader,此時zab協(xié)議狀態(tài)為DISCOVERY;

  5. leader同步數(shù)據(jù)給learner,使各個從節(jié)點數(shù)據(jù)和leader保持一致,此時zab協(xié)議狀態(tài)為SYNCHRONIZATION;

  6. 同步超過一半的server之后,集群對外提供服務,此時zab狀態(tài)為BROADCAST。

可以知道整個zookeeper服務的工作流程類似一個狀態(tài)機的轉(zhuǎn)換,而zab協(xié)議就是驅(qū)動服務狀態(tài)流轉(zhuǎn)的關鍵,理解了zab就理解了zookeeper工作的關鍵原理

感謝各位的閱讀,以上就是“Zookeeper的ZAB協(xié)議有什么用”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對Zookeeper的ZAB協(xié)議有什么用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI