• zookeeper 选举和同步


    节点状态:

    // org.apache.zookeeper.server.quorum.QuorumPeer.ServerState
    public enum ServerState {
        LOOKING, FOLLOWING, LEADING, OBSERVING;
    }

    测试环境可以用 2 个节点组成集群。2 个节点的集群中,节点需要得到 2 票,才能当选为 leader。

    假定 2 个节点的 id 分别为 1 和 2,以 FastLeaderElection 为例,描述选举过程:
    开始, 2 个节点均处于 LOOKING 状态,投票进行选举,2 个节点分别为自己投票,这样均只得 1 票,无法选举出 leader。
    开始下一轮选举,节点 1 发现节点 2 的 id 比自己大,于是给节点 2 投票,随之节点 2 成为 leader。

    投票信息
    FastLeaderElection.Notification

    选举 leader
    FastLeaderElection.lookForLeader

    比较 epoch,zxid,id。判断是否要更新当前节点的投票信息
    FastLeaderElection.totalOrderPredicate

    计票,判断选举是否结束
    FastLeaderElection.termPredicate

    选举完成后的同步

    QuorumPeer.run() 代码片段:

    case FOLLOWING:
        try {
            LOG.info("FOLLOWING");
            setFollower(makeFollower(logFactory));
            follower.followLeader();
        } catch (Exception e) {
            LOG.warn("Unexpected exception",e);
        } finally {
            follower.shutdown();
            setFollower(null);
            setPeerState(ServerState.LOOKING);
        }
        break;

    Follower.followLeader() 代码片段:

    syncWithLeader(newEpochZxid);                
    QuorumPacket qp = new QuorumPacket();
    while (self.isRunning()) {
        readPacket(qp);
        processPacket(qp);
    }

    follower 无限 while 循环。

  • 相关阅读:
    Asp.Net MVC ajax调用 .net 类库问题
    sql关键查询
    js数组
    win2003 sp2+iis 6.0上部署.net 2.0和.net 4.0网站的方法
    Linux开启服务器问题(李蕾问题)
    SWFUpload 中文乱码问题
    设置html滚动条(陶庭飞问题)
    反射(前台到后台,后台到前台)
    MySql数据类型
    将页面居中
  • 原文地址:https://www.cnblogs.com/allenwas3/p/9287996.html
Copyright © 2020-2023  润新知