03-zookeeper节点动态上下线案例

这篇具有很好参考价值的文章主要介绍了03-zookeeper节点动态上下线案例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

服务器动态上下线监听案例

需求

在分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线。

需求分析

客户端能实时洞察到服务器上下线的变化

基本流程:

​ 1.服务端启动时去注册信息(创建的都是临时节点)

​ 2.客户端获取到当前在线服务器列表,并注册监听

​ 3.当服务器节点下线

​ 4.服务器节点上下线的通知

​ 5.process()重新再去获取服务器列表,并注册监听

具体实现

环境准备

在pom.xml添加相关依赖

 <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.6.1</version>
        </dependency>
    </dependencies>

1、启动zookeeper集群,在集群上创建/servers节点

[root@kk01 ~]# xzk.sh start  	# zk集群启动脚本

# 如果没有脚本,使用下面命令去集群的每台机器收到启动zkServer也可以
zkServer.sh start

# 进入zk客户端
[root@kk01 ~]# zkCli.sh -server

# 创建servers节点
[zk: localhost:2181(CONNECTED) 3] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 4] create /servers "servers"
Created /servers

2.服务器端向zookeeper注册代码

public class DistributeServer {
    private String connectString = "kk01:2181,kk02:2181,kk01:2181";
    private int sessionTimeout = 2000;
    private ZooKeeper zk;

    public static void main(String[] args) {
        DistributeServer server = new DistributeServer();
        try {
            // 1.获取zk连接
            server.getConnect();

            // 2.注册服务器到zk集群
            server.regist(args[0]);

            // 3.业务逻辑(因为是演示,所以睡眠即可)
            server.business();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private void business() throws InterruptedException {
        // 模拟业务逻辑
        Thread.sleep(Long.MAX_VALUE);
    }

    private void regist(String hostname) throws KeeperException, InterruptedException {
        zk.create("/servers/"+hostname, hostname.getBytes(),
                // CreateMode.EPHEMERAL_SEQUENTIAL 表示创建的是临时顺序节点
                ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);

        System.out.println(hostname + " is online");
    }

    private void getConnect() throws IOException {
        zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
            @Override
            public void process(WatchedEvent event) {

            }
        });
    }
}

3.客户端获取到当前在线服务器列表,并注册监听,代码如下


public class DistributeClient {
    private String connectString = "kk01:2181,kk02:2181,kk01:2181";
    private int sessionTimeout = 2000;
    private ZooKeeper zk;

    public static void main(String[] args) {
        DistributeClient client = new DistributeClient();
        try {
            // 1.获取zk连接
            client.getConnect();

            // 2.监听 /server 下面子节点的增加和删除
            client.getServerList();
            // 3.业务逻辑(因为是演示,所以睡眠即可)
            client.business();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private void business() throws InterruptedException {
        // 模拟业务逻辑
        Thread.sleep(Long.MAX_VALUE);
    }

        private void getServerList() throws KeeperException, InterruptedException {
            List<String> children = zk.getChildren("/servers", true);

            List<String> servers = new ArrayList<>();

            for (String child : children) {
                byte[] data = zk.getData("/servers/" + child, false, null);
                servers.add(new String(data));
            }

            // 打印
            System.out.println(servers);

        }
    private void getConnect() throws IOException {
        zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                try {
                    getServerList();
                } catch (KeeperException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

测试

1、在Linux上(zk客户端)命令行增加减少服务器

1)启动 DistributeClient 客户端

即在idea上运行

2)在kk01上的zk客户端 /servers 目录下创建 临时带序号节点

[zk: localhost:2181(CONNECTED) 11] create -e -s /servers/hadoop100 "hadoop100"
Created /servers/hadoop1000000000000
[zk: localhost:2181(CONNECTED) 12] create -e -s /servers/hadoop101 "hadoop101"
Created /servers/hadoop1010000000001
[zk: localhost:2181(CONNECTED) 13] create -e -s /servers/hadoop103 "hadoop103"
Created /servers/hadoop1030000000002
[zk: localhost:2181(CONNECTED) 18] ls /servers
[hadoop1000000000000, hadoop1010000000001, hadoop1030000000002]

3)观察idea控制台变化

[]
[]
[hadoop100]
[hadoop101, hadoop100]
	[hadoop101, hadoop100, hadoop103]

4)执行删除操作,删除部分节点

[zk: localhost:2181(CONNECTED) 19] delete /servers/hadoop1030000000002
[zk: localhost:2181(CONNECTED) 20] ls /servers
[hadoop1000000000000, hadoop1010000000001]

5)再次观察idea控制台变化

[hadoop101, hadoop100]

2、在idea上操作增加减少服务器

1)启动 DistributeClient客户端(如果前面已经启动过了,则忽略此步骤)

2)启动DistributeServer服务

​ 在args[]数组传入 hadoop103

3)观察idea控制台发现打印了如下信息

hadoop103 is online

4)在zkClient查询节点信息,如下文章来源地址https://www.toymoban.com/news/detail-698280.html

[zk: localhost:2181(CONNECTED) 33] ls /servers
[hadoop1000000000000, hadoop1010000000001, hadoop1030000000003]

到了这里,关于03-zookeeper节点动态上下线案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何保证分布式系统中服务的高可用性:应对 ZooKeeper Leader 节点故障的注册处理策略

    作者:zhaokk 在现代分布式系统中,高可用性是一个至关重要的。分布式系统中的各个组件需要保证在各种异常情况下仍然能够正常工作,确保系统的稳定性和可靠性。ZooKeeper(以下简称为zk)作为一种常用的分布式协调服务,为分布式系统中的各种任务提供了基础支持

    2024年02月11日
    浏览(64)
  • (五)库存超卖案例实战——使用zookeeper分布式锁解决“超卖”问题

    本节内容使用zookeeper实现分布式锁,完成并发访问“超卖”问题的解决。相对于redis分布式锁,zookeeper能够保证足够的安全性。关于zookeeper的安装内容这里不做介绍,开始本节内容之前先自行安装好zookeeper中间键服务。这里我们利用创建zookeeper路径节点的唯一性实现分布式锁

    2024年02月06日
    浏览(44)
  • 【Zookeeper专题】Zookeeper特性与节点数据类型详解

    对于我们这些JavaCoder来说,市面上有各式各样,功能相似的中间件供我们使用。我想大家应该都清楚,要认识一个中间件,最好的方式应该是从它的创造背景开始说起。 ( PS:Zookeeper主要用来解决分布式集群中应用系统的一致性问题 ) ( PS:个人认为ZK最重要,或者说最有

    2024年02月06日
    浏览(43)
  • zookeeper第一课-Zookeeper特性与节点数据类型详解

    ZooKeeper 是一个开源的分布式协调框架,是Apache Hadoop 的一个子项目,主要用来解决分布式集群中应用系统的一致性问题。 Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。

    2024年02月13日
    浏览(47)
  • zookeeper源码(03)启动流程

    本文将从启动类开始详细分析zookeeper的启动流程: 加载配置的过程 集群启动过程 单机版启动过程 org.apache.zookeeper.server.quorum.QuorumPeerMain类。 用于启动zookeeper服务,第一个参数用来指定配置文件,配置文件properties格式,例如以下配置参数: dataDir - 数据存储目录 dataLogDir - t

    2024年02月08日
    浏览(49)
  • 03-Zookeeper客户端使用

    上一篇:02-Zookeeper实战 zookeeper 官方的客户端没有和服务端代码分离,他们为同一个jar 文件,所以我们直接引入zookeeper的maven即可, 这里版本请保持与服务端版本一致,不然会有很多兼容性的问题 为了便于测试,直接在初始化方法中创建zookeeper实例 创建Zookeeper实例的方法:

    2024年02月07日
    浏览(49)
  • Java操作Zookeeper节点

    引入jar包: zookeeper的权限: ZooKeeper提供了如下几种验证模式(scheme): • digest:Client端由用户名和密码验证,譬如user:password,digest的密码生成方式是Sha1摘要的base64形式 • auth:不使用任何id,代表任何已确认用户。 • ip:Client端由IP地址验证,譬如172.2.0.0/24 • world:固定

    2024年02月10日
    浏览(40)
  • 四、Zookeeper节点类型

    目录 1、临时节点 2、永久节点 Znode有两种,分别为 临时节点 和 永久节点 。 节点的类型在创建时即被确定,并且不能改变。 临时节点 的生命周期依赖于创建它们的会话。一旦 会话结束,临时节点将被自动删除 ,

    2024年02月19日
    浏览(31)
  • 【ZooKeeper高手实战】ZAB协议:ZooKeeper分布式一致性的基石

    🌈🌈🌈🌈🌈🌈🌈🌈 欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景 、 中间件系列笔记 和 编程高频电子书 ! 文章导读地址:点击查看文章导读!

    2024年02月03日
    浏览(45)
  • Zookeeper篇——深入认识和学习Zookeeper节点-Znode,涵盖概念以及详细操作节点命令,保姆级教程,超详细、超全面!!!

    Zookeeper是一个分布式的协调服务,它通过维护一个分层的数据结构来存储和管理数据。这个数据结构被称为znode节点。每个znode节点在Zookeeper的命名空间中都有一个唯一的路径,类似于文件系统中的路径。 Zookeeper中的znode节点有以下几种类型: 永久节点(Persistent znode):永久

    2024年02月03日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包