1. 程式人生 > >zookeeper入門系列-理論基礎-zab協議

zookeeper入門系列-理論基礎-zab協議

上一章討論了paxos演算法,把paxos推到一個很高的位置。但是,paxos有沒有什麼問題呢?實際上,paxos還是有其自身的缺點的:

1. 活鎖問題。在base-paxos演算法中,不存在leader這樣的角色,於是存在這樣一種情況,即P1提交了一個proposal n1並且通過了prepare階段;此時P2提交了一個proposal n2(n2>n1)並且也通過了prepare階段;P1在commit時因為已經通過了n2而被拒絕;於是P1繼續提交一個proposal n3並且通過prepare階段;巧的是此時P2開始commit了,由於n2<n3再次被拒絕……如此迴圈往復。這種情況被稱為活鎖。

即整個系統都沒死,但由於互相請求資源而被互相鎖死。為了不發生活鎖的情況,最簡單的方式當然是縮減proposer到一個,這樣就不會發生互相請求鎖死的情況,也即退化。事實上很多後來的工業級協議,都是paxos協議的退化或者變種。

2. 複雜度問題。base-paxos協議中還存在這樣那樣的問題,於是各種變種paxos出現了,比如為了解決活鎖問題,出現了multi-paxos;為了解決通訊次數較多的問題,出現了fast-paxos;為了儘量減少衝突,出現了epaxos。可以看到,工業級實現需要考慮更多的方面,諸如效能,異常等等。這也是為啥許多分散式的一致性框架並非真正基於paxos來實現的原因。

3. 全序問題

。對於paxos演算法來說,不能保證兩次提交最終的順序,而zookeeper需要做到這點,可以參考文獻1。

For high-performance, it is important that
ZooKeeper can handle multiple outstanding state changes requested by the client and
that a prefix of operations submitted concurrently are committed according to FIFO
order. 

基於以上這些原因,zookeeper並沒有用paxos作為自己實現的協議,取而代之採用了一種稱為zab的協議,全稱是zookeeper atomic broadcast。下面簡單介紹一下zab協議。

上面說過了,paxos存在活鎖問題,為了解決活鎖問題,zab引入了leader,但是單leader就是赤裸裸的單點問題,如何解決這個單點呢?

paxos採用的方法是leader選舉(沒有采用主備,因為主備過於固定,不夠分散式)。leader選舉就必然出現狀態不一致的情況,於是就有著同步這樣的過程。

zab協議分為4個階段,即階段0為leader選舉,階段1為發現,階段2為同步,階段3為廣播。而實際實現時將發現及同步階段合併為一個恢復階段。



0. leader選舉階段。當叢集中沒有leader或者其他人感受不到leader時會進入這一階段,這一階段的主要目的是選出zxid最大的節點作為準leader。

1. recovery階段。本階段的主要目的是根據準leader的情況將資料同步到其他節點。同步完成後準leader變為leader。

2. broadcast階段。本階段的主要目的是leader收到請求,並將請求轉為proposal,其他節點根據協議進行批准或通過。broadcast階段事實上就是一個兩階段提交的簡化版。其所有過程都跟兩階段提交一致,唯一不一致的是不能做事務的回滾。

廣播的過程實際上類似於二階段提交,但是如果實現完整的兩階段提交,那就解決了一致性問題,沒必要發明新協議了,所以zab實際上拋棄了兩階段提交的事務回滾,於是一臺follower只能回覆ACK或者乾脆就不回覆了,leader只要收到過半的機器回覆即通過proposal。但是這樣的設計就存在很多問題,比如如果一個follower因為網路問題從頭到尾一直沒收到過leader的proposal,後續的詢問剛好落到這臺follower上該如何處理?比如leader第一階段收到了所有follower的ACK後提交,然後通知其他follower提交,這時自己掛了該如何處理?於是誕生了崩潰恢復階段,旨在對各種不一致情況做出恢復和處理。

對於選舉和恢復階段。zab演算法需要確保兩件事。

1. 已經處理過的proposal不能被丟棄

發生場景:leader傳送了proposal,follower1和follower2回覆了ACK給leader,leader向所有follower傳送commit請求並commit自身,此時leader掛了。leader已經提交,但是follower尚未提交,這會存在不一致的情況。

確保方式:

a. 重新選舉leader時只挑選zxid最大的follower。因為至少半數的follower曾今回覆ACK,意味著重新選舉時zxid最大的follower應該是當初回覆ACK但尚未提交的其中一臺。

b. 該follower即準leader,將自身收到prepare但尚未提交的proposal提交

c. 在選舉階段準leader已經能拿到其餘follower的所有事務集合,於是準leader根據各個follower的事務執行情況,分別建立佇列,先發送prepare請求,再發送commit請求,讓所有follower都同步到與leader一樣的狀態。

通過以上方式,能夠確保提交過的proposal不會出現丟棄的情況。

2. 已經丟棄的proposal不能被重複處理

發生場景:leader收到請求,包裝為proposal,此時網路掛了或者leader掛了導致其他follower沒收到請求,此時進入崩潰恢復階段,此時其他follower選主併成功之後這個掛了 的leader以follower的身份加入,此時它有一個多餘的proposal,與其他節點不一致。

確保方式:

通過zxid的大小能夠直接確定。zxid的編碼方式為高32位為epoch(即紀元,可以理解為代),低32位為每個proposal順序遞增的數字。每次變換一個leader,則epoch加一,可以理解為改朝換代了,這樣,新朝代的zxid必然比舊朝代的zxid大,新代的leader可以要求將舊朝代的proposal清除。

可以考慮一下,如果leader在崩潰恢復階段就滿血復活了,此時叢集的情況是什麼樣的。

ZooKeeper’s atomic broadcast protocol:Theory and practice  http://www.tcs.hut.fi/Studies/T-79.5001/reports/2012-deSouzaMedeiros.pdf

Zookeeper ZAB 協議分析 http://blog.xiaohansong.com/2016/08/25/zab/

Zab協議 http://www.cnblogs.com/sunddenly/articles/4073157.html

ZAB協議和Paxos演算法 http://codingo.xyz/index.php/2016/12/27/zab_paxos/

ZooKeeper之ZAB協議 http://www.solinx.co/archives/435

Zab vs. Paxos https://cwiki.apache.org/confluence/display/ZooKeeper/Zab+vs.+Paxos

ZooKeeper學習第七期--ZooKeeper一致性原理 http://www.cnblogs.com/sunddenly/p/4138580.html

分散式系統理論進階 - Raft、Zab http://www.cnblogs.com/bangerlee/p/5991417.html

相關推薦

zookeeper 入門系列-理論基礎zab 協議

prefix 什麽 cast 復雜度 通信 隊列 xid zab協議 合並 上一章討論了paxos算法,把paxos推到一個很高的位置。但是,paxos有沒有什麽問題呢?實際上,paxos還是有其自身的缺點的: 1. 活鎖問題。在base-paxos算法中,不存在leade

zookeeper入門系列-理論基礎-zab協議

上一章討論了paxos演算法,把paxos推到一個很高的位置。但是,paxos有沒有什麼問題呢?實際上,paxos還是有其自身的缺點的: 1. 活鎖問題。在base-paxos演算法中,不存在leader這樣的角色,於是存在這樣一種情況,即P1提交了一個proposal n

zookeeper入門系列-理論基礎-分散式事務

上一章我們瞭解了zookeeper到底是什麼,這一章重點來看zookeeper當初到底面臨什麼問題?而zookeeper又是如何解決這些問題的? 實際上zookeeper主要就是解決分散式環境下的一致性問題。那麼解決這個問題到底有哪些難點呢?我們一步一步來闡述和推理這個過程

十五分鐘快速入門系列 Python基礎

                        &nbs

zookeeper入門系列講解

    zookeeper可謂是目前使用最廣泛的分散式元件了。其功能和職責單一,但卻非常重要。    在現今這個年代,介紹zookeeper的書和文章可謂多如牛毛,本人不才,試圖通過自己的理解來介紹zookeeper,希望通過一個初學者的視角來學習zookeeper,以期讓人更加深入和平穩的理解zookeep

分散式理論系列(三)ZAB 協議

分散式理論系列(三)ZAB 協議 在學習了 Paxos 後,接下來學習 Paxos 在開源軟體 Zookeeper 中的應用。 一、Zookeeper Zookeeper 致力於提供一個高效能、高可用,且具有嚴格的順序訪問控制能力(主要是寫操作的嚴格順序性)的分散式協調服務。高效能使得 Zooke

快速入門系列--WebAPI--01基礎

簡單例子 codec 應該 sem ons 請求重定向 選擇 char 阻止 ASP.NET MVC和WebAPI已經是.NET Web部分的主流,剛開始時兩個公用同一個管道,之後為了更加的輕量化(WebAPI是對WCF Restful的輕量化),WebAPI使用了新的管道

《HTTP協議:菜鳥入門系列

數據 www spa tar 自動化 方向 blog sco 就會 很多測試人員在有了一定的測試經驗(一般是1-2年)後,就會陷入瓶頸階段,想提升,但不知道如何提升,學習又沒有比較明確的方向,曾經我也是。。。 那麽,我建議系統的學習一下HTTP協議,好處很多:對接口測試、性

【JAVA零基礎入門系列】Day1 開發環境搭建

oracle 零基礎 ati 成功 官方 運行 根目錄 文件目錄 sys 一、安裝JDK java的sdk簡稱JDK ,去其官方網站下載最近的JDK即可。 http://www.oracle.com/technetwork/java/javase/downloads/jdk

【JAVA零基礎入門系列】Day2 Java集成開發環境IDEA

log rgs string 文件夾 ges jetbrains 技術 http clip 開發環境搭建好之後,還需要一個集成開發環境也就是IDE來進行編程。這裏推薦的IDE是IDEA,那個老掉牙的Eclipse還是先放一邊吧,(手動滑稽)。 IDEA的下載地址:http:

【JAVA零基礎入門系列】Day3 Java基本數據類型

大小 服務器開發 技術 容易 需求 .html 內存空間 安全性能 com   前兩篇已經將開發環境搭建完成,如果你已經按之前的教程按部就班的完成了部署,那麽世界上最優秀的編程語言之一和世界上最優秀的IDE之一已經出現在你的電腦上(此處應有掌聲),如果你還沒入門,或者正在臺

【JAVA零基礎入門系列】Day4 變量與常量

聲明變量 初學 不同 常量 此外 程序員 限制 如果 可維護   這一篇主要講解Java中的變量,什麽是變量,變量的作用以及如何聲明,使用變量。   那麽什麽是變量?對於初學者而言,可以將變量理解為盒子,這些盒子可以用來存放數據,不同類型的數據需要放在對應類型的盒子裏。那麽

Zookeeper ZAB 協議分析

指令 get 不同 保持 lead 細節 決定 rsquo res 前言 ZAB 協議是為分布式協調服務 ZooKeeper 專門設計的一種支持崩潰恢復的原子廣播協議。在 ZooKeeper 中,主要依賴 ZAB 協議來實現分布式數據一致性,基於該協議,ZooKeeper

【JAVA零基礎入門系列】Day12 Java類的簡單應用

object dsa tle 多行註釋 兩個 內容 ice public 所有   俗話說的好,實踐出真知,所以除了理論知識掌握紮實以外,更重要的是要多加操練,這樣才能掌握核心科技。   今天我們就用剛學會的類來實踐一下,目標便是完成上一篇中的剁手任務。   我們的商品類已

【JAVA零基礎入門系列】Day13 Java類的繼承與多態

總經理 system 變量賦值 電腦 pub 封裝 java類的繼承 onu def   繼承是類的一個很重要的特性,什麽?你連繼承都不知道?你是想氣死爸爸好繼承爸爸的遺產嗎?(滑稽)   開個玩笑,這裏的繼承跟我們現實生活的中繼承還是有很大區別的,一個類可以繼承另一個類,

【JAVA零基礎入門系列】Day14 Java對象的克隆

err 所有 引用類型 也會 cnblogs after 還需要 sys 聲明   今天要介紹一個概念,對象的克隆。本篇有一定難度,請先做好心理準備。看不懂的話可以多看兩遍,還是不懂的話,可以在下方留言,我會看情況進行修改和補充。   克隆,自然就是將對象重新復制一份,那為

【JAVA零基礎入門系列】Day15 對象的比較

nbsp override 法則 屬於 問題 設置 equal 以及 his   最近一直有事,博客也停筆了一段時間,十分抱歉。   這一篇主要講講對象的比較,什麽是對象的比較,我們知道兩個數值類型只需要用“==”符號即可進行相等判斷,但如果是兩個Goods對象呢?如何進行

Zookeeper - 簡述分布式一致性協議(2pc、3pc、paxos、zab

傳遞 val 其他 中斷 可選 2pc 不一致 操作 nco 分布式一致性協議 二階段提交協議(2pc) 三階段提交協議(3pc) paxos zab 在分布式系統中,每個機器都可以確定自己進行的事務操作是否成功,但是無法直接了解其他機器的操作結果。因此,當一個分布式事

華為設備OSPF理論基礎和實現實驗(迎接IPv6數通時代的重要協議

乾頤堂軍哥hcie17.3 IPv6路由基礎-OSPFv3 關於OSPFv3的詳盡描述出現在RFC2740中,OSPFv3是OSPF Version 3的簡稱,OSPFv3是運行於IPv6的OSPF路由協議,OSPFv3在OSPFv2基礎上進行了修改,是一個獨立的路由協議。當然我們可以這樣認為OSPFv3的

十五分鐘快速入門系列:Python基礎

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!