Leader選舉
ZooKeeper 需要在所有的服務(可以了解為伺服器)中選舉出一個 Leader ,然後讓這個 Leader 來負責管理叢集。此時,叢集中的其它伺服器則成為此 Leader 的 Follower 。并且,當 Leader 故障的時候,需要 ZooKeeper 能夠快速地在 Follower 中選舉出下一個 Leader 。這就是 ZooKeeper 的 Leader 機制,下面我們将簡單介紹在 ZooKeeper 中, Leader 選舉( Leader Election )是如何實作的。
此操作實作的核心思想是:首先建立一個 EPHEMERAL 目錄節點,例如“ /election ”。然後。每一個 ZooKeeper 伺服器在此目錄下建立一個 SEQUENCE| EPHEMERAL 類型的節點,例如“ /election/n_ ”。在 SEQUENCE 标志下, ZooKeeper 将自動地為每一個 ZooKeeper 伺服器配置設定一個比前一個配置設定的序号要大的序号。此時建立節點的 ZooKeeper 伺服器中擁有最小序号編号的伺服器将成為 Leader 。
在實際的操作中,還需要保障:當 Leader 伺服器發生故障的時候,系統能夠快速地選出下一個 ZooKeeper 伺服器作為 Leader 。一個簡單的解決方案是,讓所有的 follower 監視 leader 所對應的節點。當 Leader 發生故障時, Leader 所對應的臨時節點将會自動地被删除,此操作将會觸發所有監視 Leader 的伺服器的 watch 。這樣這些伺服器将會收到 Leader 故障的消息,并進而進行下一次的 Leader 選舉操作。但是,這種操作将會導緻“從衆效應”的發生,尤其當叢集中伺服器衆多并且帶寬延遲比較大的時候,此種情況更為明顯。
在 Zookeeper 中,為了避免從衆效應的發生,它是這樣來實作的:每一個 follower 對 follower 叢集中對應的比自己節點序号小一号的節點(也就是所有序号比自己小的節點中的序号最大的節點)設定一個 watch 。隻有當 follower 所設定的 watch 被觸發的時候,它才進行 Leader 選舉操作,一般情況下它将成為叢集中的下一個 Leader 。很明顯,此 Leader 選舉操作的速度是很快的。因為,每一次 Leader 選舉幾乎隻涉及單個 follower 的操作。