分布式复习--协调服务 zookeeper四

zookeeper集群

leader选举  :zookeeper 提供了三种选举算法 leaderElection , fastLeaderElection ,authFastLeaderElection

 默认为 fastLeaderElection 

源码地址:https://github.com/apache/zookeeper.git

QuorumPeer 类  startLeaderElection方法

 

serverID:在配置server集群时,给服务器的标识id(myid)

zxid:服务器在运行时产生的数据id,zxid的值越大,表示数据越新。

Epoch:选取的轮数

server的状态:Looking,Following,Observering,Leading

 

第一次初始化启动的时候:所有zk服务器的状态都是Looking。

 

 当leader崩溃或者leader失去大多数的follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的leader,让所有的 Server都恢复到一个正确的状态。Zk的选举算法有两种:一种是基于basic paxos实现的,另外一种是基于fast paxos算法实现的。系统默认的选举算法为fast paxos。先介绍basic paxos流程:

        1 .选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的Server;

        2 .选举线程首先向所有Server发起一次询问(包括自己);

        3 .选举线程收到回复后,验证是否是自己发起的询问(验证zxid是否一致),然后获取对方的id(myid),并存储到当前询问对象列表中,最后获取对方提议的leader相关信息(        id,zxid),并将这些信息存储到当次选举的投票记录表中;

        4.  收到所有Server回复以后,就计算出zxid最大的那个Server,并将这个Server相关信息设置成下一次要投票的Server;

        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会记录事务日志并定期进行快照,方便在恢复时进行状态恢复。选主的具体流程图如下所示:

                                         zookeeper简介

      fast paxos流程是在选举过程中,某Server首先向所有Server提议自己要成为leader,当其它Server收到提议以后,解决epoch和 zxid的冲突,并接受对方的提议,然后向对方发送接受提议完成的消息,重复这个流程,最后一定能选举出Leader。其流程图如下所示:

                         zookeeper简介

zab协议 : 如果客户端发了一个事务请求给到leader, 而leader发送给各个follower以后,并且收到了ack,leader已经commit。 在准备ack给各个follower节点comit的时候,leader挂了,怎么处理的。

  1. 选举新的leader(zxid的最大值) zxid 处理事务的id号 最大则表示当前的数据版本是最新的
  2. 同步给其他的folower

猜你喜欢

转载自blog.csdn.net/tengxvincent/article/details/81216665