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大的所有节点 ListlargerNodes = 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); } } } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)