当ZooKeeper集群中没有Leader时,会进行选举。
选举过程大致如下
- 产生投票. 投票信息:(sid, zxid) ( 机器id, 本机最大事务id ). 最开始均投票给自己成为Leader
- 发出投票
- 接收他人的投票信息;
- 投票比较。 接收到的投票信息和自己产生的投票比较。 选举max(zxid)最大的投票,如果max(zxid)有多个,则从max(zxid)投票中选择max(sid)的投票
- 根据投票比较结果,判断是否需要修改投票。
如果选择的投票结果不是本机第2步发出的投票,将本机投票信息修改为投票比较结果选出的投票信息,跳转第2步;
如果选择的投票结果是本机第2步发出的投票,则判断投票选举数是否过半。
如果未过半,则跳转第2步。
如果过半,则投票选举机器成为Leader,选举完成;
没有Leader的场景
- 初始启动
- 运行过程中Leader挂掉了 (Leader本身挂掉或者网络异常等)