11,zookeeper 选举机制

    xiaoxiao2023-12-27  31

    1,每个机器都有自己的编号,也就是配置文件 myid 中的那个数字。

        我们可以看看,三台机器中的 myid 分别是多少.     cd /export/servers/zookeeper-3.4.5-cdh5.14.0/dataDir     cat myid     可以看到,三台机器的编号,依次是 1,2,3

    2 ,选举规则:编号大的机器,更容易获得投票,但是,并不是说,3号机器就一定做 leader ,其它两个节点就是 follower ,不确定。

    3 ,选举:启动集群的时候,选举 leader

    假设集群的启动顺序是:1 --> 2 --> 31 号机器启动:我知道自己的编号是 1,在没有别人的情况下,我认为自己是最牛的,我要做 leader ,给自己投 1 票。2 号机器启动:我的编号是 2,此时,2 号机器也觉得自己是最牛的,我要做 leader ,我给自己投 1 票。 问题来了,1 号机器看到了 2 号机器,他们比了比 myid 的大小,发现 2 号机器的 myid=2 , 1 号 机器的 myid=1 ,2>1 ,那么,1 号机器投票给 2 号机器。选举结束,2 号胜出。 为什么选举结束,因为过半原则,我们的集群一共有三台机器,其中有两票投给了 2 号机器。3 号机器启动,但是他也只能做 follower 原因:虽然 3 号机器的 myid=3 ,是最大的,但是他来晚了,已经选举结束了。

    3 ,选举:leader 挂了,重新选举 leader

    暂停服务 :如果在集群正常运转的过程中,leader 挂掉了,那么集群将会暂停对外服务,直到新的 leader 产生,才恢复正常服务。寻找最新的数据节点 : 由于 zk 集群的数据一致都是有可能在更新着的,那么最新的数据在哪里呢? zXid :事务版本号,每次数据更新( 增,删,改 ),zXid 都会自增。 所以,zXid 数值最大的那台服务器,就是数据最新的服务器 一般情况下,zXid 都是相同的。 如果 zXid 节点的数据是相同的,就比较 myid,myid 大的机器,就成为了主节点。什么情况下,每台机器的 zXid 会不同 : 看图,可以知道,如果在做第二步的时候,恰好这个时候,leader挂了,就会出现一种什么状况,有的机器的数据更新了,有的机器没更新,那么我必须要用数据最新的那台机器作为主节点,让从节点的数据,跟主节点保持一致。

    4 ,真正的选举:双数据

    启动集群时的选举 : 1 ,每一台机器提交的是 ( cZxid,myid ) 2 ,但是,由于集群刚启动,所以,每一台机器的 cZid 统统为 0 3 ,因此,他们只需要比较 myid 就好。 4 ,所以,刚刚启动的集群,只需要根据 myid 的大小来选举 leaderleader 挂掉以后的重新选举 : 1 ,每一台机器提交的是 ( cZxid,myid ) 2 ,先比较 cZxid ,谁的 cZxid 大,谁就更厉害,赢得选票。因为谁的 cZid 大,就意味着他的数据更加的新。 3 ,如果 cZxid 一样大,就比较他们的 myid ,谁的 myid 大,谁就厉害,赢得选票。 4 ,过半原则 :     谁得到了半数以上的伙伴的支持,谁就成为了新任 leader。
    最新回复(0)