栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

zookeeper命令与API

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zookeeper命令与API

zookeeper命令与API
  • 前言
  • 命令
  • API

前言

安装zookeeper请参考Linux - zookeeper集群搭建

命令

安装启动zookeeper后连接zookeeper

连接zookeeper,进入到zookeeper内部的命令界面

zkCli.sh

查看根目录下的节点

ls /

创建持久节点,第二项为节点名称,第三项为节点内容

create /zk1 "nihao"

创建顺序持久节点,-s代表顺序,第三项为节点名称前缀,因为是顺序节点故创建节点时会在后面自动带上编号,编号为zk的节点数量包含已删除的

create -s /order "order1"

创建临时节点,-e代表临时,当退出当前的zk连接时session过期节点删除,临时节点不能创建子节点

create -e /tmp "tem1"

创建顺序临时节点,自动带编号,退出zk连接节点消失

create -e -s /tmpa "tmpa"

查看节点内容以及信息

get /zk1

"nihao"    # 创建时自定义内容
cZxid = 0x20000007f   # 创建时事务id
ctime = Thu Apr 21 17:50:56 CST 2022  # 创建节点时间
mZxid = 0x20000007f  # 修改时事务id
mtime = Thu Apr 21 17:50:56 CST 2022 # 修改节点时间
pZxid = 0x20000007f   # 节点的子节点最后被修改的事务id
cversion = 0   # 子节点的版本号更改次数
dataVersion = 0  # 数据版本号,每当数据发生变化版本递增1
aclVersion = 0   # 节点ACL的更改次数
ephemeralOwner = 0x0  # 节点为持久节点时  值为0x0 节点为临时节点时 值为当前sessionId
dataLength = 5   # 数据大小
numChildren = 0  # 子节点个数

查看节点信息

stat /zk1

监听 watch 节点 ,节点发生修改时触发监听,同时也可以监控子节点的创建

get /zk1 -w
set /zk1 "111"
ls /zk1 -w   # 监听子节点创建

修改节点内容

set /zk1 "nihao1" 

删除zk的节点,无法删除有子节点的节点

delete /zk1

创建普通节点

create /ceshi "ceshi"

创建子节点

create /ceshi/1 "ceshi1"

查看此节点下的子节点

ls /ceshi

查看子节点内容

get /ceshi/1

删除带子节点的节点

rmr /ceshi 
API

此处使用的是Java语言,导入maven依赖


    org.apache.zookeeper
    zookeeper

连接zookeeper,我这里的IP已经在hosts文件中进行修改,(zk端口默认2181可以不写,session失效时间,监控)

ZooKeeper zooKeeper = new ZooKeeper("node2,node3,node4",30000, new Watcher() {});

获取所有节点,同ls /,同时也可以获取某个节点下的所有子节点

List childrens = zooKeeper.getChildren("/", true);

创建节点
节点名称
节点内容
节点ACL权限:

  • OPEN_ACL_UNSAFE: 完全开放的ACL,不安全
  • CREATOR_ALL_ACL: ACL赋予那些授权了的用户具备权限
  • READ_ACL_UNSAFE: ACL赋予用户读的权限,也就是获取数据之类的权限

节点模式:

  • PERSISTENT: 普通持久节点
  • PERSISTENT_SEQUENTIAL: 顺序持久节点
  • EPHEMERAL: 普通临时节点
  • EPHEMERAL_SEQUENTIAL: 顺序临时节点

返回值: 节点路径

String result = zooKeeper.create("/cn02", "createNodeCn1".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

获取节点的内容

byte[] data = zooKeeper.getData("/zk01", null, null);

获取节点的信息

byte[] data = zooKeeper.getData("/zk01", null, new Stat());
String result = new String(data);
// 节点内容
LOGGER.info("result: " + result);
// 节点信息
LOGGER.info("stat: " + stat);
// 可以通过stat对象调用对象的get方法类型获取对应属性的值
LOGGER.info("stat: " + stat.getCzxid() + stat.getVersion());

修改节点内容,第三个属性为版本,需要指定准确的版本号才能修改,可以填写-1就不用写准确的版本号

zooKeeper.setData("/zk01", "update01".getBytes(), -1);

判断节点是否存在,为null不存在

Stat stat = zooKeeper.exists("/zk001", false);

删除节点

// version: >=0是需要和节点的version保存一致,但是这样比较难以实现。
// version: -1 无论该节点的version是神马,都可以删除,同修改
zooKeeper.delete("/cn02", 0);

监听,创建、修改、删除、子节点创建多次只触发一次

Stat stat = null;
try {
    stat = zooKeeper.exists("/zk1", new Watcher() {
        @Override
        public void process(WatchedEvent watchedEvent) {
            LOGGER.info("监控事件类型:{}", watchedEvent.getType());
        }
    });
} catch (Exception e) {
    LOGGER.error(e.getMessage());
}
Assert.assertNotNull(stat);
// 修改
try {
    zooKeeper.setData("/zk1","ceshi".getBytes(),-1);
} catch (Exception e) {
    LOGGER.error(e.getMessage());
}
// 删除掉
try {
    zooKeeper.delete("/zk1",-1);
} catch (Exception e) {
    LOGGER.error(e.getMessage());
}

循环监听,可解除上面的限制

zooKeeper1= new ZooKeeper("node2,node3,node4", 30000, new Watcher() {
    @Override
    public void process(WatchedEvent watchedEvent) {
        LOGGER.info("节点监控"+watchedEvent.getType());
        try {
            zooKeeper1.exists("/zk01/node1", true);
//              zooKeeper1.getChildren("/zk01/node1", true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});
zooKeeper1.exists("/zk01/node1", true);
//   zooKeeper1.getChildren("/zk01/node1", true);
Thread.sleep(Long.MAX_VALUE);

关闭zookeeper连接

zooKeeper.close();

共同学习,有问题错误还望指出。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/821896.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号