zookeeper leader选举详解

zookeeper leader选举详解

前言

zookeeper作为分布式架构中的重要角色,能够为分布式应用提供一致性服务.所以在生产中为了高可用常以集群方式存在.而zookeeper本身也是去中心架构.其内部包含三种角色leader follower observer .集群初始化或者failover都涉及到leader的选举问题.而zookeeper选举机制依赖的是fast faxos算法来处理的.这个过程比较复杂,于是单拿出来详细讲解下.

zookeeper节点状态

在选举过程中涉及到了四个状态

  • LOOKING 寻找leader时的状态.  竞选状态
  • LEADING 领导者状态 ,表示leader已经选举好了,处于该状态的节点角色已经是leader了
  • FOLLOWING  跟随着状态 表示leader已选举 .当前节点角色是follower ,同步leader状态,参与投票
  • OBSERVER  观察者状态. 表明该节点是obseerver 同步leader状态,不参与投票

选举相关信息概念

  • 事务ID (zxid)

zxid又叫zookeeper的事务id ,zk每次状态变化都会接受一个zxid形式的标记.zxid是一个64位的数字,全局唯一.不断递增.zxid展示了所有zk集群的变更顺序.每次变更会有一个唯一的zxid.如果zxid1小于zxid2证明zxid1在zxid2之前发生.也就是说zxid值越大代表状态越新.

  • myid

myid是zk集群每个节点的唯一标识符,也是递增的.我们在部署zk集群时候是自己创建出来的.

  • electionEpoch(逻辑始终)

用来判断多个投票是否再同一轮选举周期中。该值是一个自增序列。每次进入新轮投票都给在对该值+1 , 数字大的优先级大。

  • peerEpoch  

被推举的leader的epoch


zk集群选举流程

zk选举流程整体分为两部分

1.初次选举leader

2.集群运行期间选举leader

无论哪种他的原则都保持: 先比较zxid, zxid大的为leader.如果zxid相同则比较myid  myid大的为leader.

一.初次选举leader

在集群化初始阶段,先启动zk-1.此时无法选举. 当zk-2启动时,此时两台机器可以互相通信.每个机器都在试图找leader.于是开始选举过程.过程如下

1.每个server发出一个投票

每个节点发出一个投票.由于是初始阶段.zk-1和zk-2都会把票投给自己.投票的信息大致是myid和zxid 我们可以用(myid zxid) 来表示,此时zk-1是(1,0)zk-2是(2,0)然后把投票结果发给其他节点。

2.接受各个节点的投票

集群的每个服务器收到投票后,首先判断投票的有效性,比如是否是本轮投票,是否来自looking状态的服务器。

3.处理投票

针对每一个节点的投票信息,会和自己的投票进行pk。pk规则如下

  • 逻辑时钟

逻辑时钟大的为leader,相同逻辑时钟看zxid

  • zxid大的为leader,zxid相同看myid
  • myid大的为leader 

完成过程如下:

需要注意zk集群总节点数不同,超过半数以上的有效投票数就不同。

1.zk集群是三个节点(只要达到两个节点投票就可以选出leader)

  • Server1的启动,给自己投票(1,0),然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,Server1上的状态一直属于展望。
  • 服务器2启动,给自己投票(2,0),同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票数正好大于半数,所以服务器2成为领导者,服务器1成为小弟。
  • 服务器3启动,给自己投票(3,0),同时与之前启动的服务器1,服务器换信息,尽管服务器3的编号大,但之前服务器2已经胜出,所以服务器3只能成为小弟。
  • 当确定了领导之后,每个服务器更新自己的状态,负责人将状态更新为龙头,跟随将状态更新为继。

2.zk集群是五个节点(需要达到三个节点投票才可以选出leader)

  • 服务器1启动,此时只有它一台服务器启动了,它发出去的报没有任何响应,所以它的选举状态一直是LOOKING状态
  • 服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以id值较大的服务器2胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),所以服务器1,2还是继续保持LOOKING状态.
  • 服务器3启动,根据前面的理论分析,服务器3成为服务器1,2,3中的老大,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的leader.
  • 服务器4启动,根据前面的分析,理论上服务器4应该是服务器1,2,3,4中最大的,但是由于前面已经有半数以上的服务器选举了服务器3,所以它只能接收当小弟的命了。
  • 服务器5启动,同4一样,当小弟.

二.服务器运行期间选举leader(三节点情况)

当leader选举完成后,leader处于健康状态,那么新节点加入就不在执行之前的pk规则了,而是直接作为follower加入集群,然就同步状态,此时leader和follower各司其职。但是一旦leader服务器(三节点情况,此时zk–2作为Leader)挂了,那么整个集群暂停对外服务,各个节点处于looking状态开始选举新的leader。

  • 变更状态

leader挂后,余下的follower都会将自己服务器状态设置为Looking(observer除外),开始进行leader选举。

  • 每个节点发出投票

因为集群已经运行了一段时间,此时zxid各个节点可能不同。假定zk-1 的zxid是123,zk-3的zxid是122.那么第一轮投票都投给自己zk-1是(1,123)

zk-3是(3,122)。然后把投票结果发给其他所有机器。

  • 接受其他服务器投票,并处理投票

按照pk规则,此时zk-1的zxid更大,所以zk-1为leader .然后zk-3同步状态修改为follower。

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Loading...