1. 查看节点
1.1 get
- 最简单的命令,和key value 键值对命令很像,就是用
get
命令。如果存在就返回值及状态。如果不存在,那就表示节点不存在。get /hadoop
1.2 stat
- 与上面的命令类似,但只是用来查询状态,不查询数据。
stat /hadoop
1.3 znode状态解释
1.4 查看节点列表
- 即查看节点的所有子节点
ls /
可以查看当前根路径的所有子节点
- 查看某个节点的所有子节点
ls /node
- 查看某个节点的所有子节点,顺便看节点的状态
ls2 /node
2. 新增节点
2.1 create
create [-s] [-e] path data #其中-s 为有序节点,-e 临时节点
2.1.1 创建持久化节点并写入数据
create /hadoop "123456"
2.1.2 创建持久化有序节点
- 此时创建的节点名为指定节点名 + 自增序号
create -s /a "aaa"
Created /a0000000000
- 因此,查的时候,需要查
/a0000000000
2.1.3 创建临时节点
- 会在会话过期或关闭之后,删除节点
create -e /tmp "tmp"
2.1.4 创建临时有序节点
create -s -e /aa 'aaa'
Created /aa0000000004
同样的,查该节点的时候需要查/aa0000000004
2.1.5 创建子节点
- 其实操作与上面一样,不过还是演示一下以防万一。假设目前已经存在一个节点
/hadoop
,创建该节点的子节点create /hadoop/child "child"
3. 更新节点
3.1 set
- 只能更新,不能创建不存在的节点。更新之后,节点版本号
dataVersion
会自增1,修改事务号、修改时间等都会发生变化set /hadoop "345"
- 也可以添加一个版本号,实现乐观锁的效果(如果目前的版本号不符合输入的版本号,说明在此之前已经被修改过了,因此不能保存)
set /hadoop "3456" 1
表示如果目前版本号为1,则可以修改
4. 删除节点
4.1 delete
delete path [version]
- 同样的,如果传入的版本号不符合,则没办法删除
- 还有就是,只能删除没有子节点的节点,如果该节点底下还有子节点,则删除失败。
4.2 rmr
- 递归删除该节点及其子节点
rmr path
5. 监听器
- 顾名思义,就是监听某个节点,如果节点的状态发生了变化,就提醒客户端,该节点发生了状态变化
- 值得一提的是,该监听器都是一次性的,如果触发了一次之后,就不再工作了,如果还需要继续监听,那就需要再创建一个。
5.1 get path watch
- 在查询节点的同时,顺便添加一个监听器。
- 如果对该节点的内容进行修改、删除该节点,就会触发监听器。但给它添加、修改子节点并不会触发
get /node watch
5.2 stat path watch
- 感觉和上述没什么差别
5.3 ls path watch / ls2 path watch
- 当给该节点增加、删除子节点,就会触发监听器
6. 权限控制
6.1 概述
- 就像文件系统一样,不同的目录、文件,可以给不同的用户不同的权限。
- zookeeper可以对节点的增删查改、修改权限(cdrwa)设置权限。
- alc权限控制,使用
scheme:id:permission
来表示- 权限模式(scheme):权限的策略
- 权限对象(id):权限的对象
- 权限(permission):授予的权限
- 特性:
- 权限控制是基于每个znode节点的,需要给每个节点设置权限
- 每个znode可以有多个权限控制方案和权限
- 子节点不会继承父节点的权限,客户端没办法访问某个节点,但有可能访问它的子节点。
6.2 权限模式
- 有很多不同的模式,其实相当于认证方式
- world是默认的方式,就是所有人,不做身份验证
- ip:就是根据客户端的ip地址进行认证
- auth:就是根据目前的客户端添加的用户进行验证。只有在客户端添加了相同的用户和密码,才能获取授权。
- digest:与上方类似,不过这个设置用户名、密码的方式更加简单,直接在设置权限的时候设置即可,无需提前添加用户。
6.3 授权的对象
- 授权对象ID是指,权限赋予的实体,例如:IP 地址或用户
6.4 授予的权限
- create、delete、read、writer、admin也就是 增、删、改、查、管理权限, 这5种权限简写为cdrwa。
- 值得注意的是,delete并不是自身的删除权限,而是自身子节点的删除权限。因此,如果要删除它自己,只要它的父节点没有设权限,就可以直接删。
- create也指的是,创建该节点子节点的权限。
6.5 授权相关命令
6.6 world 授权模式
- 默认就是这种模式。默认就是开放所有用户,所有权限。
setAcl <path> world:anyone:<acl>
- 如
setAcl /node1 world:anyone:cdrwa
6.7 ip 授权模式
- 通过ip来限制授权
setAcl <path> ip:<ip>:<acl>
- 远程客户端登录命令。值得一提的是,即使是服务端和客户端在同一台机器上,打开客户端时如果不使用这种方式,也无法获取ip权限。
./zkCli.sh -server ip
- 如
setAcl /node2 ip:192.168.60.129:cdrwa
6.8 auth 授权模式
- 首先,在客户端添加一个自己想用来认证的用户及密码
addauth digest itcast:123456
- 设置权限
setAcl /node3 auth:itcast:cdrwa
- 至此,设置好了权限,其他客户端想要拥有权限,也需要首先执行第一句话,添加认证用户。
6.9 digest 授权模式
- 首先,在设置权限前,先要计算一下密文,因为这个设置密码需要用密文的形式。在linux 的命令界面
echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64
<user>:<password>
位置添加自己的用户名密码 - 设置权限
setAcl <path> digest:<user>:<password>:<acl>
- 如:
setAcl /node4 digest:itheima:qlzQzCLKhBROghkooLvb+Mlwv4A=:cdrwa
- 获取授权的方法也和auth 授权模式一样,在客户端添加一个用户即可。
6.10 多种模式授权
- 可以给同一个节点添加多个授权
setAcl /node5 ip:192.168.60.129:cdra,auth:itcast:cdrwa,digest:itheima:qlzQzCLKhBROghkooLvb+Mlwv4A=:cdrwa
多个权限之间用逗号隔开
6.11 alc 超级管理员
- 当关闭了一些权限之后,实在没办法修改、修改权限之后,其实还有另一种超级管理员的方法可以拯救!
- 同样的,计算一下超级管理员的密码密文
echo -n super:admin | openssl dgst -binary -sha1 | openssl base64
目前将用户名密码设置为
super:admin
- 在
zkServer.sh
脚本中,找到启动zookeeper的位置,添加一句话"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="
等号后面就是用户名和密码密文,修改成自己的
nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "- Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "- Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="\
找到这句话之后,修改成现在这个样子。
- 如往常一样启动服务器即可。
- 而在客户端中,如果要使用超级管理员身份,也需要将超级管理员添加。
addauth digest super:admin #添加认证用户