ZK做主备决策服务器倒换实现

本文详细介绍了如何使用ZooKeeper实现主备服务器的自动切换。通过具体代码示例,展示了主服务器创建节点,备服务器监听并自动升级为主服务器的过程,确保服务高可用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主备服务器如何倒换? 

采用 ZooKeeper 来做主备决策,主备服务器都连接到 ZooKeeper 建立自己的节点,主服务器的路径规则为“/MQ/server/ 分区编号 /master”,备机为“/MQ/server/ 分区编号 /slave”,节点类型为 EPHEMERAL。

备机监听主机的节点消息,当发现主服务器节点断连后,备服务器修改自己的状态,对外提供消息读取服务。

简单实现代码如下:

maven引入zk客户端依赖

<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.11</version>
    <scope>test</scope>
</dependency>

主服务创建主服务节点信息:

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 + id + salverNode)) {
            zkClient.createEphemeral(MQ + server + id + salverNode, "192.168.0.157:8080");
        }

        zkClient.subscribeDataChanges(MQ + server + id + masterNode, new IZkDataListener() {
            @Override
            public void handleDataChange(String dataPath, Object data) throws Exception {
            }

            @Override
            public void handleDataDeleted(String dataPath) throws Exception {
                System.out.println("订阅数据发生变化" + dataPath);
                zkClient.delete(MQ + server + id + salverNode);
                zkClient.createEphemeral(MQ + server + id + masterNode,"192.168.0.157:8080");
            }
        });
    }

    public static void main(String[] args) throws Exception{
        Slave slave = new Slave();
        slave.init();
        System.in.read();
    }
}

客户端监听代码

public class Consumer {

    private static String MQ = "/MQ";
    private static String server = "/server";
    private static String id = "/1";
    private static String masterNode = "/master";

    public static void main(String[] args) throws Exception{
        ZkClient zkClient = new ZkClient("192.168.0.239:2181");
        for (int i = 0; i < 100; i++) {
            Object obj = zkClient.readData(MQ + server + id + masterNode);
            System.out.println("服务器信息:" + obj);
            TimeUnit.SECONDS.sleep(10L);
        }
    }
}

转载于:https://my.oschina.net/u/1017791/blog/2989768

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值