Zookeeper 3.3.3 LeaderElection算法總結

LeaderElection. lookForLeader():

1.        生成一個隨機數xid

2.        對每一個PARTICIPANT依次執行如下步驟:

a)        發送xid,等待消息該PARTICIPANT返回。

b)        響應返回responseBuffer,讀取第一個字段xid1,對比返回的xid1是否與xid相同,不同則認爲是錯誤的消息,continue;

c)        讀取返回的PARTICIPANT的服務器id,放入heardFrom列表。

d)        讀取返回的PARTICIPANT的服務器推薦的投票的服務器id和zxid,放入votes中。

3.        countVotes統計以上返回的投票情況

a)        去掉votes中沒有在heardFrom中的服務器列表,(就是說所有被推舉的服務器本身也必須要有響應返回纔行)。

b)        將votes中所有相同的服務器id的zxid設置成他們中最大的zxid.

c)        統計每個服務器id被推舉的次數count,並記錄count最大的服務器id和count爲winner.

d)        統計zxid最大的服務器id出現的次數count,記錄該服務器的id和count爲vote.

4.        設置vote爲當前投票結果。

5.        如果winner的winningcount大於1/2 PARTICIPANT 數,那麼就要設置當前結果爲winner.(注:有可能最後選擇的不是zxid最大的服務器…??),更改本地服務器狀態,爲leading或者following.

6.        如果以上方式沒有選擇出leader,則繼續從第2步循環執行。

 

PS:

  LeaderElection與FastLeaderElection的算法區別還是比較大的,LeaderElection相對比較簡單,它需要等待所有服務器返回後再統計投票結果,並且最後選擇的leader有可能不是zxid最大的服務器。FastLeaderElection是每次收到回覆都會計算投票結果,相對來說選擇leader的效率上應當會高些,當然這個只是我從這個算法上的看法。

另外:採用這種選舉算法不需要設置electionaddr. 即host:port1:port2 中,port2是不需要的。


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