前言
半數機制(Paxos 協定):叢集中半數以上機器存活,叢集可用。是以zookeeper适合裝在奇數台機器上。
Zookeeper雖然在配置檔案中并沒有指定master和slave。但是,zookeeper工作時,是有一個節點為leader,其他則為follower,Leader是通過内部的選舉機制臨時産生的
第一次啟動選舉機制
假設有五台伺服器組成的zookeeper叢集,它們的id從1-5,同時它們都是最新啟動的,也就是沒有曆史資料,在存放資料量這一點上,都是一樣的。假設這些伺服器依序啟動,來看看會發生什麼。
(1)伺服器1啟動,此時隻有它一台伺服器啟動了,它發出去的報沒有任何響應,是以它的選舉狀态一直是LOOKING狀态。(由于人都是自私的,機器也一樣,是以伺服器1先給自己投一個leader票)
(2)伺服器2啟動,同樣,伺服器2在啟動以後也會先給自己投一票。它與最開始啟動的伺服器1進行通信,互相交換自己的選舉結果,由于兩者都沒有曆史資料,并且server2的id比server1大,是以id較大的伺服器2勝出,但是由于沒有達到超過半數以上的伺服器都同意選舉它(這個例子中的半數以上是3),是以伺服器1、2還是繼續保持LOOKING狀态。
(3)伺服器3啟動,根據前面的理論分析,伺服器3成為伺服器1、2、3中的老大,而與上面不同的是,此時有三台伺服器選舉了它,是以它成為了這次選舉的leader。
(4)伺服器4啟動,根據前面的分析,理論上伺服器4應該是伺服器1、2、3、4中最大的,但是由于前面已經有半數以上的伺服器選舉了伺服器3,是以它隻能接收當小弟的命了。
(5)伺服器5啟動,同4一樣當小弟。
這裡有幾個需要注意的概念:
SID:伺服器ID。用來唯一辨別一台ZooKeeper叢集中的機器,每台機器不能重複,和myid一緻。
ZXID:事務ID。ZXID是一個事務ID,用來辨別一次伺服器狀态的變更。在某一時刻,叢集中的每台機器的ZXID值不一定完全一緻,這和ZooKeeper伺服器對于用戶端"更新請求"的處理邏輯有關。
非第一次啟動選舉機制