1. 程式人生 > 其它 >zookeeper的選舉機制

zookeeper的選舉機制

1 選舉機制

(1)半數機制:叢集中半數以上機器存活,叢集可用。所以Zookeeper適合安裝奇數臺伺服器。 (2)Zookeeper雖然在配置檔案中並沒有指定Master和Slave。但是,Zookeeper工作時,是有一個節點為Leader,其他則為Follower,Leader是通過內部的選舉機制臨時產生的。 (3)以一個簡單的例子來說明整個選舉的過程。 假設有五臺伺服器組成的Zookeeper叢集,它們的id從1-5,同時它們都是最新啟動的,也就是沒有歷史資料,在存放資料量這一點上,都是一樣的。假設這些伺服器依序啟動,來看看會發生什麼。

1.1 Zookeeper的選舉機制

(1)伺服器1啟動,發起一次選舉。伺服器1投自己一票。此時伺服器1票數一票,不夠半數以上(3票),選舉無法完成,伺服器1狀態保持為LOOKING; (2)伺服器2啟動,再發起一次選舉。伺服器1和2分別投自己一票並交換選票資訊:此時伺服器1發現伺服器2的ID比自己目前投票推舉的(伺服器1)大,更改選票為推舉伺服器2。此時伺服器1票數0票,伺服器2票數2票,沒有半數以上結果,選舉無法完成,伺服器1,2狀態保持LOOKING (3)伺服器3啟動,發起一次選舉。此時伺服器1和2都會更改選票為伺服器3。此次投票結果:伺服器1為0票,伺服器2為0票,伺服器3為3票。此時伺服器3的票數已經超過半數,伺服器3當選Leader。伺服器1,2更改狀態為FOLLOWING,伺服器3更改狀態為LEADING; (4)伺服器4啟動,發起一次選舉。此時伺服器1,2,3已經不是LOOKING狀態,不會更改選票資訊。交換選票資訊結果:伺服器3為3票,伺服器4為1票。此時伺服器4服從多數,更改選票資訊為伺服器3,並更改狀態為FOLLOWING; (5)伺服器5啟動,同4一樣當小弟。

1.2Zookeeper的選舉機制(文字描述)

選舉的總原則:當zk叢集中任意一臺機器得到選票數超過機器總數的一半以上, 它就是當前叢集的leader。 1. 新搭建的叢集(沒有資料) 舉例說明:以5臺機器為例 前提:叢集配置沒問題!1,2,3,4,5 順時啟動   (1) server1 啟動,此時它會給自己投票,因為當前票數沒有過半,它的投票結果出於(LOOKING) (2) server2 啟動,此時先給自己投一票,然後server2和server1進行通訊,相互交換選票,此時發現給自有一票,那麼進行myid(配置叢集時候的寫的編號)的比較,2 > 1,server2選舉勝出,server1會把票投給server2。這個時候還沒有選出leader,票數沒有達到半數以上。選舉結果任然出於LOCkING。這時候把選票結果恢復到原始狀態,server1和server2都有一票 (3) server3 啟動,先給自己投票,然後就與server1和server2進行通訊,大家交換選票,因為個自都是1票,所以比較myid, 此時server3勝出,server1和server2將自己的選票投給server3,此時server3累計3票,最後判斷當前票數知否超過叢集的總數的一半。由此就把leader選出了,就是server3。 (4) server4 啟動,由於當前叢集已經產生了leader,它就不參與選舉,自動成為follower (5) server5 啟動,由於當前叢集已經產生了leader,它就不參與選舉,自動成為follower 注意:當啟動順序不確定時,選舉結果可能受影響,但是選舉額機制原理不變。 2. 叢集工作中,leader突然掛了,在當前機器存活數過半以上,
要重新選舉出leader。   (1)以上情況出現,會從現有存活的機器中再選出一個leader,此時叢集每臺機器zxid就不一樣,這種情況的選舉就以兩個條件去投票,就是 (myid,zxid)。此時就會選擇當前叢集中zxid值最大的為leader。如果極端情況下,zxid的值一樣,此時會比較myid。可能會丟失資料,重新選舉領導大概是200毫秒,丟失的是毫秒級別的資料 結論:某種意義上,zxid值最大的就可以代表當前叢集中資料最完整的一臺機器。