当前位置:首页 » 《随便一记》 » 正文

ZooKeeper分布式协调服务(节点分类、事件监听、java集成)

14 人参与  2023年02月06日 15:53  分类 : 《随便一记》  评论

点击全文阅读


文章目录

前言安装启动相关概念操作节点事件监听 java客户端

前言

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是GoogleChubby一个开源的实现,是HadoopHbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

安装启动

安装:把zk安装包上传到/opt目录下,并切换到/opt目录下,执行以下指令

# 解压tar -zxvf zookeeper-3.7.0-bin.tar.gz# 重命名mv apache-zookeeper-3.7.0-bin/ zookeeper# 打开zookeeper根目录cd /opt/zookeeper# 创建一个数据目录,备用mkdir data# 打开zk的配置目录cd /opt/zookeeper/conf# copy配置文件,zk启动时会加载zoo.cfg文件cp zoo_sample.cfg zoo.cfg# 编辑配置文件vim zoo.cfg# 修改dataDir参数为之前创建的数据目录:/opt/zookeeper/data# 切换到bin目录cd /opt/zookeeper/bin# 启动 ./zkServer.sh start./zkServer.sh status # 查看启动状态./zkServer.sh stop # 停止./zkServer.sh restart # 重启./zkCli.sh # 查看zk客户端

如下,说明启动成功:

在这里插入图片描述

相关概念

Zookeeper提供一个多层级的节点命名空间(节点称为znode),每个节点都用一个以斜杠(/)分隔的路径表示,而且每个节点都有父节点(根节点除外),非常类似于文件系统。并且每个节点都是唯一的。

znode节点有四种类型:

PERSISTENT:永久节点。客户端与zookeeper断开连接后,该节点依旧存在EPHEMERAL:临时节点。客户端与zookeeper断开连接后,该节点被删除PERSISTENT_SEQUENTIAL:永久节点、序列化。客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号EPHEMERAL_SEQUENTIAL:临时节点、序列化。客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

操作节点

创建这四种节点:

[zk: localhost:2181(CONNECTED) 0] create /aa test  # 创建持久化节点Created /aa[zk: localhost:2181(CONNECTED) 1] create -s /bb test  # 创建持久序列化节点Created /bb0000000001[zk: localhost:2181(CONNECTED) 2] create -e /cc test  # 创建临时节点Created /cc[zk: localhost:2181(CONNECTED) 3] create -e -s /dd test  # 创建临时序列化节点Created /dd0000000003[zk: localhost:2181(CONNECTED) 4] ls /   # 查看某个节点下的子节点[aa, bb0000000001, cc, dd0000000003, zookeeper][zk: localhost:2181(CONNECTED) 5] stat /  # 查看某个节点的状态cZxid = 0x0ctime = Thu Jan 01 08:00:00 CST 1970mZxid = 0x0mtime = Thu Jan 01 08:00:00 CST 1970pZxid = 0x5cversion = 3dataVersion = 0aclVersion = 0ephemeralOwner = 0x0dataLength = 0numChildren = 5[zk: localhost:2181(CONNECTED) 6] get /aa  # 查看某个节点的内容test[zk: localhost:2181(CONNECTED) 11] delete /aa  # 删除某个节点[zk: localhost:2181(CONNECTED) 7] ls /  # 再次查看[bb0000000001, cc, dd0000000003, zookeeper]

事件监听

在读取数据时,我们可以同时对节点设置事件监听,当节点数据或结构变化时,zookeeper会通知客户端。当前zookeeper针对节点的监听有如下四种事件:

节点创建:stat -w /xx

当/xx节点创建时:NodeCreated

节点删除:stat -w /xx

当/xx节点删除时:NodeDeleted

节点数据修改:get -w /xx

当/xx节点数据发生变化时:NodeDataChanged

子节点变更:ls -w /xx

当/xx节点的子节点创建或者删除时:NodeChildChanged

java客户端

ZooKeeperjava客户端有:原生客户端、ZkClientCurator框架(类似于redisson,有很多功能性封装)。

引入依赖
<dependency>    <groupId>org.apache.zookeeper</groupId>    <artifactId>zookeeper</artifactId>    <version>3.7.0</version></dependency>
常用api及其方法
public class ZkTest {    public static void main(String[] args) throws KeeperException, InterruptedException {        // 获取zookeeper链接        CountDownLatch countDownLatch = new CountDownLatch(1);        ZooKeeper zooKeeper = null;        try {            zooKeeper = new ZooKeeper("172.16.116.100:2181", 30000, new Watcher() {                @Override                public void process(WatchedEvent event) {                    if (Event.KeeperState.SyncConnected.equals(event.getState())                             && Event.EventType.None.equals(event.getType())) {                        System.out.println("获取链接成功。。。。。。" + event);                        countDownLatch.countDown();                    }                }            });            countDownLatch.await();        } catch (Exception e) {            e.printStackTrace();        }        // 创建一个节点,1-节点路径 2-节点内容 3-节点的访问权限 4-节点类型        // OPEN_ACL_UNSAFE:任何人可以操作该节点        // CREATOR_ALL_ACL:创建者拥有所有访问权限        // READ_ACL_UNSAFE: 任何人都可以读取该节点        // zooKeeper.create("/zktest/aa", "haha~~".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);        zooKeeper.create("/test", "haha~~".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);        // zooKeeper.create("/zktest/cc", "haha~~".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);        // zooKeeper.create("/zktest/dd", "haha~~".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);        // zooKeeper.create("/zktest/dd", "haha~~".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);        // zooKeeper.create("/zktest/dd", "haha~~".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);        // 判断节点是否存在        Stat stat = zooKeeper.exists("/test", true);        if (stat != null){            System.out.println("当前节点存在!" + stat.getVersion());        } else {            System.out.println("当前节点不存在!");        }        // 判断节点是否存在,同时添加监听        zooKeeper.exists("/test", event -> {        });        // 获取一个节点的数据        byte[] data = zooKeeper.getData("/zktest/ss0000000001", false, null);        System.out.println(new String(data));        // 查询一个节点的所有子节点        List<String> children = zooKeeper.getChildren("/test", false);        System.out.println(children);        // 更新        zooKeeper.setData("/test", "wawa...".getBytes(), stat.getVersion());        // 删除一个节点        //zooKeeper.delete("/test", -1);        if (zooKeeper != null){            zooKeeper.close();        }    }}

点击全文阅读


本文链接:http://zhangshiyu.com/post/52933.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1