前言
- 安装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依赖
<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();
本专栏为大数据学习专栏,如有问题还望指出,共同学习!