全網最通俗易懂的zookeeper選舉機制

目前網絡上已有很多文章講解了zookeeper的選舉機制,但都比較抽象難懂,於是寫下此文,用最通俗易懂的語言闡述zookeeper的選舉機制,希望能幫助大家理解

zookeeper的選舉機制一言以蔽之:得票數超過半數的服務器就是leader

舉例:zookeeper節點爲5臺
在這裏插入圖片描述

只要有一臺節點的得票數爲3 即爲leader, 其他節點統統是follower

那麼znode是如何投票呢?

假設這五臺服務器它們都是最新啓動的,沒有歷史數據,那麼投票是根據兩點決定的:
1. 啓動順序
2. Myid

Myid是提供應用的唯一標識
在 Zookeeper 集羣中,每個節點需要一個唯一標識。這個唯一標識要求是自然數。
且唯一標識保存位置是:$dataDir/myid。
其中 dataDir 爲配置文件 zoo.cfg 中的配置參數

在這裏插入圖片描述

在 data 目錄中創建文件 myid,爲應用提供唯一標識。本環境中使用 1、2、3、4、5 作爲每個節點的唯一標識。

在這裏插入圖片描述

那麼此時的zookeeper集羣應該長這個樣子:
在這裏插入圖片描述
回到上文,投票是根據啓動順序和myid兩點決定的,那麼我們假設啓動順序是依次進行:

(1)服務器1啓動,此時只有它一臺服務器啓動了,先給自己投一票,因爲沒超過半數,所以一直處於等待狀態(LOOKING)
在這裏插入圖片描述
(2)服務器2啓動,先給自己投一票,然後它與最開始啓動的服務器1進行通信,互相交換自己的選舉結果,因爲各自得票都是1票,所以開始比較myid的值,於是server2勝出,Server1將自己的一票投給Server2,但即便如此Server2的票數還是沒有達到超過半數以上,所以服務器1、2還是繼續保持LOOKING狀態,恢復到各自得票數爲1
在這裏插入圖片描述
(3)服務器3啓動,根據前面的理論分析,服務器3先給自己投一票,然後它與最開始啓動的服務器1,服務器2進行通信,互相交換自己的選舉結果,因爲各自得票都是1票,所以開始比較myid的值,於是server3勝出,Server1和Server2將自己的一票都投給Server3,此時Server3得票數超過半數,所以它成爲了這次選舉的Leader。
在這裏插入圖片描述
(4)此時服務器4,5啓動,由於Servre3已經是Leader,所以Server4,5只能是Follower
至此選舉結束

2.那麼我們假設啓動順序是亂序的,再走一遍:

(1)服務器3先啓動,此時只有它一臺服務器啓動了,先給自己投一票,因爲沒超過半數,所以一直處於等待狀態(LOOKING)
在這裏插入圖片描述

(2)然後服務器2啓動,先給自己投一票,然後它與最開始啓動的服務器3進行通信,互相交換自己的選舉結果,因爲各自得票都是1票,所以開始比較myid的值,於是server3勝出,Server2將自己的一票投給Server3,但即便如此Server3的票數還是沒有達到超過半數以上,所以服務器2、3還是繼續保持LOOKING狀態,恢復到各自得票數爲1
在這裏插入圖片描述

(3)再然後服務器5啓動,根據前面的理論分析,服務器5先給自己投一票,然後它與最開始啓動的服務器2,服務器3進行通信,互相交換自己的選舉結果,因爲各自得票都是1票,所以開始比較myid的值,於是server5勝出,Server2和Server3將自己的一票都投給Server5,此時Server5得票數超過半數,所以它成爲了這次選舉的Leader。

在這裏插入圖片描述
(4)此時服務器1,4啓動,由於Servre5已經是Leader,所以Server1,4只能是Follower,至此選舉結束

以上就是zookeeper的選舉過程,有收穫的小夥伴給作者點個贊吧~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章