在上一篇博客中,简单的介绍了zookeeper的原理,概念和经常使用的场景。zookeeper是分布式系统应用,大数据云计算平台中至关关键的服务,应用很是普遍,所以掌握经常使用的使用命令是有必要的。本片博客简单的介绍了zkCli的使用,因为zookeeper相似文件系统的特性,所以,zkCli的操做也相似文件系统中的经常使用操做: 增删改查、资源管理、权限控制等等。本文就是从这些方面进行介绍。node
创建会话链接
zkCli.sh -timeout 0 -r -server ip:port
1
-timeout:指定当前会话的超时时间。zookeeper依靠与客户端之间的心跳判断一个会话是否有效,timeout指服务器若是在timeout指定的时间内没有收到客户端的心跳包,就认为这个客户端失效。单位毫秒。
-r:read-only。zookeeper的只读模式指zookeeper的服务器若是和集群中半数或半数以上的服务器失去链接之后,该服务器就不在处理客户端的请求了,但有时候任然但愿这种故障发生时,机器能够向外提供读服务,这种状况下就可使用只读模式。
-server: 表示想要链接的服务器地址和端口。服务器
zkClient经常使用命令
使用以下命令进入client交互界面分布式
zkCli.sh -timeout 5000 -r -server master:2181
1
进入界面后开始使用zkClient,按h zkClient的使用帮助:大数据
[zk: slave2:2181(CONNECTED) 26] h
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
quit
getAcl path
close
connect host:port
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
可知,zkClient经常使用的操做和文件系统大体相同,主要包括查看、新增、修改、删除、配额、权限控制等,下面咱们分别从这几个方面进行说明。ui
查
zkClient的查询值得是查询节点的数据和节点的状态。主要有使用stat列出节点的状态;使用get得到节点的数据;使用ls列出节点的子节点列表;使用ls2同时列出子节点的列表和节点的状态;云计算
stat
获取节点的状态,使用方法:stat path.net
[zk: slave2:2181(CONNECTED) 3] stat /zookeeper
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
1
2
3
4
5
6
7
8
9
10
11
12
13
在zookeeper中,每一次对数据节点的写操做(如建立一个节点)被认为是一次事务,对于每个事务系统都会分配一个惟一的id来标识这个事务,cZxid就表示事务id,表示该节点是在哪一个事务中建立的;
ctime:表示节点建立的时间;
mZxid:最后一次更新时的事务id;
mtime:最后一次更新时的时间;
pZxid: 表示该节点的子节点列表最后一次被修改的事务的id(为当前节点添加子节点,从当前节点的子节点中删除一个或多个子节点都会引发节点的子节点的列表的改变,而修改节点的数据内容则不在此列);
cversion = -1,dataVersion = 0,aclVersion = 0在第一篇博客中已经有过介绍,分别表示子节点列表的版本,数据内容的版本,acl版本;
ephemeralOwner:用于临时节点,表示建立该临时节点的事务id,若是当前节点是永久节点,这个值是固定的,为0;
datalength表示当前节点存放的数据的长度;
numChildren表示当前节点拥有的子节点的个数;日志
ls
获取节点的子节点列表,使用方法:ls pathserver
[zk: slave2:2181(CONNECTED) 24] ls /
[node2, zookeeper, node1]
1
2
3
get
获取节点的数据,其结果是当前节点的值和stat该路径的值放在一块儿。使用方法:get pathblog
[zk: slave2:2181(CONNECTED) 25] get /node1
4545
cZxid = 0x300000012
ctime = Sat Apr 08 09:15:54 CST 2017
mZxid = 0x300000015
mtime = Sat Apr 08 09:20:07 CST 2017
pZxid = 0x300000016
cversion = 1
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ls2
获取节点的子节点列表以及stat该路径:ls2 path
[zk: slave2:2181(CONNECTED) 30] ls2 /node1
[dfd]
cZxid = 0x300000012
ctime = Sat Apr 08 09:15:54 CST 2017
mZxid = 0x300000015
mtime = Sat Apr 08 09:20:07 CST 2017
pZxid = 0x300000016
cversion = 1
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
增
zkClient的增长只有一个命令,那就是建立新的节点。使用方法:
create [-s] [-e] path data acl
-s表示建立顺序节点
-e表示建立临时节点
acl表示建立的节点路径
data表示建立的节点的数据内容
建立一个普通的节点
[zk: slave2:2181(CONNECTED) 35] create /node1 1222
Created /node1
[zk: slave2:2181(CONNECTED) 36] ls2 /node1
[]
cZxid = 0x30000001a
ctime = Sat Apr 08 09:32:53 CST 2017
mZxid = 0x30000001a
mtime = Sat Apr 08 09:32:53 CST 2017
pZxid = 0x30000001a
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
建立一个临时节点
[zk: slave2:2181(CONNECTED) 1] create -e /node 122
[zk: slave2:2181(CONNECTED) 3] ls2 /
[node, zookeeper]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x300000020
cversion = 14
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
退出当前会话,再次运行ls命令查看,结果以下:
[zk: slave2:2181(CONNECTED) 0] ls2 /
[zookeeper]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x300000021
cversion = 15
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
[zk: slave2:2181(CO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
发现建立的临时节点node消失了,正如上一篇博客中所提到的那样,zookeeper的临时节点在客户端失联后会自动被删除。
建立一个顺序节点
[zk: slave2:2181(CONNECTED) 1] create -s /node1 123
Created /node10000000008
1
2
3
发现建立的顺序节点的名称和咱们起的名字不太同样,后面加了字串,再次运行上述命令:
[zk: slave2:2181(CONNECTED) 2] create -s /node1 123
Created /node10000000009
[zk: slave2:2181(CONNECTED) 6] ls /
[node10000000008, zookeeper, node10000000009]
1
2
3
4
5
发现新增了一个节点,且节点的名称进行自增了。利用zk的顺序节点的性质,能够制做分布式的主键生成器。完成命名服务。
改
zkClien提供了一个修改命令:set path data [version]
修改一个普通节点的数据内容:
[zk: slave1:2181(CONNECTED) 6] get /node1
123
cZxid = 0x400000002
ctime = Sat Apr 08 17:20:33 CST 2017
mZxid = 0x400000002
mtime = Sat Apr 08 17:20:33 CST 2017
pZxid = 0x400000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
[zk: slave1:2181(CONNECTED) 7] set /node1 12344
cZxid = 0x400000002
ctime = Sat Apr 08 17:20:33 CST 2017
mZxid = 0x400000003
mtime = Sat Apr 08 17:21:07 CST 2017
pZxid = 0x400000002
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
修改数据内容的同时,注意dataversion变了,mZxid和mtime也变了增长了。无论每次修改的值是否和以前同样,其dataversion都会加1
修改的同时,加入dataversion校验:
[zk: slave1:2181(CONNECTED) 8] set /node1 12331 2
version No is not valid : /node1
[zk: slave1:2181(CONNECTED) 9] set /node1 12331 1
cZxid = 0x400000002
ctime = Sat Apr 08 17:20:33 CST 2017
mZxid = 0x400000005
mtime = Sat Apr 08 17:23:57 CST 2017
pZxid = 0x400000002
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
可知,增长了version校验以后,那么version就必须和修改以前的dataversion相同,不然抛出异常。
删
删除节点
delete path [version]
1
[zk: slave1:2181(CONNECTED) 17] stat /node1
cZxid = 0x400000002
ctime = Sat Apr 08 17:20:33 CST 2017
mZxid = 0x400000005
mtime = Sat Apr 08 17:23:57 CST 2017
pZxid = 0x400000008
cversion = 2
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: slave1:2181(CONNECTED) 18] delete /node1 1
version No is not valid : /node1
[zk: slave1:2181(CONNECTED) 19] delete /node1 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version和修改时的version意义是同样的,也是用于校验。
注意这个命令中的node必须是没有子节点的,不然抛出异常:
[zk: slave1:2181(CONNECTED) 23] ls /node1
[node11]
[zk: slave1:2181(CONNECTED) 24] delete /node1
Node not empty: /node1
1
2
3
4
5
那么如何删除含有子节点的节点呢? zookeeper提供了另一个命令:rmr path
[zk: slave1:2181(CONNECTED) 26] ls /node1
[node11]
[zk: slave1:2181(CONNECTED) 27] rmr /node1
[zk: slave1:2181(CONNECTED) 28] ls /node1
Node does not exist: /node1
1
2
3
4
5
6
配额
设置配额
zookeeper提供相似文件系统的配额功能,不一样的是zk的配额用于限制节点的数据内容和子节点的个数:setquota -n|-b val path
-n表示限制子节点的个数 val表示个数 path表示想要进行设置的那个node;下面的例子是对/test这个节点的子节点个数进行限制,最多为3个子节点
1
[zk: slave1:2181(CONNECTED) 36] setquota -n 3 /test
Comment: the parts are option -n val 3 path /test
1
2
3
那么进行了配额限制以后,再添加子节点试试
[zk: slave1:2181(CONNECTED) 41] create /test/node1 123452
Created /test/node1
[zk: slave1:2181(CONNECTED) 42] create /test/node2 123452
Created /test/node2
[zk: slave1:2181(CONNECTED) 43] create /test/node3 123452
Created /test/node3
[zk: slave1:2181(CONNECTED) 44] create /test/node4 123452
Created /test/node4
1
2
3
4
5
6
7
8
9
为何还能够继续添加呢?你们可能感到奇怪,明明设置的配额中子节点的数目为3,可是咱们在/node1建立了多于3的节点,为何不抱错?实际上配额超限了以后,zookeeper只会在日志中进行警告记录,而不会抛出异常 。日志记录以下:
2017-04-08 17:44:39,427 [myid:1] - WARN [CommitProcessor:1:DataTree@
301] - Quota exceeded: /test count=9 limit=3
1
2
上述日志表示:超出了配额的限制,咱们对节点限制了只能有3个子节点,可是如今有8个子节点
-b表示限制数据值的长度 val表示长度 path表示想要进行设置的那个node; 下面的例子是对node进行数据长度的配额限制
1
[zk: slave1:2181(CONNECTED) 15] setquota -b 4 /node2
Comment: the parts are option -b val 4 path /node2
1
2
3
修改节点的数据长度,使之超出配额,看看会发什么状况:
[zk: slave1:2181(CONNECTED) 16] set /node2 1234567
cZxid = 0x400000028
ctime = Sat Apr 08 17:52:38 CST 2017
mZxid = 0x40000002c
mtime = Sat Apr 08 17:53:20 CST 2017
pZxid = 0x400000028
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
1
2
3
4
5
6
7
8
9
10
11
12
13
同-n限额同样,并无报错,只是在日志中作了相应的记录:
2017-04-08 17:53:20,889 [myid:1] - WARN [CommitProcessor:1:DataTree@
347] - Quota exceeded: /node2 bytes=7 limit=4
1
2
上述日志表示:超出了配额的限制,咱们对节点限制了数据长度为4,可是如今数据长度为7。
查看配额
[zk: slave1:2181(CONNECTED) 25] listquota /node2
absolute path is /zookeeper/quota/node2/zookeeper_limits
Output quota for /node2 count=-1,bytes=-1
Output stat for /node2 count=1,bytes=7
1
2
3
4
5
第一行表示,对子节点数目没有限制,对数据的长度没有限制
第二行表示,子节点数目和/node2一共有1个,数据长度为7,数据长度为本身的长度加上全部的子节点的数据长度
删除配额 [zk: slave1:2181(CONNECTED) 30] delquota -n /node2 [zk: slave1:2181(CONNECTED) 31] delquota -b /node2 1 2 3 历史记录的查看和从新执行 [zk: slave1:2181(CONNECTED) 33] history 23 - delquota -b /node2 24 - setquota -n 3 /node2 25 - listquota /node2 26 - ls /node2 27 - get /node2 28 - create /node2/dfd 3434 29 - listquota /node2 30 - delquota -n /node2 31 - delquota -b /node2 32 - h 33 - history [zk: slave1:2181(CONNECTED) 34] redo 26 [dfd] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 打开新的链接和关闭 connect slave1:2181 close 1 2 最后 另外还有一个重要的客户端命令,那就是对节点的ACL进行设置,因为ACL的重要性,咱们将在下一篇进行说明和联系。