本文参考资源:
数据结构
ZooKeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode,每个ZNode都可以通过其路径唯一标识

Znode 节点类型
+ 持久化目录节点(PERSISTENT)
客户端与zookeeper断开连接后,该节点依旧存在
+ 持久化顺序编号目录节点(PERSISTENT_SEQUENTIAL)
客户端与zookeeper断开连接后,该节点依旧存在,Zookeeper会给该节点按照顺序编号
+ 临时目录节点(EPHEMERAL)
客户端与zookeeper断开连接后,该节点被删除
+ 临时顺序编号目录节点( EPHEMERAL_SEQUENTIAL)
客户端与zookeeper断开连接后,该节点被删除,Zookeeper会给该节点按照顺序编号
znode状态信息
znode状态信息 | 解释 |
---|---|
cZxid | create ZXID,即该数据节点被创建时的事务id |
ctime | create time,即该节点的创建时间 |
mZxid | modified ZXID,即该节点最终一次更新时的事务id |
mtime | modified time,即该节点最后一次的更新时间 |
pZxid | 该节点的子节点列表最后一次修改时的事务id,只有子节点列表变更才会更新pZxid,子节点内容变更不会更新 |
cversion | 子节点版本号,当前节点的子节点每次变化时值增加1 |
dataVersion | 数据节点内容版本号,节点创建时为0,每更新一次节点内容(不管内容有无变化)该版本号的值增加1 |
aclVersion | 节点的ACL版本号,表示该节点ACL信息变更次数 |
ephemeralOwner | 创建该临时节点的会话的sessionId;如果当前节点为持久节点,则ephemeralOwner=0 |
dataLength | 数据节点内容长度 |
numChildren | 当前节点的子节点个数 |
ACL权限
ZooKeeper提供了一套完善的ACL权限控制机制保障数据安全性。
对于身份认证,提供了以下几种方式:
身份认证方式 | 解释 |
---|---|
world | 默认方式,所有用户都可无条件访问,组合形式为:world:anyone:[permissions] |
digest | 用户名:密码认证方式,最常用,组合形式为:digest:username:BASE64(SHA1(password)):[permissions] |
ip | 对指定ip进行限制,组合形式为:ip:127.0.0.1:[permissions] |
auth | 认证登录形式,需要用户获取权限后才可访问,组合形式为 auth:userpassword:[permissions] |
对于znode权限,提供了以下5种操作权限。
权限 | 简写 | 解释 |
---|---|---|
CREATE | C | 允许授权对象在当前节点下创建子节点 |
DELETE | D | 允许授权对象在当前节点下删除子节点 |
WRITE | W | 允许授权对象在当前节点进行更新操作 |
READ | R | 允许授权对象在当前节点获取节点内容或获取子节点列表 |
ADMIN | A | 允许授权对象对当前节点进行ACL相关的设置操作 |
命令行使用
使用Zookeeper下的bin/zkCli.sh
进入命令行
bin/zkCli.sh -server host:port
相关命令有:
ZooKeeper -server host:port cmd args
addauth scheme auth
close
config [-c] [-w] [-s]
connect host:port
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
delete [-v version] path
deleteall path
delquota [-n|-b] path
get [-s] [-w] path
getAcl [-s] path
history
listquota path
ls [-s] [-w] [-R] path
ls2 path [watch]
printwatches on|off
quit
reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
redo cmdno
removewatches path [-c|-d|-a] [-l]
rmr path
set [-s] [-v version] path data
setAcl [-s] [-v version] [-R] path acl
setquota -n|-b val path
stat [-w] path
sync path
常用命令:
使用 ls 命令来查看当前znode中所包含的内容
ls [-s] [-w] [-R] path
查看当前节点数据并能看到更新次数等数据,watch可以监控节点的变化
ls2 path [watch]
创建节点,参数:-s
含有序列 -e
临时
create
获得节点的值,watch可以监控值的变化
get path [watch]
设置节点的值
set
查看节点状态
stat
删除节点(deleteall递归删除)
delete
deleteall
示例
在上次ZAB协议概述和Zookeeper集群搭建搭建的集群其中一个节点客户端:
bin/zkCli.sh -server localhost:2181
输入以下命令并执行:
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
创建节点/app1
并再次查看根节点
[zk: localhost:2181(CONNECTED) 1] create /app1
Created /app1
[zk: localhost:2181(CONNECTED) 2] ls /
[app1, zookeeper]
创建节点/app1/name
并查看状态:
[zk: localhost:2181(CONNECTED) 3] create /app1/name rhett
Created /app1/name
[zk: localhost:2181(CONNECTED) 4] stat /app1/name
cZxid = 0x10000000b
ctime = Tue Mar 17 19:13:54 CST 2020
mZxid = 0x10000000b
mtime = Tue Mar 17 19:13:54 CST 2020
pZxid = 0x10000000b
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
获取/app1/name
的值:
[zk: localhost:2181(CONNECTED) 5] get /app1/name
rhett
换一台zk节点,打开客户端,输入以下命令:
[zk: localhost:2182(CONNECTED) 0] ls /
[app1, zookeeper]
[zk: localhost:2182(CONNECTED) 1] get /app1/name
rhett
[zk: localhost:2182(CONNECTED) 2] set /app1/name another
[zk: localhost:2182(CONNECTED) 3] stat /app1/name
cZxid = 0x10000000b
ctime = Tue Mar 17 19:13:54 CST 2020
mZxid = 0x100000014
mtime = Tue Mar 17 20:12:16 CST 2020
pZxid = 0x10000000b
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
java使用zookeeper api
maven依赖:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.7</version>
</dependency>
@Test
public void test() throws IOException, KeeperException, InterruptedException {
//创建zookeeper连接
ZooKeeper zooKeeper = new ZooKeeper("localhost:2181", 2000, new Watcher() {
public void process(WatchedEvent watchedEvent) {
System.out.println("触发了" + watchedEvent.getType()+"的事件");
}
});
//创建父节点,第一个参数路径,第二个参数值,第三个参数权限,第四个参数节点类型
String path = zooKeeper.create("/app2", "app2Value".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(path);
//创建子节点
String childrenPath = zooKeeper.create("/app2/children", "childrenValue".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(childrenPath);
//获取节点中的值,第一个参数路径,第二个参数是否监听,第三个参数stat
byte[] data = zooKeeper.getData("/app2", false, null);
System.out.println(new String(data));
List<String> children = zooKeeper.getChildren("/app2", false);
for (String child : children) {
System.out.println(child);
}
//修改值,第一个参数路径,第二个参数值
//第三个参数指定版本号,即znode的dataVersion,可以保证操作的顺序性,-1可匹配任何版本。
Stat stat = zooKeeper.setData("/app2", "app2Update".getBytes(), -1);
System.out.println(stat);
//判断某个节点是否存在,第二个参数是否监听
Stat exists = zooKeeper.exists("/app2/children", false);
System.out.println(exists);
//删除节点,第二个参数版本号
zooKeeper.delete("/app2/children",-1);
Stat stillExists = zooKeeper.exists("/app2/children", false);
System.out.println(stillExists);
}
原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/zookeeper%e5%9f%ba%e6%9c%ac%e4%bd%bf%e7%94%a8/