目录
一、概览
二、功能脚本
2.1、zkServer状态管理
2.2、zkCli客户端登录
三、数据操作命令
四、watch机制
4.1、特点
4.2、通知状态和事件类型
4.3、watch示例
一、概览
Zookeeper的命令,分为两类:
一类是状态管理命令,比如启动Zk服务器、终止Zk服务器、查看Zk服务器状态..
另一类就是操作Zk服务器中的数据,比如创建数据节点、删除数据节点、查看数据节点内容....
下面将分别介绍。
二、功能脚本
2.1、zkServer状态管理
Zookeeper的状态管理是通过运行zkServer.sh脚本来实现,在zookeeper安装目录的bin目录下。
所有的操作如下:
zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
使用方式如下:
# 启动当前的zk服务器 /usr/local/zookeeper/bin/zkServer.sh start # 重启当前的zk服务器 /usr/local/zookeeper/bin/zkServer.sh restart # 关闭当前的zk服务器 /usr/local/zookeeper/bin/zkServer.sh stop # 查看当前的zk服务器运行状态 /usr/local/zookeeper/bin/zkServer.sh status
2.2、zkCli客户端登录
当服务器端启动后,可以使用zkCli.sh(同样在zookeeper安装目录的bin目录下)实现。
使用方式:
# 格式zkCli.sh -server ip:port /usr/local/zookeeper/bin/zkCli.sh -server 192.168.1.3:2181 # 不指定-server,默认使用本机localhost:2181 /usr/local/zookeeper/bin/zkCli.sh
三、数据操作命令
登录到zookeeper服务器后,输入任意字符,回车确认后就会出现很多命令:
[zk: 127.0.0.1:2181(CONNECTED) 0] info 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
其实上面的命令列表已经很明显的展示了zookeeper中可以操作的命令,包括他的功能都比较容易理解,下面就简单说几个常用的命令
3.1、ls path
查看path节点下有哪些子节点,不会显示孙子及以下层级的节点,示例如下:
[zk: 127.0.0.1:2181(CONNECTED) 3] ls / [zookeeper]
3.2、create path data
该命令用来创建path节点,并且设置节点的值为data。需要注意的是,使用create创建path时,不能嵌套创建path,比如创建/abc/xyz,那么/abc必须是已经存在的,不能直接创建/abc/xyz。并且,使用create创建节点的时候,必须指定data,否则节点不会被创建。
[zk: 127.0.0.1:2181(CONNECTED) 4] create /abc xxxxxx Created /abc [zk: 127.0.0.1:2181(CONNECTED) 5] ls / [abc, zookeeper]
嵌套创建path时,如果上级目录不存在,则创建失败:
[zk: 127.0.0.1:2181(CONNECTED) 5] ls / [abc, zookeeper] [zk: 127.0.0.1:2181(CONNECTED) 6] create /xyz/aaa 12345 Node does not exist: /xyz/aaa [zk: 127.0.0.1:2181(CONNECTED) 7] create /xyz 123 Created /xyz [zk: 127.0.0.1:2181(CONNECTED) 8] create /xyz/aaa 12345 Created /xyz/aaa
使用create命令时,有-s和-e选项,分别表示Sequence(有序节点)、Ephemeral(临时节点),zookeeper默认的节点类型是无序、永久节点;
无序是指一个节点下创建子节点时,子节点不会重复;
永久是指并且如果不主动删除,那么节点就会一直存在;
有序是指创建节点时,会在节点名称后面加一个10位长度的数字,表示其顺序(序号),可以创建相同的节点名称(但是序号不相同);
临时是指创建的节点只在当前连接(session)有效,当连接断开后,临时节点就会被删除(可能会有几秒的延迟)。
需要注意的是,不能在临时节点下创建子节点。
# 无序、永久节点,不能重复创建 [zk: localhost:2181(CONNECTED) 1] create /abc 123 Created /abc [zk: localhost:2181(CONNECTED) 2] create /abc 456 Node already exists: /abc # 有序节点可以重复创建 [zk: localhost:2181(CONNECTED) 3] create -s /xyz 123 Created /xyz0000000001 [zk: localhost:2181(CONNECTED) 4] create -s /xyz 456 Created /xyz0000000002 [zk: localhost:2181(CONNECTED) 5] ls / [xyz0000000001, abc, xyz0000000002, zookeeper]
3.3、get path
该命令用来查看path节点上值以及节点信息,示例如下:
[zk: 127.0.0.1:2181(CONNECTED) 12] get /xyz 123 cZxid = 0x1f ctime = Sun Jun 09 15:12:07 CST 2019 mZxid = 0x1f mtime = Sun Jun 09 15:12:07 CST 2019 pZxid = 0x20 cversion = 1 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 3 numChildren = 1
3.4、set path data
该命令用来对已经存在的path的data进行设置,需要注意的是,如果path不存在,那么set操作就会失败,示例如下:
[zk: 127.0.0.1:2181(CONNECTED) 13] set /xyz 321 cZxid = 0x1f ctime = Sun Jun 09 15:12:07 CST 2019 mZxid = 0x22 mtime = Sun Jun 09 15:15:18 CST 2019 pZxid = 0x20 cversion = 1 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 3 numChildren = 1 [zk: 127.0.0.1:2181(CONNECTED) 14] set /www notExists # path不存在,操作失败 Node does not exist: /www
set命令可以有一个version可选项,表示要设置哪一个version的path:当要设置的path,对应的dataVersion为version时,才进行set操作,否则认为失败,因为version不同,表示要设置的path不匹配。
3.5、delete path
该命令用来删除叶子节点,叶子节点就是没有子节点的节点。如果删除path下面还有其他的子节点,那么删除操作就会失败。
[zk: 127.0.0.1:2181(CONNECTED) 19] ls / [xyz, abc, zookeeper] [zk: 127.0.0.1:2181(CONNECTED) 20] ls /xyz [aaa] [zk: 127.0.0.1:2181(CONNECTED) 21] ls /xyz/aaa [] [zk: 127.0.0.1:2181(CONNECTED) 22] delete /xyz # 删除的path包含子节点,删除失败 Node not empty: /xyz [zk: 127.0.0.1:2181(CONNECTED) 23] delete /xyz/aaa # 删除的节点没有子节点,删除成功
3.6、rmr path
该命令用来递归删除path,如果path下面有子节点,那么子节点都会被全部删除。
[zk: 127.0.0.1:2181(CONNECTED) 24] ls /xyz [] [zk: 127.0.0.1:2181(CONNECTED) 25] create /xyz/abc 3333 Created /xyz/abc [zk: 127.0.0.1:2181(CONNECTED) 26] rmr /xyz
3.7、stat path
用来获取path节点的相关信息,示例如下:
[zk: 127.0.0.1:2181(CONNECTED) 29] stat /abc cZxid = 0x1d ctime = Sun Jun 09 15:10:39 CST 2019 mZxid = 0x21 mtime = Sun Jun 09 15:13:30 CST 2019 pZxid = 0x1d cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 5 numChildren = 0
四、watch机制
对于zookeeper目录树上的节点来说,我们可能需要关注某个节点,当节点发生变化时,需要触发一些事件,举个例子,当/user/Jane节点被删除时,通知客户端删除用户Jane,这就是watch机制(监听)。
4.1、watch机制的特点
先注册后监听:对于节点的变化,需要先监听,当节点发生变化时,才会触发通知;
一次性触发:watch后,只会触发一次通知,如果要每次都触发,那么就需要在触发watch的事件后,重新watch;
异步通知:当事件触发后,通知时异步发给客户端的;
4.2、通知状态和事件类型
在zookeeper中,可以对数据节点进行很多操作,比如删除、修改、增加子节点...在触发watch通知的时候,应该通知客户端哪个节点进行了什么操作。
通知状态包括三类:SyncConnected、Disconnected、Expired、AuthFailed
每一个通知状态(KeeperState)下又有多种事件类型(EventType);
SyncConnected
None:客户端与服务器成功建立连接;
NodeCreated:监听的节点被创建;
NodeDeleted:监听的节点被删除;
NodeDataChanged:监听的节点数据内容被修改;
NodeChildChanged:监听的节点的子节点的节点数据内容发生改变;
Disconnected
None:客户端与服务器断开连接
Expired
None:会话超时
AuthFailed
None:鉴权失败
4.3、watch示例
只有一部分zookeeper命令支持watch操作,可以通过查看zk的命令列表,后面有[watch]的命令才支持(只有stat、ls、ls2、get这四个命令支持)。
有ls命令为例
窗口1:单纯的使用ls,不加watch选项,就没有监听
[zk: 192.168.1.3:2181(CONNECTED) 2] ls / [zookeeper]
窗口2:登录到192.168.1.4上,新增节点/abc
[zk: 192.168.1.4(CONNECTED) 0] ls / [zookeeper] [zk: 192.168.1.4(CONNECTED) 1] create /abc 123 Created /abc
新增节点/abc时,窗口1没有变化;
窗口1:使用watch选项
[zk: 192.168.1.3:2181(CONNECTED) 3] ls / [abc, zookeeper] [zk: 192.168.1.3:2181(CONNECTED) 4] ls / watch [abc, zookeeper]
窗口2:创建/xyz节点
[zk: 192.168.1.4(CONNECTED) 2] create /xyz 456 Created /xyz
观察窗口1,发现有其他信息输出,如下图
窗口2:继续创建/opq节点
[zk: 192.168.1.4(CONNECTED) 3] create /opq 789 Created /opq
观察窗口1,没有发现其他信息输出,说明watch操作只触发了一次。
如果需要再次触发通知,就必须再次进行watch操作。