【无标题】

【无标题】,第1张

【无标题】
private void electLeader() throws Exception {
    logger.info("[" + metadata + "] cluster leader: " + cluster.getLeader());
    if (cluster.getNodes().size() > 1) {
        metadata leader = cluster.getLeader();
        // 判断集群中是否有主节点或者主节点是否存活,没有则发起选举。
        if ((leader == null) || (leader.getNodeStatus() !=
            NodeStatus.ALIVE)) {
            logger.info("Starting election ...");
            epoch.getAndIncrement();
            metadata.setEpoch(epoch.get());
            // 获取集群中比自己ID大的所有节点
            List largerNodes = cluster.largerNodes(metadata);
            // 如果没有则向其他节点发送Victory消息,宣布为主节点
            if (largerNodes.isEmpty()) {
                if (metadata.getNodeStatus() != NodeStatus.ALIVE) {
                    logger.warn("Node is not alive: " + metadata);
                }else {
                    cluster.getNodes().get(metadata.getNodeId().toString()).setEpoch(epoch.get());
                    cluster.setLeader(metadata);
                    List otherNodes = cluster.otherNodes(metadata);
                    for (metadata otherNode : otherNodes) {
                        client.invokeOneway(otherNode.getNodeAddress(), VictoryMessage.getInstance().
                        request(metadata), 3*1000);
                    }
                }
            }else {
                // 向比自己ID大的所有节点发送Election消息
                for (metadata largerNode : largerNodes) {
                    RemotingMessage response = client.invokeSync(largerNode.getNodeAddress(), 
                    ElectionMessage.getInstance().
                    request(metadata), 3*1000);
                    String res = new String(response.getMessageBody(), Charset.forName("UTF-8"));
                    logger.info("Election response: " + res);
                }
            }
        }
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5701656.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存