zookeeper選舉簡單流程?

2021-08-20 04:40:26 字數 2359 閱讀 9725

每個投票中包含了兩個最基本的資訊,所推舉伺服器的sid和zxid,投票(vote)在zookeeper中包含字段如下

id:被推舉的leader的sid。

zxid:被推舉的leader事務id。

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

peerepoch:被推舉的leader的epoch。

state:當前伺服器的狀態。

· 外部投票:特指其他伺服器發來的投票。

· 內部投票:伺服器自身當前的投票。

· 選舉輪次:zookeeper伺服器leader選舉的輪次,即logicalclock。

· pk:對內部投票和外部投票進行對比來確定是否需要變更內部投票。

(1) 選票管理

· sendqueue:選票傳送佇列,用於儲存待傳送的選票。

· recvqueue:選票接收佇列,用於儲存接收到的外部投票。

· workerreceiver:選票接收器。其會不斷地從quorumcnxmanager中獲取其他伺服器發來的選舉訊息,並將其轉換成乙個選票,然後儲存到recvqueue中,在選票接收過程中,如果發現該外部選票的選舉輪次小於當前伺服器的,那麼忽略該外部投票,同時立即傳送自己的內部投票。

· workersender:選票傳送器,不斷地從sendqueue中獲取待傳送的選票,並將其傳遞到底層quorumcnxmanager中。

(2) 演算法核心

上圖展示了fastleaderelection模組是如何與底層網路i/o進行互動的。leader選舉的基本流程如下

1. 自增選舉輪次。zookeeper規定所有有效的投票都必須在同一輪次中,在開始新一輪投票時,會首先對logicalclock進行自增操作。

2. 初始化選票。在開始進行新一輪投票之前,每個伺服器都會初始化自身的選票,並且在初始化階段,每台伺服器都會將自己推舉為leader。

3. 傳送初始化選票。完成選票的初始化後,伺服器就會發起第一次投票。zookeeper會將剛剛初始化好的選票放入sendqueue中,由傳送器workersender負責傳送出去。

4. 接收外部投票。每台伺服器會不斷地從recvqueue佇列中獲取外部選票。如果伺服器發現無法獲取到任何外部投票,那麼就會立即確認自己是否和集群中其他伺服器保持著有效的連線,如果沒有連線,則馬上建立連線,如果已經建立了連線,則再次傳送自己當前的內部投票。

5. 判斷選舉輪次。在傳送完初始化選票之後,接著開始處理外部投票。在處理外部投票時,會根據選舉輪次來進行不同的處理。

· 外部投票的選舉輪次大於內部投票。若伺服器自身的選舉輪次落後於該外部投票對應伺服器的選舉輪次,那麼就會立即更新自己的選舉輪次(logicalclock),並且清空所有已經收到的投票,然後使用初始化的投票來進行pk以確定是否變更內部投票。最終再將內部投票傳送出去。

· 外部投票的選舉輪次小於內部投票。若伺服器接收的外選票的選舉輪次落後於自身的選舉輪次,那麼zookeeper就會直接忽略該外部投票,不做任何處理,並返回步驟4。

· 外部投票的選舉輪次等於內部投票。此時可以開始進行選票pk。

6. 選票pk。在進行選票pk時,符合任意乙個條件就需要變更投票。

· 若外部投票中推舉的leader伺服器的選舉輪次大於內部投票,那麼需要變更投票。

· 若選舉輪次一致,那麼就對比兩者的zxid,若外部投票的zxid大,那麼需要變更投票。

· 若兩者的zxid一致,那麼就對比兩者的sid,若外部投票的sid大,那麼就需要變更投票。

7. 變更投票。經過pk後,若確定了外部投票優於內部投票,那麼就變更投票,即使用外部投票的選票資訊來覆蓋內部投票,變更完成後,再次將這個變更後的內部投票傳送出去。

8. 選票歸檔。無論是否變更了投票,都會將剛剛收到的那份外部投票放入選票集合recvset中進行歸檔。recvset用於記錄當前伺服器在本輪次的leader選舉中收到的所有外部投票(按照服務隊的sid區別,如)。

9. 統計投票。完成選票歸檔後,就可以開始統計投票,統計投票是為了統計集群中是否已經有過半的伺服器認可了當前的內部投票,如果確定已經有過半伺服器認可了該投票,則終止投票。否則返回步驟4。

10. 更新伺服器狀態。若已經確定可以終止投票,那麼就開始更新伺服器狀態,伺服器首選判斷當前被過半伺服器認可的投票所對應的leader伺服器是否是自己,若是自己,則將自己的伺服器狀態更新為leading,若不是,則根據具體情況來確定自己是following或是observing。

以上10個步驟就是fastleaderelection的核心,其中步驟4-9會經過幾輪迴圈,直到有leader選舉產生。

Zookeeper選舉原理

作為乙個分布式應用程式協調服務,在大型 中,其本身也是集群部署的,安裝zookeeper的時候最好是單數節點,因為要選舉。zookeeper的leader節點是集群工作的核心,用來更新並保證leader和server具有相同的系統狀態,follower伺服器是leader的跟隨者,用於接收客戶端的請...

zookeeper選舉機制

fastleaderelection演算法通過非同步的通訊方式來收集其它節點的選票,同時在分析選票時又根據投票者的當前狀態來作不同的處理,以加快leader的選舉程序。每個在zookeeper伺服器啟動先讀取當前儲存在磁碟的資料,zookeeper中的每份資料都有乙個對應的id值,這個值是依次遞增的...

Zookeeper 選舉機制

選舉訊息內容 fastleaderelection 選舉演算法介紹 伺服器id 編號。比如有三颱伺服器,編號分別是1,2,3。編號越大在選擇演算法中的權重越大。資料id。伺服器中存放的最大資料id。值越大說明資料越新,在選舉演算法中資料越新權重越大。邏輯時鐘,用來判斷多個投票是否在同一輪選舉週期中,...