回覆列表
  • 1 # Java架構達人

    zab協議

    Zookeeper的核心是原子廣播,這個機制保證了各個Server之間的同步。實現這個機制的協議叫做Zab協議。Zab協議有兩種模式,它們分別是恢復模式(選主)和廣播模式(同步)。

    選主和同步的聯絡

    當服務啟動或者在領導者崩潰後,Zab就進入了恢復模式,當領導者被選舉出來,且大多數Server完成了和leader的狀態同步以後,恢復模式就結束了。

    因此,選主得到的leader保證了同步狀態的進行,狀態同步又保證了leader和Server具有相同的系統狀態,當leader失去主權後可以在其他follower中選主新的leader。

    為了保證事務的順序一致性,zookeeper採用了遞增的事務id號(zxid)來標識事務。所有的提議(proposal)都在被提出的時候加上了zxid。實現中zxid是一個64位的數字,它高32位是epoch(年號)用來標識leader關係是否改變,每次一個leader被選出來,它都會有一個新的epoch(時期、。紀元),標識當前屬於那個leader的統治時期。低32位用於遞增計數。

    每個Server在工作過程中有三種狀態:

    •LOOKING:當前Server不知道leader是誰,正在搜尋

    •LEADING:當前Server即為選舉出來的leader

    •FOLLOWING:leader已經選舉出來,當前Server與之同步

    異常問題的處理

    1). 選舉過程中,新的Server加入

    當一個Server啟動時它都會發起一次選舉,此時由選舉執行緒發起相關流程,那麼每個Server都會獲得當前zxid最大的那個server,如果本次最大的Server沒有獲得n/2+1 個票數,那麼下一次投票時,他將向zxid最大的Server投票,重複以上流程,最後一定能選舉出一個Leader。

    2). 選舉過程中,Server退出

    只要保證n/2+1個Server存活zk service仍可以正確工作,如果少於n/2+1個Server 存活就沒辦法選出Leader。

    3). 選舉過程中或選舉完成後,Leader死亡

    當選舉出Leader以後,其他server已經處於FLLOWING 狀態,本次選主過程正常進行。當選主完成後,所有的Fllower都會向Leader傳送Ping訊息,如果無法ping通,就改變自己的狀為(FLLOWING ==> LOOKING),發起新的一輪選舉。

    4). 雙主問題

    Leader的選舉是保證只產生一個公認的Leader的,而且Follower重新選舉與舊Leader恢復並退出基本上是同時發生的,當Follower無法ping通Leader時就認為Leader已經出問題開始重新選舉,Leader收到Follower的ping沒有達到半數以上則要退出Leader重新選舉。

  • 中秋節和大豐收的關聯?
  • 肝氣不舒吃什麼藥最好?