
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);
}
}
}
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)