zookeeper之znode节点与acl权限设置
- zookeeper
- znode节点
- 节点类型
- 节点属性
- 节点监听
- 客户端命令行
- 查看所有命令
- 命令说明
- acl权限设置
- scheme认证模型
- permission权限位
- acl相关命令
- ACL使用示例
- 客户端工具
- ZooInspector
- PrettyZoo
zookeeper
ZooKeeper是Apache软件基金会的一个软件项目,是一个分布式的,开放源码的分布式应用程序协调服务。它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。
ZooKeeper是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式 锁和分布式队列等功能
官网:http://ZooKeeper.apache.org/
快速开始:http://zookeeper.apache.org/doc/current/zookeeperStarted.html
API地址:https://zookeeper.apache.org/doc/
数据结构
ZooKeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode,每个ZNode都可以通过其路径唯一标识
zookeeper提供的名称空间非常类似于标准文件系统,key-value 的形式存储。名称key由斜线 / 分割的一系列路径元素,zookeeper名称空间中的每个节点都是由一个路径标识。
znode节点
节点类型
持久化目录节点(PERSISTENT)
:客户端与zookeeper断开连接后,该节点依旧存在
# 默认创建的就是持久节点
create /test
持久化顺序编号目录节点(PERSISTENT_SEQUENTIAL)
:客户端与zookeeper断开连接后,该节点依旧存在,Zookeeper会给该节点按照顺序编号
# 创建序号节点
create -s /test
# 返回创建的实际路径
Created /test0000000001
create -s /test
# 返回创建的实际路径2
Created /test0000000002
临时目录节点(EPHEMERAL)
:客户端与zookeeper断开连接后,该节点被删除
# 创建临时节点, 断开会话 在连接将会自动删除
create -e /temp
临时顺序编号目录节点(EPHEMERAL_SEQUENTIAL)
:客户端与zookeeper断开连接后,该节点被删除,Zookeeper会给该节点按照顺序编号
create -e -s /temp/seq
节点属性
查看节点属性:stat /znode
状态属性 | 描述 |
---|---|
cZxid | 创建节点时的事务ID,每次修改状态都会产生一个事务ID。事务ID是 ZooKeeper 中所有修改总的次序。 每次修改都有唯一的 zxid,如果 zxid1 小于 zxid2,那么 zxid1 在 zxid2 之前发生。 |
ctime | 创建节点时的时间 |
mZxid | 最后修改节点时的事务ID |
mtime | 最后修改节点时的时间 |
pZxid | 表示该节点的子节点列表最后一次修改的事务ID,添加子节点或删除子节点就会影响子节点列表,但是修改子节点的数据内容则不影响该ID(注意,只有子节点列表变更了才会变更pzxid,子节点内容变更不会影响pzxid) |
cversion | 子节点版本号,子节点每次修改版本号加1 |
dataversion | 数据版本号,数据每次修改该版本号加1 |
aclversion | 权限版本号,权限每次修改该版本号加1 |
ephemeralOwner | 创建该临时节点的会话的sessionID。如果该节点是持久节点,那么这个属性值为0 |
dataLength | 该节点的数据长度 |
numChildren | 该节点拥有子节点的数量,只统计直接子节点的数量 |
节点监听
客户添加-w
参数可实时监听节点与子节点的变化,并且实时收到通知。
命令 | 描述 |
---|---|
ls -w path | 监听子节点的变化(增,删) |
get -w path | 监听节点数据的变化 |
stat -w path | 监听节点属性的变化 |
printwatches on|off | 触发监听后,是否打印监听事件(默认on) |
客户端命令行
查看所有命令
通过zkClient进入zookeeper客户端命令行,输入help查看zookeeper客户端的指令
localhost:2181 $ help
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
getAcl path
命令说明
查看某个路径下目录列表
ls [-s] [-w] [-R] path
path:代表路径,完整路径
-s:返回状态信息
-w:监听节点变化
-R:递归查看某路径下目录列表
创建节点并赋值
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
[-s] [-e]:-s 和 -e 都是可选的,-s 代表顺序节点, -e 代表临时节点,注意其中 -s 和 -e 可以同时使用的,并且临时节点不能再创建子节点
path:指定要创建节点的路径,比如 /runoob
data:要在此节点存储的数据
acl:访问权限相关,默认是 world,相当于全世界都能访问
修改节点存储的数据
set [-s] [-v version] path data
path:节点路径。
data:需要存储的数据。
[version]:可选项,版本号(可用作乐观锁)
获取节点数据和状态信息
get [-s] [-w] path
-s:返回结果带上状态信息
-w:返回数据并对对节点进行事件监听
查看节点状态信息
stat [-w] path
path:代表路径
-w:对节点进行事件监听
删除某节点
delete [-v version] path
deleteall path [-b batch size]
如果某节点不为空,则不能用delete命令删除
查看节点状态
stat path [watch]
设置节点的值
set path data [version]
查看当前znode中所包含的内容
ls path [watch]
查看当前节点数据并能看到更新次数等数据
ls2 path [watch]
创建节点 -s含有序列 -e临时
create [-s] [-e] path data acl
获得节点的值
get path [watch]
删除节点
delete path [version]
递归删除节点
rmr path
acl权限设置
ACL全称为Access Control List(访问控制列表),用于控制资源的访问权限。ZooKeeper使用ACL来控制对其znode的防问。
基于
scheme:id:permission
的方式进行权限控制。scheme表示授权模式、id模式对应值、permission即具体的增删改权限位。
注意:在使用ACL时,权限仅对当前节点有效,不会让子节点继承。
scheme认证模型
方案 | 描述 |
---|---|
world | 开放模式,world表示全世界都可以访问(这是默认设置) |
ip | ip模式,限定客户端IP防问 |
auth | 用户密码认证模式,只有在会话中添加了认证才可以防问 |
digest | 与auth类似,区别在于auth用明文密码,而digest 用sha-1+base64加密后的密码。在实际使用中digest 更常见。 |
permission权限位
权限位 | 权限 | 描述 |
---|---|---|
c | CREATE | 可以创建子节点 |
d | DELETE | 可以删除子节点(仅下一级节点) |
r | READ | 可以读取节点数据及显示子节点列表 |
w | WRITE | 可以设置节点数据 |
a | ADMIN | 可以设置节点访问控制列表权限 |
acl相关命令
命令 | 使用方式 | 描述 |
---|---|---|
getAcl | getAcl
| 读取ACL权限 |
setAcl | setAcl
| 设置ACL权限 |
addauth | addauth | 添加认证用户 |
ACL使用示例
权限仅对当前节点有效,不会让子节点继承。如限制了IP防问A节点,但不妨碍该IP防问A的子节点
world权限
语法: setAcl <path> world:anyone:<权限位>
查看默认节点权限
# 创建一个节点
$ create -e /test
Created /test
# 查看节点权限
# 返回的默认权限表示 ,所有人拥有所有权限
$ getAcl /test
'world,'anyone
: cdrwa
修改默认权限为读写
# 设置为rw权限
setAcl /test world:anyone:rw
# 可以正常读
get /test
# 无法正常创建子节点
create -e /test/t "rw"
# 返回没有权限的异常
Authentication is not valid : /test/t
IP权限示例:
语法:setAcl <path> ip:<ip地址|地址段>:<权限位>
auth模式示例:
语法:
setAcl <path> auth:<用户名>:<密码>:<权限位>
addauth digest <用户名>:<密码>
digest 权限示例:
语法:
setAcl <path> digest :<用户名>:<密钥>:<权限位>
addauth digest <用户名>:<密码>
# 通过sha1与base64组合加密码生成密钥
echo -n <用户名>:<密码> | openssl dgst -binary -sha1 | openssl base64
# 先 sha1 加密,然后base64加密
echo -n test:123456 | openssl dgst -binary -sha1 | openssl base64
# 返回密钥
PbXQT4DQMDcaYC1X0EY0B2RZCwM=
设置digest 权限
setAcl /test digest:test:PbXQT4DQMDcaYC1X0EY0B2RZCwM=:cdrw
查看节点将显示没有权限
#查看节点
get /test
# 显示没有权限访问
Authentication is not valid : /test
给当前会话添加认证后再查看
为节点设置digest 权限后,访问前必须执行addauth,当前会话才可以防问。
# 给当前会话添加权限帐户
addauth digest test:123456
# 再次查看即可成功查看
get /test
客户端工具
ZooInspector
下载地址: https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip
解压进入ZooInspector\build目录,执行命令:
D:\Development\ZooInspector\build>java -jar zookeeper-dev-ZooInspector.jar
PrettyZoo
下载地址: https://github.com/vran-dev/PrettyZoo