主備伺服器如何倒換?
主備伺服器如何倒換?
採用 ZooKeeper 來做主備決策,主備伺服器都連線到 ZooKeeper 建立自己的節點,主伺服器的路徑規則為“/MQ/server/ 分割槽編號 /master”,備機為“/MQ/server/ 分割槽編號 /slave”,節點型別為 EPHEMERAL。
備機監聽主機的節點訊息,當發現主伺服器節點斷連後,備伺服器修改自己的狀態,對外提供訊息讀取服務。
簡單實現程式碼如下:
主服務建立服務節點資訊:
public class Master {
private String MQ = "/MQ";
private String server = "/server";
private String id = "/1";
private String masterNode = "/master";
public void init() {
ZkClient zkClient = new ZkClient("192.168.0.239:2181");
if(!zkClient.exists(MQ)) {
zkClient.createPersistent(MQ);
}
if(!zkClient.exists(MQ + server)) {
zkClient.createPersistent(MQ + server);
}
if(!zkClient.exists(MQ + server + id)) {
zkClient.createPersistent(MQ + server + id);
}
if(!zkClient.exists(MQ + server + id + masterNode)) {
zkClient.createEphemeral(MQ + server + id + masterNode, "192.168.0.156:8080");
}
}
public static void main(String[] args) throws Exception{
Master master = new Master();
master.init();
System.in.read();
}
}
備伺服器監聽主伺服器狀態,主伺服器故障。切換備份伺服器為主伺服器
public class Slave {
private String MQ = "/MQ";
private String server = "/server";
private String id = "/1";
private String salverNode = "/slave";
private String masterNode = "/master";
public void init() {
ZkClient zkClient = new ZkClient("192.168.0.239:2181");
if(!zkClient.exists(MQ)) {
zkClient.createPersistent(MQ);
}
if(!zkClient.exists(MQ + server)) {
zkClient.createPersistent(MQ + server);
}
if(!zkClient.exists(MQ + server + id)) {
zkClient.createPersistent(MQ + server + id);
}
if(!zkClient.exists(MQ + server yongshiyule178.com+ id + salverNode)) {
zkClient.createEphemeral(MQ +www.tongqt178.com server + id + salverNode, "192.168.0.157:8080");
}
zkClient.subscribeDataChanges(MQ + server + id + masterNode, new IZkDataListener() {
@Override
public void handleDataChange(www.tiaotiaoylzc.com/ String dataPath, Object data) throws Exception {
}
@Override
public void handleDataDeleted(String dataPath) throws Exception {
System.out.println("訂閱資料發生變化" + dataPath);
zkClient.delete(MQ + server + id +www.yigouyule2.cn salverNode);
zkClient.createEphemeral(MQ + server + id + masterNode,"192.168.0.157:8080");
}
});
}
public static void main(String[www.mcyllpt.com ] args) throws Exception{
Slave slave = new Slave();
slave.init();
System.in.read();
}