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是不需要的。