Zookeeper選舉機制(myid,zxid)

在這裏插入圖片描述

初始化

當啓動初始化集羣的時候,server1的myid爲1,zxid爲0 server2的myid爲2,zxid同樣是0,以此類推。此種情況下zxid都是爲0。先比較zxid,再比較myid
1.服務器1啓動,給自己投票,然後發投票信息,由於其它機器還沒有啓動所以它收不到反饋信息,服務器1的狀態一直屬於Looking(選舉狀態)。
2.服務器2啓動,給自己投票,同時與之前啓動的服務器1交換結果,由於服務器2的myid大所以服務器2勝出,但此時投票數沒有大於半數,所以兩個服務器的狀態依然是LOOKING。
3.服務器3啓動,給自己投票,同時與之前啓動的服務器1,2交換信息,由於服務器3的myid最大所以服務器3勝出,此時投票數正好大於半數,所以服務器3成爲領導者,服務器1,2成爲小弟。
4.服務器4啓動,給自己投票,同時與之前啓動的服務器1,2,3交換信息,儘管服務器4的myid大,但之前服務器3已經勝出,所以服務器4只能成爲小弟。
5.服務器5啓動,後面的邏輯同服務器4成爲小弟
當選舉機器過半的時候,已經選舉出leader後,後面的就跟隨已經選出的leader,所以4和5跟隨成爲leader的server3
所以,在初始化的時候,一般到過半的機器數的時候誰的myid最大一般就是leader

運行期間

按照上述初始化的情況,server3成爲了leader,在運行期間處於leader的server3掛了,那麼非Observer服務器server1、server2、server4、server5會將自己的節點狀態變爲LOOKING狀態
1、開始進行leader選舉。現在選舉同樣是根據myid和zxid來進行
2、首先每個server都會給自己投一票競選leader。假設server1的zxid爲123,server2的zxid爲124,server4的zxid爲169,server5的zxid爲188
3、同樣先是比較zxid再比較,server1、server2、server4比較server4根據優先條件選舉爲leader。然後server5還是跟隨server4,即使server5的zxid最大,但是當選舉到server4的時候,機器數已經過半。不再進行選舉,跟隨已經選舉的leader

重新投票選舉leader怎麼保證數據不會丟失。

我們都知道,zk是cp的,不一定保證可用性,在選舉的過程中,不能對外提供服務。但在選舉的過程中,首先選zxid(zk的事務ID)最大的爲leader,zxid最大,表示數據是最新的,然後廣播給follower,這樣避免數據丟失。