天天看點

【ZooKeeper Notes 23】Leader選舉-來自郵件清單

logical clocks是用來唯一辨別一輪Leader選舉的。

- 次Leader挂了之後,叢集中的其他機器都會對logical clocks值做自增操作。

- 新一輪的Leader選舉開始或新一輪的投票開始了的時候,會對logical clocks值做自增操作。

在FastLeaderElection選舉中,每個機器(peer)都會廣播自己的(zxid,id)。每個機器都會收集叢集中所有的機器的投票。

對于每一個機器來說,在每一輪的選舉逾時結束之前,都應該收集完了其他機器的投票。

對于一個機器而言,如果在收集的過程中,收到了一個更高輪次(epoch)的投票,那麼目前機器會清空所有手機的投票,然後重新加入這一輪投票。

ZooKeeper中有個過半的概念,就是說,對于一個有n台機器的叢集,我們認為 (n/2+1)即為過半,在ZooKeeper中,經常使用“quorum”來表示過半的機器數。

也就是說,理論上隻要能夠收集到大于等于quorum台機器的投票,就可以選出Leader了。同時,也隻能夠在已經收到到quorum台機器的投票後,才可以退出選舉。

這就避免了在沒有足夠的伺服器啟動起來後,Leader就已經失敗退出了(因為選舉逾時了)。實際上,隻有在已經收到了quorum台機器的投票後,才會開始啟動逾時計時。

另一個終止Leader選舉的條件就是,叢集中已經存在了Leader。當叢集中的一個機器發起一輪Leader選舉的時候,會收到“there-is-already-a-leader-for-epoch-X”的消息,

如果大于等于quorum台機器回複了相同的epoch和leader,那麼也就退出了Leader選舉。

無論以哪種方式退出了Leader選舉,在退出Leader選舉流程之前,都需要确定叢集中是否有足夠多的機器參與了投票,即機器數是否過半,同時需要确定目前選出的Leader是否在這個quorum台機器中。