eader选举的算法有三种
leaderElection/AuthFastLeaderElection/FastLeaderElection
其中FastLeaderElection 是zookeeper 默认的一种算法,本文介绍fastLeaderElection.
几个必要的概念
serverid : 在配置server集群的时候,给定服务器的标识id(myid)
zxid : 服务器在运行时产生的数据ID, zxid的值越大,表示数据越新 也可以理解为事务id 这点很重要因为事务id越大就以为着该台服务器上的数据越新。
逻辑时钟(Epoch): 选举的轮数
server的状态:Looking、 Following、Observering、Leading
I .数据恢复阶段
首先,每个在zookeeper服务器先读取当前保存在磁盘的数据,zookeeper中的每份数据,都有一个对应的id值,这个值是依次递增的,换言之,越新的数据,对应的ID值就越大.
II 首次发送自己的投票值
解释如下:
全天下我最牛,在我没有发现比我牛的推荐人的情况下,我就一直推举我当leader。第一次投票那必须推举我自己当leader。
每当我接收到其它的被推举者,我都要回馈一个信息,表明我还是不是推举我自己。如果被推举者没我大,我就一直推举我当leader,是我是我还是我!
我有一个票箱, 和我属于同一轮的投票情况都在这个票箱里面。一人一票 重复的或者过期的票,我都不接受。
一旦我不再推举我自己了(这时我发现别人推举的人比我推荐的更牛),我就把我的票箱清空,重新发起一轮投票(这时我的票箱一定有两票了,都是选的我认为最牛的人)。
一旦我发现收到的推举信息中投票轮要高于我的投票轮,我也要清空我的票箱。并且还是投当初我觉得最牛的那个人(除非当前的人比我最初的推荐牛,我就顺带更新我的推荐)。
不断的重复上面的过程,不断的告诉别人“我的投票是第几轮”、“我推举的人是谁”。直到我的票箱中“我推举的最牛的人”收到了不少于 N /2 + 1的推举投票。
这时我就可以决定我是flower还是leader了(如果至始至终都是我最牛,那我就是leader咯,其它情况就是follower咯)。并且不论随后收到谁的投票,都向它直接反馈“我的结果”。