ZooKeeper系列:ZAB協議

一、ZAB協議的核心

    所有事務請求必須由一個全局唯一的服務器來協調處理,這樣的服務器被稱爲 Leader 服務器,而餘下的其他服務器則成爲 Follower 服務器。 Leader服務器負責將一個客戶端事務請求轉換成一個事務Proposal(提議),並將該Proposal分發給集羣中所有的Follower 服務器。之後Leader服務器需要等待所有Follower服務器的反饋,一旦超過半數的Follower服務器進行了正確的反饋後,那麼Leader就會再次向其他所有的服務器分發Commit消息,要求其將前一個Proposal進行提交。

    這裏需要注意的是,如果是集羣中的非Leader服務器收到了客戶端的事務請求,那麼會將這個請求轉發給Leader服務器。

二、基本模式

    ZAB協議主要包含兩個基本模式:消息廣播和崩潰恢復。

1、消息廣播

    當集羣中過半服務器和Leader完成了狀態同步後,ZAB協議就進入了消息廣播模式。

    ZAB協議通過原子廣播協議來實現消息的廣播過程。當Leader服務器接收到客戶端的事務請求時,會爲其生成對應的事務Proposal,並將Proposal發送給集羣中的其他機器。Follower收到Proposal後有兩個選擇:同意事務,或者拋棄Leader服務器。當Leader服務器收集到超過一半Follower的投票時,就會想所有的機器發送Commit命令,要求提交事務。

    當然,這裏有一些問題。如果Leader在發送完全部Commit命令前就發生了故障,這時候可能會導致這次的數據更新產生不一致的問題,因爲可能有些服務器上提交了事務,而有些服務器沒收到事務提交的請求。zk通過使用崩潰恢復機制來解決這個問題。

    另外,消息廣播使用TCP協議進行通信。TCP協議FIFO的特性可以保證消息廣播過程中消息接收預發送的順序性。

    對於廣播事務Proposal,Leader服務器會爲每個事務請求都分配一個全局唯一、且單調遞增的事務id(ZXID)。

    消息廣播過程中,Leader 服務器會爲每一個Follower服務器都各自分配一個單獨的隊列,然後將需要廣播的事務Proposal依次放入這些隊列中,根據FIFO策略進行消息發送。每一個 FolIower服務器在接收到這個事務Proposal之後,都會首先將其以事務日誌的形式寫入到本地磁盤中去,並且在成功寫入後反饋給Leader服務器一個Ack響應。當Leader服務器接收到超過半數Follower的Ack響應後,就會廣播一個Commit消息給所有的Follower服務器以通知其進行事務提交,同時Leader自身也會完成對事務的提交,而每一個Follower服務器在接收到Commit消息後,也會完成對事務的提交。

2、崩潰恢復

    在集羣啓動,或者Leader服務器出現網絡中斷、崩潰退出、重啓等異常情況,導致Leader服務器不能和過半服務器取得聯繫的時候,ZAB協議會進入恢復模式,並選舉產生新的Leader服務器。新Leader產生並且集羣中過半的機器完成狀態同步後,ZAB協議退出恢復模式。其中,狀態同步就是數據同步。

    在消息廣播狀態,如果一臺新的服務器加入集羣,或者失聯的機器恢復連接後,該機器會自動進入恢復模式,去尋找Leader服務器並進行狀態同步,然後退出恢復模式進入消息廣播的狀態。

    崩潰恢復的核心的高效可靠的Leader選舉算法:一方面,要讓Leader服務器自身快速認識到自身已經成爲新的Leader;另一方面,還要讓集羣中的其他機器快速感知到新的Leader服務器。

1、基本特性

    1)ZAB協議確保在Leader服務器上提交的事務,最終要被全部服務器都提交;

    2)ZAB協議確保丟棄只在Leader服務器上被提交的事務。

    這兩條基本特性的保證,ZAB協議是通過ZXID(事務編號)來進行保證的。ZAB的Leader選舉算法保證,新選舉出來的Leader服務器擁有最高的ZXID,這樣,這個新的Leader服務器一定擁有所有已提交的事務。同時,這也能省去新Leader檢查事務提交和丟棄的過程,只需要要求其他服務器同步自己的狀態即可。

2、數據同步

    Leader選舉完成後,首先會確認數據同步是否完成。數據同步完成的標誌,是事務日誌中所有的事務,都被一半以上的Follower提交了。

    ZXID是一個64位的數字。低32位是針對客戶端的每一個事務請求的編號,Leader服務器每產生新的事務Proposal,都會對該計數器加1;高32位則代表了Leader週期epoch的編號,每當選舉產生新的Leader,就會將Leader服務器本地日誌中最大事務的ZXID的epoch加1,並將低32位置0來生成新的ZXID。

    基於上述策略,當一個新機器加入集羣,或者崩潰集羣恢復連接,如果集羣中包含以前週期中的未提交事務,這些事務就會被丟棄;同時,週期落後的機器的ZXID肯定比周期更先進的機器要小,也就不會在選舉中成爲新的leader。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章