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