zookeeper入门
Zookeeper入门
使用docker安装zk,单机模式运行
zk3.6.1
zkCli.sh
在docker下使用zkCli.sh进入容器.
docker exec -it zk01 zkCli.sh
create、get
创建节点和获取节点数据
#创建一个持久节点/hi,数据为hello world
[zk: localhost:2181(CONNECTED) 15] create /hi "hello world"
Created /hi
#获取节点数据
[zk: localhost:2181(CONNECTED) 16] get /hi
hello world
#创建顺序节点-s,参数为-e则是临时节点,会话结束后节点被销毁
[zk: localhost:2181(CONNECTED) 34] create -s /hi/name "Jim"
Created /hi/name0000000002 #生成带序号的节点名
#这个特性,我们可以利用一下,生成在分布式环境下的主键生成器
#通过节点名获取数据
[zk: localhost:2181(CONNECTED) 37] get /hi/name0000000002
Jim
#非节点名
[zk: localhost:2181(CONNECTED) 35] get /hi/name
org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /hi/name
[zk: localhost:2181(CONNECTED) 36] get /hi/name2
org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /hi/name2
ls、stat
返回下面的节点信息
#ls只返回节点,节点数据使用get获取
[zk: localhost:2181(CONNECTED) 10] ls /
[home, zookeeper]
[zk: localhost:2181(CONNECTED) 11] ls /home
[a, b]
[zk: localhost:2181(CONNECTED) 12] ls /home/a
[]
#返回节点详细信息、等同stat
[zk: localhost:2181(CONNECTED) 17] ls -s /
[hi, home, zookeeper]
cZxid = 0x0 #事务id,下同
ctime = Thu Jan 01 00:00:00 UTC 1970 #节点创建时间
mZxid = 0x0
mtime = Thu Jan 01 00:00:00 UTC 1970 #节点最后一次修改时间
pZxid = 0x9
cversion = 1 #子节点版本
dataVersion = 0 #数据版本
aclVersion = 0 #权限版本
ephemeralOwner = 0x0 #此处代表持久节点
dataLength = 0
numChildren = 3 #子节点数量
set
#修改节点信息
[zk: localhost:2181(CONNECTED) 7] set /home/a hello
[zk: localhost:2181(CONNECTED) 8] get /home/a
hello
delete、deleteall
#delete删除节点、不能删除非空节点(母亲节点)
[zk: localhost:2181(CONNECTED) 33] delete /hi/name
#deleteall删除所有节点(递归删除)
[zk: localhost:2181(CONNECTED) 48] deleteall /home
[zk: localhost:2181(CONNECTED) 50] ls /
[hi, ok, zookeeper]
acl权限
ACL 权限控制,使用:schema🆔permission 来标识,主要涵盖 3 个方面:
- 权限模式(Schema):鉴权的策略
- 授权对象(ID)
- 权限(Permission)
其特性如下:
- ZooKeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限
- 每个znode支持设置多种权限控制方案和多个权限
- 子节点不会继承父节点的权限,客户端无权访问某节点,但可能可以访问它的子节点
1、schema:
ZooKeeper内置了一些权限控制方案,可以用以下方案为每个节点设置权限:
方案 | 描述 |
---|---|
world | 只有一个用户:anyone,代表所有人(默认) |
ip | 使用IP地址认证 |
auth | 使用已添加认证的用户认证 |
digest | 使用“用户名:密码”方式认证 |
2、id:
授权对象ID是指,权限赋予的用户或者一个实体,例如:IP 地址或者机器。授权模式 schema 与 授权对象 ID 之间关系:
3、权限permission:
权限 | ACL简写 | 描述 |
---|---|---|
CREATE | c | 可以创建子节点 |
DELETE | d | 可以删除子节点(仅下一级节点) |
READ | r | 可以读取节点数据及显示子节点列表 |
WRITE | w | 可以设置节点数据 |
ADMIN | a | 可以设置节点访问控制列表权限 |
二、权限相关命令:
命令 | 使用方式 | 描述 |
---|---|---|
getAcl | getAcl | 读取ACL权限 |
setAcl | setAcl | 设置ACL权限 |
addauth | addauth | 添加认证用户 |
[zk: localhost:2181(CONNECTED) 0] create /node2 1
Created /node2
[zk: localhost:2181(CONNECTED) 1] setAcl /node2 ip:192.168.100.1:cdrwa #设置IP:192.168.100.1 拥有所有权限
全部客户端命令
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 [-b batch size]
delquota [-n|-b] path
get [-s] [-w] path
getAcl [-s] path
getAllChildrenNumber path
getEphemerals path
history
listquota path
ls [-s] [-w] [-R] path
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]
set [-s] [-v version] path data
setAcl [-s] [-v version] [-R] path acl
setquota -n|-b val path
stat [-w] path
sync path
version
- 服务注册与订阅(共用节点)
- 分布式通知(监听znode)
- 服务命名(znode特性)
- 数据订阅、发布(watcher)
- 分布式锁(临时节点)
Java客户端工具
zkClient、curator、zookeeper
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-client -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>5.1.0</version>
</dependency>
<!--原生客户端工具,curator客户端中也包括该工具 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.1</version>
</dependency>