一、启动/连接/退出/关闭/状态
1、启动 Zookeeper 服务器后台
./zkServer.sh start
2、连接客户端
./zkCli.sh
3、退出客户端
quit
4、关闭 Zookeeper 后台服务
./zkServer.sh stop
5、查看 Zookeeper 后台服务的状态
// 我这里没有做集群,所以显示的模式是 standalone ,如果是集群,显示的就是 leader
./zkServer.sh status
二、查看后台是否正常启动
1、Linux 命令查看
ps -ef | grep zookeeper | grep -v grep
2、Zookeeper 四字命令查看
// 默认端口号是 2181,如果显示没有 nc 命令,使用 yum install nc 来进行安装
echo ruok | nc Linux ip地址 zookeeper端口号
如果显示如下则代表 zookeeper 后台成功启动
三、Zookeeper 客户端常用命令
登录 zookeeper 客户端,使用 help 命令来查看 zookeepr 的客户端命令
1、ls path [watch] : 查看zookeeper节点,默认情况下只存在一个zookeeper节点
2、create [-s] [-e] path data acl: 创建节点, data 代表数据, acl 代表权限控制
-s:顺序节点,顺序是累加的,由 zookeeper 提供
-e:临时节点,服务器断开,然后重新连接服务器之后该节点会消失
// 查看根节点下面的子节点
[zk: localhost:2181(CONNECTED) 20] ls /
[zookeeper]
// 在根节点下创建临时节点 znode01
[zk: localhost:2181(CONNECTED) 21] create -e /znode01 001
Created /znode01
// 在根节点下创建临时的顺序节点 znode02(顺序是累加的)
[zk: localhost:2181(CONNECTED) 22] create -e -s /znode02 002
// 在根节点下创建永久节点 znode03
Created /znode020000000005
[zk: localhost:2181(CONNECTED) 23] create /znode03 003
Created /znode03
// 在根节点下创建永久的顺序节点
[zk: localhost:2181(CONNECTED) 24] create -s /znode04 004
Created /znode040000000007
断开 zookeeper 后台服务之后,再次连接,可以看到根节点下的临时节点 znode01、znode02 已经消失了,但是由于 znode03、znode04 是持久节点,所以还继续存在
3、get path [watch] :获取节点的值
// 获取根节点(/)下面的所有子节点
[zk: localhost:2181(CONNECTED) 3] ls /
// 根节点下有三个子节点 zookeeper(zookeeper 默认自带的节点)、znode03、znode040000000007
[znode040000000007, zookeeper, znode03]
// 获取节点 /znode03 的值
[zk: localhost:2181(CONNECTED) 4] get /znode03
// /znode03 节点的值
003
//========================下面这些是状态体(stat)========================
// 创建节点的事务 id
cZxid = 0x16
// 创建节点的时间
ctime = Wed Sep 30 19:05:02 CST 2020
// 修改节点的 id
mZxid = 0x16
// 修改的时间
mtime = Wed Sep 30 19:05:02 CST 2020
// 父节点的 id
pZxid = 0x16
// 创建的版本
cversion = 0
// 数据的版本
dataVersion = 0
// 权限的版本
aclVersion = 0
// 是否是临时节点
ephemeralOwner = 0x0
// 数据的长度
dataLength = 3
// 子节点的个数
numChildren = 0
4、stat path [watch]:获取节点的状态体
5、ls2 path [watch]
ls2 等价于 ls+stat ,ls 只会显示出该节点下的子节点,并不会显示出该节点的状态体,但是 ls2 不仅仅显示出该节点的子节点,还会显示出该节点的状态体信息.
6、set path data [version]:修改节点的值
[zk: localhost:2181(CONNECTED) 17] get /znode03
// 初始值为 003
003
cZxid = 0x16
ctime = Wed Sep 30 19:05:02 CST 2020
mZxid = 0x16
mtime = Wed Sep 30 19:05:02 CST 2020
pZxid = 0x16
cversion = 0
// 数据版本 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
// 修改 /znode03 节点数据
[zk: localhost:2181(CONNECTED) 18] set /znode03 10086
cZxid = 0x16
ctime = Wed Sep 30 19:05:02 CST 2020
mZxid = 0x1c
mtime = Wed Sep 30 22:06:02 CST 2020
pZxid = 0x16
cversion = 0
// 数据版本号变成了 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
// 获取当前版本的 /znode03 节点数据
[zk: localhost:2181(CONNECTED) 19] get /znode03
// 发现数据已经修改成了10086
10086
cZxid = 0x16
ctime = Wed Sep 30 19:05:02 CST 2020
mZxid = 0x1c
mtime = Wed Sep 30 22:06:02 CST 2020
pZxid = 0x16
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
// 根据版本号来修改值
[zk: localhost:2181(CONNECTED) 20] set /znode03 10001 1
cZxid = 0x16
ctime = Wed Sep 30 19:05:02 CST 2020
mZxid = 0x1d
mtime = Wed Sep 30 22:08:11 CST 2020
pZxid = 0x16
cversion = 0
// 修改完成后,数据版本变成了 2
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
// 获取当前版本 /znode03 节点的数据
[zk: localhost:2181(CONNECTED) 21] get /znode03
// 数据变成了 10001
10001
cZxid = 0x16
ctime = Wed Sep 30 19:05:02 CST 2020
mZxid = 0x1d
mtime = Wed Sep 30 22:08:11 CST 2020
pZxid = 0x16
cversion = 0
// 此时数据版本已经变成了 2
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
// 继续按照数据版本修改值
[zk: localhost:2181(CONNECTED) 22] set /znode03 13579 1
// 类似于乐观锁,因为当前版本已经是 2 了,如果继续按照版本为 1 来修改值,提示节点的版本无效
version No is not valid : /znode03
7、删除节点,zookeeper中有两种删除的方式
delete path [version]:类似于 Linux 中删除某一个文件
rmr path:类似于递归删除文件夹
// 显示根节点下的所有子节点
[zk: localhost:2181(CONNECTED) 24] ls /
[znode040000000007, zookeeper, znode03]
// 删除 /znode03 节点
[zk: localhost:2181(CONNECTED) 25] delete /znode03
// 删除 /znode040000000007 节点
[zk: localhost:2181(CONNECTED) 26] delete /znode040000000007
// 可以看出 znode03、znode040000000007 节点已经删除了
[zk: localhost:2181(CONNECTED) 27] ls /
[zookeeper]
// 创建 /testNode 节点
[zk: localhost:2181(CONNECTED) 31] create /testNode testNode
Created /testNode
[zk: localhost:2181(CONNECTED) 32] ls /
[zookeeper, testNode]
// 创建 /testNode/node1、/testNode/node2、/testNode/node3 节点
[zk: localhost:2181(CONNECTED) 33] create /testNode/node1 001
Created /testNode/node1
[zk: localhost:2181(CONNECTED) 34] create /testNode/node2 002
Created /testNode/node2
[zk: localhost:2181(CONNECTED) 35] create /testNode/node3 003
Created /testNode/node3
[zk: localhost:2181(CONNECTED) 36] ls /testNode
[node2, node3, node1]
// 删除父节点 /testNode
[zk: localhost:2181(CONNECTED) 37] rmr /testNode
// 父节点 /testNode 已经删除了
[zk: localhost:2181(CONNECTED) 38] ls /
四、ACL权限控制
Zookeeper 的节点有 5 种操作权限,分别是 CREATE、DELETE、READ、WRITE、ADMIN,也就是分别对应的是增、删、查、改、管理;这 5 种权限的缩写是 cdrwa (即每个单词的首字母缩写)
注:这 5 种权限种, DELETE 是对子节点的删除权限,其它 4 种权限是指对自身节点的操作权限.
身份的认证有4种方式:
world:默认方式,代表任何人都可以访问
auth:代表已经认证通过的用户( cli 中可以通过 addauth digest user:pwd 来添加当前上下文中的授权用户)
digest:即用户名:密码这种方式认证,这也是业务系统中最常用的
ip:使用 Ip 地址认证
使用[scheme:id:permissions]来表示acl权限
1、getAcl path:获取某一个节点的 Acl 权限信息
// 显示根路径下的所有子节点
[zk: localhost:2181(CONNECTED) 10] ls /
[zookeeper, testNode]
// 获取节点 /testNode 的 acl 权限
[zk: localhost:2181(CONNECTED) 11] getAcl /testNode
// 身份认证类型为 world,就是代表任何人都能访问
'world,'anyone
// 拥有的权限包括 CREATE、DELETE、READ、WRITE、ADMIN
: cdrwa
2、setAcl path:设置某一个节点的 Acl 权限
// 查看根节点下的子节点
[zk: localhost:2181(CONNECTED) 10] ls /
[zookeeper, testNode]
// 获取节点 /testNode 的 acl 权限信息
[zk: localhost:2181(CONNECTED) 11] getAcl /testNode
// 默认的权限:任何人都可以进行 cdrwa 操作
'world,'anyone
: cdrwa
[zk: localhost:2181(CONNECTED) 12] ls /
[zookeeper, testNode]
[zk: localhost:2181(CONNECTED) 13] ls /testNode
[]
// 在节点 /testNode 下创建两个子节点 node1 node2
[zk: localhost:2181(CONNECTED) 14] create /testNode/node1 001
Created /testNode/node1
[zk: localhost:2181(CONNECTED) 15] create /testNode/node2 002
Created /testNode/node2
[zk: localhost:2181(CONNECTED) 16] ls /
[zookeeper, testNode]
[zk: localhost:2181(CONNECTED) 17] ls /testNode
[node2, node1]
// 设置节点 /testNode 的 acl 权限为 crwa,没有 DELETE,也就是不能删除子节点
[zk: localhost:2181(CONNECTED) 18] setAcl /testNode world:anyone:crwa
cZxid = 0x2b
ctime = Thu Oct 01 00:23:31 CST 2020
mZxid = 0x2b
mtime = Thu Oct 01 00:23:31 CST 2020
pZxid = 0x2e
cversion = 2
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 7
numChildren = 2
// 获取节点 /testNode 的 acl 权限信息,可以看到为 crwa,没有 DELETE
[zk: localhost:2181(CONNECTED) 19] getAcl /testNode
'world,'anyone
: crwa
// 删除 /testNode 的子节点 node1 提示无效(因为 /testNode 的权限为 crwa ,没有 DELETE ,也就是不能删除子节点
[zk: localhost:2181(CONNECTED) 20] delete /testNode/node1
Authentication is not valid : /testNode/node1
// 将 /testNode 节点的权限改为 cdrw
[zk: localhost:2181(CONNECTED) 21] setAcl /testNode world:anyone:cdrw
cZxid = 0x2b
ctime = Thu Oct 01 00:23:31 CST 2020
mZxid = 0x2b
mtime = Thu Oct 01 00:23:31 CST 2020
pZxid = 0x2e
cversion = 2
dataVersion = 0
aclVersion = 2
ephemeralOwner = 0x0
dataLength = 7
numChildren = 2
[zk: localhost:2181(CONNECTED) 22] getAcl /testNode
'world,'anyone
: cdrw
// 删除 /testNode 的子节点 node1
[zk: localhost:2181(CONNECTED) 23] delete /testNode/node1
// 查看 /testNode 节点下的所有子节点,可以看到子节点 node1 已经被删除了
[zk: localhost:2181(CONNECTED) 24] ls /testNode
[node2]
五、Zookeeper 四字命令
启动了 Zookeeper 后台服务之后,可以通过 Zookeeper 的四字命令查看 Zookeeper 的相关信息
stat 查看状态信息
ruok 查看 zookeeper 是否启动
dump 列出没有处理的节点,临时节点
conf 查看服务器配置
cons 显示连接到服务端的信息
envi 显示环境变量信息
mntr 查看 zk 的健康信息
wchs 展示 watch 的信息
wchc 和 wchp 分别显示 session 的 watch 信息、 path 的 watch 信息