上篇博文,我们成功的安装和启动了zookeeper服务器,zookeeper还提供了很多方便的功能,方便我们查看服务器的状态,增加,修改,删除数据(入口是zkServer.sh和zkCli.sh)。还提供了一系列四字命令,方便我们跟服务器进行各种交互,来确认服务器当前的工作情况(这也是服务器监控告警的基础)。
zkServer.sh
zookeeper启动成功之后,我们先看一下zkServer.sh提供的主要功能:
- 查看服务器状态
[yinpeng@slave1 zookeeper-3.4.9]$ ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/yinpeng/yuliang/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: standalone
我们使用的是zookeeper的单机模式。
- 启停服务器
[yinpeng@slave1 zookeeper-3.4.9]$ ./bin/zkServer.sh help
ZooKeeper JMX enabled by default
Using config: /home/yinpeng/yuliang/zookeeper-3.4.9/bin/../conf/zoo.cfg
Usage: ./bin/zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
zkServer.sh还提供了启动,停止,重启等功能。zookeeper不仅提供了服务端命令,而且提供了客户端命令。
zkCli.sh
使用zkCli.sh可以连接zookeeper,以及在客户端操作zookeeper。
首先,连接zookeeper
代码语言:javascript复制./bin/zkCli.sh -timeout 5000 -server 192.168.0.23:2181
连接成功后,系统会输出zookeeper的相关环境以及配置信息,并在屏幕输出“ Welcome to ZooKeeper ”等信息。如下图所示:
输入 help或h 之后,屏幕会输出可用的客户端命令列表,如下图所示:
从上到下,一共就十几个命令。学的东西再多,不如多实践,下面我们逐个命令实践一遍:
- ls 查询当前节点列表(/是根节点)path:路径
[zk: 192.168.0.23:2181(CONNECTED) 7] ls /
[zookeeper]
- create 创建新的Znode节点 (-s : 顺序节点 -e :临时数据节点(重启会消失)) path:路径 data:数据 acl:权限,不指定默认为world:anyone:cdwra,可参考Zookeeper的ACL access control list
[zk: 192.168.0.23:2181(CONNECTED) 10] create /node_1 "test"
Created /node_1
顺序节点可以作为主键自增的策略
- get 查看节点数据 path:路径
[zk: 192.168.0.23:2181(CONNECTED) 11] get /node_1
test
cZxid = 0x13
ctime = Thu Feb 16 13:19:40 CST 2017
mZxid = 0x13
mtime = Thu Feb 16 13:19:40 CST 2017
pZxid = 0x13
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
test 为节点存储的数据内容 注: CZxid:表示该节点在那个事务中创建的事务id。 ctime:表示该节点的创建时间 mZxid:表示该节点更新时的事务id mtime:表示该节点的修改时间 pZxid:表示该节点的子节点列表最后一次被修改的事务id cversion:子节点版本号 dataversion:数据版本号 aclversion:权限版本号 ephemeralOwner:专门用于临时节点,表示创建该临时节点的事务id(如果当前节点是持久节点,该值固定为0) dataLength:当前节点存放数据的长度 numChildren:当前节点的子节点数目
- stat 查看数据节点的状态信息 path:路径
[zk: 192.168.0.23:2181(CONNECTED) 12] stat /node_1
cZxid = 0x13
ctime = Thu Feb 16 13:19:40 CST 2017
mZxid = 0x13
mtime = Thu Feb 16 13:19:40 CST 2017
pZxid = 0x13
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
- ls2 是ls的超级指令,不仅可以列出当前节点的子节点,还可以输出节点的状态信息,不再演示。
- set 设置数据节点的值,path:路径,data:数据,可以带版本号,可以不带版本号,
[zk: 192.168.0.23:2181(CONNECTED) 19] set /node_1 "11114"
cZxid = 0x13
ctime = Thu Feb 16 13:19:40 CST 2017
mZxid = 0x18
mtime = Thu Feb 16 13:32:59 CST 2017
pZxid = 0x17
cversion = 4
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 3
[zk: 192.168.0.23:2181(CONNECTED) 20] get /node_1
11114
cZxid = 0x13
ctime = Thu Feb 16 13:19:40 CST 2017
mZxid = 0x18
mtime = Thu Feb 16 13:32:59 CST 2017
pZxid = 0x17
cversion = 4
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 3
我在node_1下建立了三个节点,node_1_1,node_1_2以及node_1_3
- set:添加上版本号(乐观锁)
[zk: 192.168.0.23:2181(CONNECTED) 27] get /node_1/node_1_3
333
cZxid = 0x30
ctime = Fri Feb 17 10:11:45 CST 2017
mZxid = 0x33
mtime = Fri Feb 17 10:29:37 CST 2017
pZxid = 0x30
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
[zk: 192.168.0.23:2181(CONNECTED) 28] set /node_1/node_1_3 332 2
cZxid = 0x30
ctime = Fri Feb 17 10:11:45 CST 2017
mZxid = 0x34
mtime = Fri Feb 17 10:31:51 CST 2017
pZxid = 0x30
cversion = 0
dataVersion = 3
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
[zk: 192.168.0.23:2181(CONNECTED) 29] set /node_1/node_1_3 332 2
version No is not valid : /node_1/node_1_3
通过get,我们知道了node_1_3,的数据值和版本号,然后修改node_1_3的数据值和版本号,版本号一致会修改成功,版本号不一致,抛出版本号无效的异常。
- delete 删除node_1_3节点,此时它没有子节点,否则会报错,也可以携带版本
[zk: 192.168.0.23:2181(CONNECTED) 4] delete /node_1/node_1_3
[zk: 192.168.0.23:2181(CONNECTED) 5] ls2 /node_1
[node_1_1, node_1_2]
cZxid = 0x13
ctime = Thu Feb 16 13:19:40 CST 2017
mZxid = 0x18
mtime = Thu Feb 16 13:32:59 CST 2017
pZxid = 0x26
cversion = 6
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 2
此时,我们看到node_1_3节点已经被删除了。
- rmr 循环删除有子节点的父节点,例如删除node_1
[zk: 192.168.0.23:2181(CONNECTED) 6] rmr /node_1
[zk: 192.168.0.23:2181(CONNECTED) 7] ls /
[zookeeper]
使用ls验证之后,确实删除了父节点,以及子节点。
- quota(配额):增加一些节点的限制,必须在一定的范围内
- setquota :设置子节点的个数(-n:子节点个数的限制,-b:数据数据节点数据长度的限制)
[zk: 192.168.0.23:2181(CONNECTED) 33] create /node_1 1
Created /node_1
[zk: 192.168.0.23:2181(CONNECTED) 40] setquota -n 2 /node_1
Comment: the parts are option -n val 2 path /node_1
[zk: 192.168.0.23:2181(CONNECTED) 47] create /node_1/node_1_1 11
Created /node_1/node_1_1
[zk: 192.168.0.23:2181(CONNECTED) 48] create /node_1/node_1_2 12
Created /node_1/node_1_2
[zk: 192.168.0.23:2181(CONNECTED) 49] create /node_1/node_1_3 13
Created /node_1/node_1_3
上面的命令,我们重新创建了node_1节点,并给它设置节点数为2的限制,但是我们成功了创建子节点,node_1_3,并没有给我们抛出异常,它仅仅是在跟目录下的zookeeper.out的输出了一个警告。
超过个数只会报警告:
代码语言:javascript复制[yinpeng@slave1 zookeeper-3.4.9]$ tail zookeeper.out
....省略
2017-02-17 10:45:32,472 [myid:] - WARN [SyncThread:0:DataTree@301] - Quota exceeded: /node_1 count=3 limit=2
- listquota,查看数据节点配额的情况
[zk: 192.168.0.23:2181(CONNECTED) 50] listquota /node_1
absolute path is /zookeeper/quota/node_1/zookeeper_limits
Output quota for /node_1 count=2,bytes=-1
Output stat for /node_1 count=4,bytes=7
输出了两行信息,第一行是配额信息,设置的子节点数为2,数据长度为-1,表示没有限制,第二行是状态信息,此时的子节点数为4,数据长度为7(自己的数据长度加上子节点的数据长度)
- delquota,删除数据节点配额的情况
[zk: 192.168.0.23:2181(CONNECTED) 51] delquota -n /node_1
[zk: 192.168.0.23:2181(CONNECTED) 52] listquota /node_1
absolute path is /zookeeper/quota/node_1/zookeeper_limits
Output quota for /node_1 count=-1,bytes=-1
Output stat for /node_1 count=4,bytes=7
删除节点的配置之后,我们验证一下,看到此时node_1节点的子节点个数没有限制,数据长度没有限制了。
我们简单看一下其他的命令:
history 打印出最近执行的十个命令 redo cmdno 根据命令编号(可用history查询编号)重新执行以前执行过的命令 close关闭当前连接,可用connect 再次连接,不会退出客户端 quit 关闭连接并退出连接客户端 connect连接服务器
对权限的命令,我们通过一篇文章来学习,我觉得挺不错,就不再做了: 使用ZooKeeper ACL特性进行znode控制
常用四字命令
命令 | 功能描述 |
---|---|
conf | 输出相关服务配置的详细信息 |
cons | 列出所有连接到服务器的客户端的完全的连接/会话的详细信息.包括“接受/发送”的包数量,会话,id,操作延迟,最后的操作执行等等信息 |
dump | 列出未经处理的会话和临时节点. |
envi | 输出关于服务环境的详细信息 |
reqs | 列出未经处理的请求 |
ruok | 测试服务是否处于正确状态.如果确实如此,那么服务返回”imok”,否则不做任何响应 |
stat | 输出关于性能和连接的客户端的列表 |
wchs | 列出服务器watch的详细信息 |
wchc | 通过session列出服务器watch的详细信息,它的输出是一个与watch相关的会话的列表 |
wchp | 通过路径列出服务器watch的详细信息.它输出一个与session相关的路径 |
下面给出几个例子:
- conf
[yinpeng@slave1 zookeeper-3.4.9]$ echo conf | nc 192.168.0.23 2181
clientPort=2181
dataDir=/home/yinpeng/yuliang/data/version-2
dataLogDir=/home/yinpeng/yuliang/data/version-2
tickTime=2000
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
serverId=0
- cons
[yinpeng@slave1 zookeeper-3.4.9]$ echo cons | nc 192.168.0.23 2181
/192.168.0.23:38968[0](queued=0,recved=1,sent=0)
- ruok
测试服务是否处于正确状态.如果确实如此,那么服务返回” imok”,否则不做任何相应.
代码语言:javascript复制[yinpeng@slave1 zookeeper-3.4.9]$ echo ruok | nc 192.168.0.23 2181
imok
回复imok表示已经启动
- stat
[yinpeng@slave1 zookeeper-3.4.9]$ echo stat | nc 192.168.0.23 2181
Zookeeper version: 3.4.9-1757313, built on 08/23/2016 06:50 GMT
Clients:
/192.168.0.23:38972[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/0/32
Received: 5425
Sent: 5424
Connections: 1
Outstanding: 0
Zxid: 0x4a
Mode: standalone
Node count: 11
其他命令,我们不看了,大家可以尝试一下,这篇博文到此为止。
总结
zookeeper的命令还是非常的简单,跟平时使用sql,差不太多,不多说了,下篇博文我们使用java的客户端来操作一下。