zookeeper Leader選舉演算法分析

2021-08-02 07:01:54 字數 1591 閱讀 4004

zookeeper集群leader選舉演算法分析

詳細說明了乙個zk集群如何進行leader選舉

當zk集群中有一台伺服器出現以下2種情況時, 整個集群則會進入leader選舉.

1. 伺服器初始化啟動

2. 伺服器執行期間無法和leader保持鏈結

當一台機器進入leader選舉流程時, 當前集群可能會處於以下2種狀態

1. 集群中本身就存在乙個leader

2. 集群中目前不存在leader

下面從第一種情況開始分析(集群中本身就存在乙個leader).

由於集群已經存在leader, 當該機器嘗試選舉leader時, 會被告知當前leader的資訊, 對於該機器來說, 只需要和leader建立連線, 進行狀態同步.

第二種情況(集群中leader不存在情況),如何進行leader選舉.

通常有2種情況會出現leader不存在情況,

1. 整個集群剛初始化啟動, 此時尚無leader產生

2. 集群執行期間, leader伺服器down掉.

此2種情況, 都會造成集群需要選舉leader, 此時集群狀態為"looking",指的是正在嘗試選舉leader,當一台機器處於"looking"狀態時, 它回向所有其他伺服器傳送訊息, 這個訊息就是"投票".

投票訊息中包含2個基本資訊,

1. sid: 被推薦伺服器的sid

2. zxid: 被推薦伺服器的事物id

下面以(sid,zxid)來標識一次投票資訊, e.g.

當前伺服器要推舉sid為1, zxid為8的伺服器成為leader, 則他本次投票資訊可表示(1,8)

假設當前zk集群有5臺伺服器, sid分別為1, 2, 3,4,5, zxid分別為9,9,9,8,8. 而此時sid為2的伺服器為leader.

某一刻, sid為1和2所在機器出現故障, 集群處於無leader情況, 開始進行leader選舉.

第一次投票, 由於無法檢測到集群中其他機器資訊, 每台機器都將自己作為推舉物件進行投票,

投票結果為:(3,9),(4,8),(5,8)

變更投票

完成上一次投票之後,基於如下篩選規則進行下一輪選舉, 便於描述此篩選規則,首選定義如下術語.

vote_sid:接收到的投票中所推舉leader伺服器的sid

vote_zxid:接受到的投票中所推舉leader伺服器的zxid

self_sid:當前伺服器自己的sid

self-zxid:當前伺服器自己的zxid

每次收到的投票處理, 都是乙個對(vote_id,vote_zxid)和(self_sid,self_zxid)對比的過程.

leader_

if vote_zxid>self_zxid

leader_ = vote_

if vote_zxidleader_=self_

if vote_zxid=self_zxid

根據如上規則, 得出該集群的投票變更過程:

經過第二輪投票後, 如果一台機器收到了超過半數的相同的票數,則這個投票對應的機器成為新leader.

最終結果, 確定server3為leader.

zookeeper Leader的選舉過程

假如有三個節點 s1,s2,s3 組成的集群。在集群啟動過程中,當有一台zookeeper節點s1啟動完成後,此時集群中只有乙個節點無法進行leader的選舉。當第二個節點s2啟動成功後,此時兩個節點可以正常通訊,進入leader的選舉過程,具體如下 每乙個節點都是自私的,各自都投自己1票。每次投票...

Leader Election 選舉演算法

今天講一講分布式系統中必不可少的選舉演算法。leader 就是一堆伺服器中的協調者,某乙個時刻只能有乙個leader且所有伺服器都承認這個leader.leader election就是在一組程序中,選舉乙個leader且讓該組的程序都同意這個leader.假設有n個process,每個proces...

Raft選舉演算法

目標 分布式集群中,選舉leader,保持資料一致性 集群中每個節點都有三種狀態 follower 純小弟 candidate 候選人。我原來是小弟,但我現在想當老大 leader 老大 集群狀態 有明確的老大 穩定狀態 沒有老大,選舉中 有老大的狀態 follower內有倒計時 150ms 300...