sid:服務器id,用來唯一標識一台zookeeper集群中的機器,每台機器不能重復,和myid一致。
zxid:事務id,zxid是一個事務id,用來標識一次服務器狀態的變更。在某一時刻,集群中的每台機器的zxid值不一定完全一致,這和zookeeper服務器對於客戶端更新請求,的處理邏輯有關。
epoch:每個leader任期的代號,沒有leader時同一輪投票過程中的邏輯時鍾值是相同的,每投完一次票這個數據就會增加。
1.服務1啟動,發起一次選舉,服務器1自己投自己一票,此時服務器1票數一票,不夠半數以上3票,選舉無法完成,服務器1狀態保持為looking。
2.服務器2啟動,再發起一次選舉,服務器1和2分別投自己一票並交換選舉信息,此時服務器1發現服務器2的myid比自己目前投票推舉的(服務器1)大,更改選票為推舉服務器2,此時服務器1票數0票,服務器2票2票,沒有半數以上結果,選舉無法完成,服務器1,2狀態保持looking。
3.服務器3啟動,發起一次選舉,此時服務器1和2都會更改選舉票為服務器3,此時投票結果:
服務器1為0票,服務器2為0票,服務器3為3票,服務器3票數過半,當選leader,服務器1,2更改狀態為following,服務器3為leading。
4.服務器4啟動,發起一次選舉,此時服務器123已經不是looking狀態,不會更改選舉信息,交換選票信息結果,服務器3為3票,服務器4為1票,此時服務器4服從多數,更改選舉票為服務器3,並更改狀態為following。
服務器5啟動,同4一樣當小弟。
1.zookeeper集群中的一台服務器出現以下兩個情況之一,就開始進入leader進行選舉;
服務器初始化啟動。
服務器運行期間無法和leader保持連接。
2.而當一台機器進入leader選舉流程時,當前集群也可能會處於以下兩種狀態;
集群中本來就已經存在leader。
對於第一種已經存在leader的情況下,機器試圖去選舉leader時,會被告知當前服務器的leader信息,對於該機器來說,僅僅需要和leader機器建立連接,並進行狀態同步即可。
集群中確認不 存在leader。
假設zookeeper由五台服務器組成,sid分別為1,2,3,4,5zxid分別為8,8,7,7,此時sid為3的服務器是leader,某一時刻,3和5服務器出現故障,因此開始進行leader選舉。
sid為1,2,4的機器投票情況(1,8,1),(1,8,2),(1,7,4)