zookeeper集群的leader选举

服务器启动时期的Leader选举

在集群初始化阶段,当有一个服务器的server1启动时,其单独无法进行和完成leader选举,当第二台服务器server2启动时,此时两台机器可以相互通信,每台机器都试图找到leader, 于是进入leader选举过程

  • 每个server发出一个投票.由于初始情况,server1和server2都会将自己作为 leader服务器来进新货投票,每次投票会包含所推举的服务器的myid和zxid,使用(myid,zxid)来表示.此时server1的投票为(1,0),server2的投票为(2,0),然后各自将这个投票发送给集群中的其它机器
  • 集群中的每台服务器接收来自集群中各个服务器的投票
  • 处理投票.针对每一个投票.服务器都需要将别人的投票和自己的投票进行pk,pk规则如下
    • 优先检查zxid, zxid比较大的服务器优先作为leader
    • 如果zxid相同,那么就比较myid,myid较大的服务器作为leader服务器
      对于server1而言,它的投票是(1,0),接收server2的投票为(2,0),首先会比较两者的zxid,均为0,再比较myid,此时server2的myid最大,于是更新自己的投票为(2,0) 然后重新进行投票. 对于server2来说,其无需更新自己的投票,只要再次向集群中的所有机器发出上一次投票的信息即可.
  • 统计投票,每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接收到相同的投票信息,对于server1,server2而言,都统计出集群中已经有两台机器接受了(2,0)的投票信息,此时便认为已经选除了leader
  • 改变服务器状态, 一旦确定了leader, 每个服务器都会更新自己的状态,如果是follower 就变更为following; 如果是leader, 就变更为leading;

服务器运行时期的Leader选举

在zookeeper运行期间,leader与非leader服务器各司其职,即便当有非leader服务器宕机或新加入,此时也不会影响leader,但是一旦leader服务器挂了,那么整个集群将暂停对外服务,进入新一轮的leader选举,其过程和启动时期的leader选举过程基本一致.
假设正在运行的有server1,server2,server3三台服务器,当前leader是serve2,若某一时刻leader挂了,此时便开始leader的选举.选举过程如下

  1. 变更状态. leader挂后,余下的服务器都会将服务器的状态变更为looking,然后开始进入leader的选举过程
  2. 每个server会发出一个投票.在运行期间每个服务器的zxid可能不同,此时假定server1的zxid为122,server3的zxid是122,在第一轮的投票中server1和server3都会投自己,产生投票(1,122)(3,122) 然后各自将投票发送给集群中的所有机器;
  3. 接收来及各个服务器的投票,与启动过程相同
  4. 处理投票 与启动过程相同 此时server3将会是leader
  5. 统计投票
  6. 改变服务器状态

Observer角色及其配置

observer角色特点

  1. 不参与集群的leader选举
  2. 不参与集群中写数据时的ack反馈
  3. 为了使用observer角色,在任何想编成observer配置文件中加入如下配置:
    peerType=observer
    并在所有的配置文件中配置成observer模式的server的那行配置追加:observer
    server.3=192.168.60.130:2289:3389:observer

猜你喜欢

转载自blog.csdn.net/qq_43079376/article/details/108699825