zookeeper命令与API

zookeeper命令与API

前言

命令

安装启动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依赖

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.8</version>
</dependency>

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

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

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

List<String> 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();

本专栏为大数据学习专栏,如有问题还望指出,共同学习!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

week@eight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值