原文链接: https://mp.weixin.qq.com/s/1pW19QXXK3yOXq4AXiEzUA
看前面两篇关于zookeeper 1.使用docker安装zookeeper 2.通过zkCli客户端操作zookeeper的介绍,应该大概了解了一些zookeeper的基本操作了,算是基本认识,本篇咱们来认识一下zookeeper的相关知识点。
节点[Node]zookeeper的节点类似于文件的目录结构一样。像下面这样
1. /node1/node2/node3/...
2. /node1/node4/node5/...
需要以斜线开头,像上面这样的结构表明,/node1 节点有两个子节点 /node2 和 /node4,这里说的是相对路径,绝对路径则是 /node1/node2 和 /node1/node4节点类型:
持久型节点 和 **临时型节点, **还有一个是跟它们相关的是 有序节点
所以组合起来的话就有以下几种节点:
持久节点[PERSISTENT]
持久有序节点[PERSISTENT_SEQUENTIAL]
临时节点[EPHEMERAL]
临时有序节点[EPHEMERAL_SEQUENTIAL]
1. 默认创建的节点是 持久节点:
[zk: localhost:2181(CONNECTED) 5] create /zk-per 我是默认的持久节点
Created /zk-per
[zk: localhost:2181(CONNECTED) 6] get /zk-per
我是默认的持久节点 // 显示的节点包含的数据内容
cZxid = 0x38 // 创建时的事务id
ctime = Fri Oct 11 13:17:55 CST 2019 // 创建时间
mZxid = 0x38 // 最后一次更新时的事务id
mtime = Fri Oct 11 13:17:55 CST 2019 // 最后一次更新的时间
pZxid = 0x38 // 子节点最后一次更新的事务id【节点列表变更才会更新】
cversion = 0 // 版本号
dataVersion = 0 // 数据版本号
aclVersion = 0 // 权限版本号
ephemeralOwner = 0x0 // 是否临时节点
dataLength = 27 // 数据长度
numChildren = 0 // 子节点个数
可以看到是否临时节点的属性为0;持久节点不会因为会话关闭或者连接断开而消失,需要通过删除操作进行清理。
- 创建持久有序节点,需要在创建的时候加一个参数 -s 就可以了
[zk: localhost:2181(CONNECTED) 8] create -s /zk-per/s 我是有序节点
Created /zk-per/s0000000000
[zk: localhost:2181(CONNECTED) 9] get /zk-per/s
Node does not exist: /zk-per/s
[zk: localhost:2181(CONNECTED) 10] get /zk-per/s0000000000
我是有序节点
cZxid = 0x39
ctime = Fri Oct 11 13:57:23 CST 2019
mZxid = 0x39
mtime = Fri Oct 11 13:57:23 CST 2019
pZxid = 0x39
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 18
numChildren = 0
[zk: localhost:2181(CONNECTED) 11] create -s /zk-per/s 我是有序节节点
Created /zk-per/s000000000
在 /zk-per 节点下创建了两个有序节点,在节点后面会自动添加顺序号,最大值是正整数的最大值;如果中间有无序节点(也就是无参数 -s 创建的节点),再创建有序节点也会把该节点算进去。
[zk: localhost:2181(CONNECTED) 14] create /zk-per/s 正常持久节点
Created /zk-per/s
[zk: localhost:2181(CONNECTED) 18] ls /zk-per
[s0000000001, s, s0000000003, s0000000000]
- 创建临时节点也比较简单,只需要添加一个参数 -e 则该节点就是临时节点
[zk: localhost:2181(CONNECTED) 22] create -e /zk-eph 我是临时节点
Created /zk-eph
[zk: localhost:2181(CONNECTED) 23] get /zk-eph
我是临时节点
cZxid = 0x3d
ctime = Fri Oct 11 14:22:22 CST 2019
mZxid = 0x3d
mtime = Fri Oct 11 14:22:22 CST 2019
pZxid = 0x3d
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x10000007da50004 // 表明是临时节点
dataLength = 18
numChildren = 0
临时节点会因为会话失效而自动清除掉,而且临时节点不能创建子节点
[zk: localhost:2181(CONNECTED) 24] create -e /zk-eph/01 验证是否可以创建临时子节点
4. 创建临时有序节点跟创建持久有序节点一样添加一个参数 -s 就可以了。
[zk: localhost:2181(CONNECTED) 26] create /zk-per-eph 临时有序节点父节点
Created /zk-per-eph
[zk: localhost:2181(CONNECTED) 30] create -e -s /zk-per-eph/es 我是临时有序节点
Created /zk-per-eph/es0000000000
[zk: localhost:2181(CONNECTED) 31] create -e -s /zk-per-eph/es 我是临时序节点
Created /zk-per-eph/es0000000001
权限[ACL]
权限基本上都是针对节点的操作,对每个节点进行权限控制处理。
权限模式[Scheme]:授权对象[ID]:权限[Permission]这个是对一个节点进行授权的格式。
权限模式[Scheme]:
- IP
2. Digest
3. World (默认)
4. Super
授权对象[ID]:
不同的权限模式有不同的授权对象。
1.ip针对的是一个明确的ip地址或者是一个ip地址段
2.digest是一个经过加密的处理的字符串 [name:base64(sha1(name:pass))]
3.world是默认的,只有一个值 anyone
4.super与digest一样
权限[Permission]:
CREATE [c]: 可以创建子节点
DELETE [d]: 可以删除子节点
3. READ [r]: 可以读取节点内容和子节点内容
4. WRITE [w]: 可以更新节点内容
5. ADMIN [a]: 可以管理节点,对节点进行权限设置
平时常用的是Digest模式,这里以该模式做一下示例,其它三个不做示例了。
先生成 授权对象
bogon$ echo -n name:pass | openssl dgst -binary -sha1 | openssl base64
XyHn68mX14mTQCgEtE+2pqxBR7A=
所以 授权对象[ID]为
name:XyHn68mX14mTQCgEtE+2pqxBR7A=
创建一个待授权节点:
[zk: localhost:2181(CONNECTED) 1] create /zk-acldigest 我是带权限节点
Created /zk-acldigest
给该节点授权
[zk: localhost:2181(CONNECTED) 3] setAcl /zk-acldigest digest:name:XyHn68mX14mTQCgEtE+2pqxBR7A=:rcdwa
cZxid = 0x45
ctime = Fri Oct 11 15:23:09 CST 2019
mZxid = 0x45
mtime = Fri Oct 11 15:23:09 CST 2019
pZxid = 0x45
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 21
numChildren = 0
授权成功。如果没有对当前会话授权就进行读取节点会出现没有权限提示
[zk: localhost:2181(CONNECTED) 4] get /zk-acldigest
Authentication is not valid : /zk-acldigest
对当前会话进行授权后再进行读取节点操作就可以了
[zk: localhost:2181(CONNECTED) 5] addauth digest name:pass
[zk: localhost:2181(CONNECTED) 6] get /zk-acldigest
我是带权限节点
cZxid = 0x45
ctime = Fri Oct 11 15:23:09 CST 2019
mZxid = 0x45
mtime = Fri Oct 11 15:23:09 CST 2019
pZxid = 0x45
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 21
numChildren = 0
数据监听[Watcher]
数据监听分默认监听和节点自已的监听,所谓默认监听就是创建会话的话,直接设置一监听,在该会话下创建的节点可以利用该监听,节点自已的监听则是单独设置会对该节点的监听,并且每设置一次监听如果被调用了则会失效,需要重新设置。
常用的连接状态下的监听事件:
1. NodeCreated 节点创建监听
2. NodeDeleted 节点被删除监听
3. NodeDataChanged 节点数据被更新监听
4. NodeChildrenChanged 子节点列表变更监听
ZK服务状态
zookeeper内置了一些命令可以查询一些服务端的状态数据。
下表数据来源:https://www.cnblogs.com/warmingsun/p/6961323.html
|
ZooKeeper四字命令
|
功能描述
| conf | 3.3.0版本引入的。打印出服务相关配置的详细信息。 |
| cons | 3.3.0版本引入的。列出所有连接到这台服务器的客户端全部连接/会话详细信息。包括"接受/发送"的包数量、会话id、操作延迟、最后的操作执行等等信息。 |
| crst | 3.3.0版本引入的。重置所有连接的连接和会话统计信息。 |
| dump | 列出那些比较重要的会话和临时节点。这个命令只能在leader节点上有用。 |
| envi | 打印出服务环境的详细信息。 |
| reqs | 列出未经处理的请求 |
| ruok | 测试服务是否处于正确状态。如果确实如此,那么服务返回"imok",否则不做任何相应。 |
| stat | 输出关于性能和连接的客户端的列表。 |
| srst | 重置服务器的统计。 |
| srvr | 3.3.0版本引入的。列出连接服务器的详细信息 |
| wchs | 3.3.0版本引入的。列出服务器watch的详细信息。 |
| wchc | 3.3.0版本引入的。通过session列出服务器watch的详细信息,它的输出是一个与watch相关的会话的列表。 |
| wchp | 3.3.0版本引入的。通过路径列出服务器watch的详细信息。它输出一个与session相关的路径。 |
| mntr | 3.4.0版本引入的。输出可用于检测集群健康状态的变量列表 |
可以通过如下命令查看相应的信息:
bogon:liangyongtong$ echo -n stat | nc 127.0.0.1 2181
Zookeeper version: 3.5.5-390fe37ea45dee01bf87dc1c042b5e3dcce88653, built on 05/03/2019 12:07 GMT
Clients:
/172.17.0.1:53300[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/8
Received: 5744
Sent: 5743
Connections: 1
Outstanding: 0
Zxid: 0x4b
Mode: standalone
Node count: 22
有时候可能会提示该命令没有加入查看白名单,这个需要处理一下。
一种是删除原来的容器,重新启动一个新的容器,把配置参数
4lw.commands.whitelist=*
加入到启动参数里面去。
一种是进入现在的容器里面修改 zoo.cfg 文件,添加这一行配置然后重新启动容器。进去后可能会出现没有 vi 或 vim 命令可用,需要重新安装一下。
$ apt-get update
$ apt-get install vim
然后就可以使用 vim 工具了。
默认的配置文件 zoo.cfg 路径在
/conf/zoo.cfg