每個sever首先給自己投票,然后用自己的選票和其他sever選票對比,權重大的勝出,使用權重較大的更新自身選票箱。具體選舉過程如下:
1. 每個Server啟動以后都詢問其它的Server它要投票給誰。對于其他server的詢問, server每次根據自己的狀態都回復自己推薦的leader的id和上一次處理事務的zxid(系統啟動時每個server都會推薦自己)
2. 收到所有Server回復以后,就計算出zxid最大的哪個Server,并將這個Server相關信息設置成下一次要投票的Server。
3. 計算這過程中獲得票數最多的的sever為獲勝者,如果獲勝者的票數超過半數,則改 server被選為leader。否則,繼續這個過程,直到leader被選舉出來
4. leader就會開始等待server連接
5. Follower連接leader,將最大的zxid發送給leader
6. Leader根據follower的zxid確定同步點,至此選舉階段完成。
7. 選舉階段完成Leader同步后通知follower已經成為uptodate狀態
8. Follower收到uptodate消息后,又可以重新接受client的請求進行服務了,目前有5 臺服務器,每臺服務器均沒有數據,它們的編號分別是 1,2,3,4,5,按編號依次啟動,它們的選擇舉過程如下:
9. 服務器1啟動,給自己投票,然后發投票信息,由于其它機器還沒有啟動所以它收不到反饋信息,服務器1的狀態一直屬于Looking。
10. 服務器2啟動,給自己投票,同時與之前啟動的服務器1交換結果,由于服務器2的編號大所以服務器2勝出,但此時投票數沒有大于半數,所以兩個服務器的狀態依然是LOOKING。
11. 服務器3啟動,給自己投票,同時與之前啟動的服務器1,2交換信息,由于服務器3 的編號最大所以服務器3勝出,此時投票數正好大于半數,所以服務器 3 成為領導者,服務器1,2 成為小弟。
12. 服務器4啟動,給自己投票,同時與之前啟動的服務器1,2,3交換信息,盡管服務器 4 的編號大,但之前服務器3已經勝出,所以服務器4只能成為小弟。
13. 服務器5啟動,后面的邏輯同服務器4成為小弟。