基于zookeeper的主备服务

为确保资源操作的顺序性,本博客介绍了如何利用Zookeeper实现主备服务。在多节点部署中,主节点负责处理操作,如资源的添加、分享等。当主节点宕机,备用节点会接管服务,确保单线程处理。解决方案包括节点启动时的Zookeeper抢注、监听disconnect事件,并通过事件发布与监听机制实现主备切换。
摘要由CSDN通过智能技术生成

摘要

为了高可用通产我们一个服务会部署多节点。但是有时我们希望对某些操作要求单线程处理,此时可以通过主备服务形式实现。正常情况下主节点服务处理,当主节点宕机后备用节点相关服务继续处理。

需求

资源中心会将资源文件相关操作分发至各个项目节点,资源的操作包括添加、分享、删除、和谐、恢复。资源中心向mq发布消息,各个项目节点通过订阅mq消息处理对应资源。各项目节点HA部署双节点。此时有可能出现其中一个节点正在处理资源的上传操作,由于涉及到文件IO,此操作比较慢,同时另一个节点接收到了删除的mq消息,执行对应的资源删除操作。为了避免这种情况,要求对消息的操作必须是顺序的。

解决方案

项目的两个节点在启动完成后抢注zookeeper同时订阅zk的节点disconnect事件,抢注成功的节点成为主节点通知执行启动操作,抢注失败的节点为从节点不做操作。当主节点宕机后,从节点会接收到disconnect消息,从而执行启动操作。

实现

  1. 服务启动后抢注zk
    @Override
    public void run(ApplicationArguments args) throws Exception {
         
        if(enable){
         
            zookeeperWatcher.connect();
            if(!zookeeperWatcher.exists()){
         
                zookeeperWatcher.create();
            }else{
         
                log.info("节点已被抢注,不再发布节点抢注成功事件!!!");
            }
        }else{
         
            log.info("不启用,默认发布抢注成功事件");
            SpringContextUtil.getApplicationContext().publishEvent(new MainStandbyRunnerEvent(true));
        }
    }
    
  2. 通过publishEvent+listener将主备启动与主备解耦
    抢注zk节点成功发布启动事件
    SpringContextUtil.getApplicationContext()
要配置ZooKeeper实现进程的主备选举,你可以按照以下步骤进行操作: 1. 安装ZooKeeper:首先,确保你已经成功安装了ZooKeeper,并在多个服务器上设置了相同的ZooKeeper配置。 2. 配置ZooKeeper:在每个服务器的ZooKeeper配置文件(通常是`zoo.cfg`)中,确保你设置了相同的`dataDir`(数据目录)和`clientPort`(客户端端口)。 3. 配置服务器标识:在每个服务器的配置文件中,使用独特的`server.id`标识符指定每个服务器的编号。例如,对于三个服务器,你可以分别将它们配置为`server.1`、`server.2`和`server.3`。 4. 配置选举算法:在每个服务器的配置文件中,将选举算法设置为`3`。这将使用ZooKeeper的默认选举算法,即基于Paxos的选举机制。 5. 配置集群连接:在每个服务器的配置文件中,使用以下格式配置集群连接:`server.id=hostname:port:port`。其中,`hostname`是服务器的主机名或IP地址,第一个`port`是服务器之间通信的端口,第二个`port`是选举通信的端口。 6. 启动ZooKeeper集群:在每个服务器上启动ZooKeeper实例,并确保它们能够相互连接和通信。 7. 监控选举状态:你可以使用ZooKeeper提供的命令行工具或API来监控选举状态。例如,你可以使用`stat`命令查看当前ZooKeeper集群的领导者和参与者信息。 通过以上步骤,你可以配置ZooKeeper实现进程的主备选举。请记住,选举是自动进行的,当主节点故障或失去连接时,备节点将会自动选举出新的主节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值