选 master 一样,编号最小的获得锁,用完删除,依次执行。
6. Zookeeper 集群是如何选出 leader 的 ( 即选举机制 )?
当 leader 崩溃或者 leader 失去大多数的 follower 时,zk 就进入恢复模式,恢复模式即需要重新
选举出一个新的 leader,让所有的节点都恢复到一个正确的状态。
Zk 的选举算法有两种:一种是基于 BasicLeaderElecon 实现的,另外一种是基于
FastLeaderElecon 算法实现的。系统默认的选举算法为 FastLeaderElecon
基于 BasicLeaderElecon 算法的选举机制:
(1)选举线程是一个独立的线程,其主要功能是对投票结果进行统计,并选出推荐的 Server;
(2)选举线程首先向所有节点发起一次询问(包括自己);在收到回复后,验证是否是自己发起的询
问(验证 zxid 是否一致),然后获取对方的 id(myid),并存储到当前询问对象列表中,最后获取对方
提议的 leader 相关信息(id,zxid),并将这些信息存储到当次选举的投票记录表中;
(3)收到所有节点回复以后,就计算出 zxid 最大的那个节点,并将这个节点相关信息设置成下一
次要投票的节点;
(5)线程将当前 zxid 最大的 Server 设置为当前 Server 要推荐的 Leader,如果此时获胜的
Server 获得 n/2 + 1 的 Server 票数,设置当前推荐的 leader 为获胜的 Server,将根据获胜的
Server 相关信息设置自己的状态,否则,继续这个过程,直到 leader 被选举出来。 通过流程分析
我们可以得出:要使 Leader 获得多数 Server 的支持,则 Server 总数必须是奇数 2n+1,且存活
的 Server 的数目不得少于 n+1. 每个 Server 启动后都会重复以上流程。在恢复模式下,如果是刚
从崩溃状态恢复的或者刚启动的 server 还会从磁盘快照中恢复数据和会话信息,zk 会记录事务日
志并定期进行快照,方便在恢复时进行状态恢复
基于 FastLeaderElecon 算法的选举机制:
FastLeaderElecon 算法选举流程是在选举过程中,某 Server 首先向所有 Server 提议自己要成为
leader,当其它 Server 收到提议以后,解决 epoch 和 zxid 的冲突,并接受对方的提议,然后向对方发
送接受提议完成的消息,重复这个流程,最后一定能选举出 Leader。