1 前置概念:
- myid:服务器的标示
- zxid:表示更新操作的事务id,高32位是leader的序号,第32位是在当前leader领导下的更新序号
- logicClock:当前服务器发起投票轮次
- 服务器状态:
- looking:不明确自己的定位
- following:作为跟随者明确自己的leader
- leading:作为leader
- observing:没有选举权和被选举权的跟随者
2 选举算法的过程
2.1 集群启动时选举过程
- 清空投票箱:投票箱在zookeepr中体现为内存中的一个数组,而在内存中所带来的负面影响就是可能投票箱失效
- 首次投票:每个服务器推举自己为leader并且将信息散布给其他节点,信息的结构为(logicClock,myid,zxid)表示为当前服务器在logicClock轮次推举myid服务器被推举的服务器最大事物id为zxid,logicClock的价值体现在如果有服务器掉线能够判断出它发送出的是不是有效信息,而zxid的价值体现在不让最新信息丢失
- 选票pk:
- pk选举的轮次:如果当前服务器选举轮次低于接收到选票的选举轮次将清空自身的投票箱并且将自身选举轮次设置为选票中轮次最高的那一个,在所有选票具有相同选举轮次的数量如果大于1将进行下一轮pk(因为zk规定所有有效的投票都必须在同一轮次中)。
- pk选票:选票的比较主要为比较事物id谁更大,当事物id相同时就比较myid,最后将最终pk认可的leader传播出去
- 终结条件:当本轮投票有过半的服务器认可了投票即终止,通过每个服务器收到的选票来确定是否过半服务器认同同一个leader。
选举过程中传递各种信息的目的为了什么:为了保证选举出的leader是知道最多信息的服务器,防止信息的丢失,并且保证集群中传递的信息是最新的,该算法的目的也是为了解决这个问题。
2.2 follower重新上线对选举的影响
- 上线的服务器进入looking状态发起新一轮投票
- 接受到其他服务器传来的选票信息并且确认leader
2.3 leader重新上线对选举的影响
- 当leader下线时follower服务器进入looking状态
- 重复2.1部分的操作选出一个新leader,而不同点在于zxid的作用得到了体现,事物id越大才越能当leader代表知道的信息越多越不容易造成数据的丢失,zxid不同的原因是集群在更新数据时并不需要所有服务器都同意所以事物id有所不同。
- 之前的leader重新加入集群执行2.2部分的操作成为一个普通的follower。
3 拓展
3.1 没有选举权的服务器有什么存在的意义
observer服务器的存在是为了解决集群数量增加时写效率下降的问题,而写效率下降时由于写操作需要集群中机器投票来决定是否允许本次写操作所引起的,而增加集群数量一般是为了提高读效率减少延迟
3.2 不同zk节点保存的服务器列表信息不同对选举的影响
不同服务器中配置的服务器列表不同对选举是没有影响的,因为集群的搭建是一台一台机器顺序加进去的,当新加入的机器不是被集群所有人认识的话就不会被加入进来