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台机器中。



在进行Leader选举的过程中,各个服务器之间都会两两进行网络连接。在创建网络连接的时候,机器A会和机器B创建一个TCP连接,当然,反之亦然。创建连接之后,机器A和机器B分别会把自己的myid发送给对方。

这个时候,比对完彼此的myid后,myid小的那个机器会主动关闭与对方的连接。