命令行语法
命令基本语法 |
功能描述 |
help |
显示所有操作命令 |
ls path [watch] |
使用 ls 命令来查看当前znode中所包含的内容 |
ls -s path [watch] |
查看当前节点信息 |
create |
普通创建 -s 含有序列 -e 临时(重启或者超时消失) |
get path [watch] |
获得节点的值 |
set |
设置节点的具体值 |
stat |
查看节点状态 |
delete |
删除节点 |
rmr(已过时) |
递归删除节点 |
1)启动客户端
[atguigu@hadoop102 zookeeper-3.5.7]$ zkCli.sh -server
hadoop102:2181
2)显示所有操作命令
[zk: hadoop102:2181(CONNECTED) 1] help
znode节点信息
1)查看当前znode中所包含的内容
[zk: hadoop102:2181(CONNECTED) 0] ls /
[zookeeper]
2)查看当前节点详细数据
[zk: hadoop102:2181(CONNECTED) 5] ls -s /
[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)czxid:创建节点的事务 zxid。每次修改 ZooKeeper 状态都会产生一个 ZooKeeper 事务ID。事务 ID 是 ZooKeeper 中所 有修改总的次序。每次修改都有唯一的 zxid,如果 zxid1 小于 zxid2,那么 zxid1 在 zxid2 之前发生。
(2)ctime:znode 被创建的毫秒数(从 1970 年开始)
(3)mzxid:znode 最后更新的事务 zxid
(4)mtime:znode 最后修改的毫秒数(从 1970 年开始)
(5)pZxid:znode 最后更新的子节点 zxid
(6)cversion:znode 子节点变化号,znode 子节点修改次数
(7)dataversion:znode 数据变化号
(8)aclVersion:znode 访问控制列表的变化号
(9)ephemeralOwner:如果是临时节点,这个是 znode 拥有者的 sessionid。如果不是临时节点(即持久节点)则是 0。
(10)dataLength:znode 的数据长度
(11)numChildren:znode 子节点数量
节点类型(面试重点)
znode是zookeeper的 核心,所有的数据都存储在znode上。znode分为持久类型节点和短暂(临时)节点。它们又可以分为带序号的和不带序号的,通过序号可以推断事件的顺序。
创建持久节点和短暂节点可以通过 create 命令的参数 "-e" 决定:创建持久节点不需要带参数-e,创建短暂节点需要带参数-e。
通过 ls -s 观察节点是否是一个持久化节点,需要看ephemeralOwner存储的数据信息,如果是0则为持久节点。如下:test1试试短暂节点,故ephemeralOwner存储了一个大于0的值。
创建不带序号的永久节点
[zk: localhost:2181(CONNECTED) 3] create /test "diaochan"
Created /test
[zk: localhost:2181(CONNECTED) 4] create /test/youge "liubei"
Created /test/youge
获得节点的值
[zk: localhost:2181(CONNECTED) 5] get -s /test
diaochan
cZxid = 0x100000003
ctime = Wed Aug 29 00:03:23 CST 2018
mZxid = 0x100000003
mtime = Wed Aug 29 00:03:23 CST 2018
pZxid = 0x100000004
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 1
[zk: localhost:2181(CONNECTED) 6] get -s /test/youge
liubei
cZxid = 0x100000004
ctime = Wed Aug 29 00:04:35 CST 2018
mZxid = 0x100000004
mtime = Wed Aug 29 00:04:35 CST 2018
pZxid = 0x100000004
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
创建带序号的永久节点
(1)先创建一个普通的根节点/test/huiyin
[zk:localhost:2181(CONNECTED) 1] create /test/huiyin "caocao"
Created /test/huiyin
(2)创建带序号的节点
[zk:localhost:2181(CONNECTED) 2] create -s /test/huiyin/ui "ui"
Created /test/huiyin/ui0000000000
[zk:localhost:2181(CONNECTED) 3] create -s /test/huiyin/ui "ui"
Created /test/huiyin/ui0000000001
[zk:localhost:2181(CONNECTED) 4] create -s /test/huiyin/design " design"
Created /test/huiyin/design0000000002
如果原来没有序号节点,序号从 0 开始依次递增。如果原节点下已有 2 个节点,则再排序时从2 开始,以此类推。
创建短暂节点
(1)创建短暂的不带序号的节点
[zk: localhost:2181(CONNECTED) 7] create -e /sanguo/wuguo "zhouyu"
Created /sanguo/wuguo
(2)创建短暂的带序号的节点
[zk: localhost:2181(CONNECTED) 2] create -e -s /sanguo/wuguo "zhouyu"
Created /sanguo/wuguo0000000001
(3)在当前客户端是能查看到的
[zk: localhost:2181(CONNECTED) 3] ls /sanguo
[wuguo, wuguo0000000001, shuguo]
(4)退出当前客户端然后再重启客户端
[zk: localhost:2181(CONNECTED) 12] quit
[root@node1 zookeeper-3.5.7]$ bin/zkCli.sh
(5)再次查看根目录下短暂节点已经删除
[zk: localhost:2181(CONNECTED) 0] ls /sanguo
[shuguo]
修改节点数据值
[zk: localhost:2181(CONNECTED) 6] set /sanguo/weiguo "simayi"
监听器原理(面试重点)
客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、节点删除、子目录节点增加删除)时,ZooKeeper 会通知客户端。监听机制保证ZooKeeper 保存的任何的数据的任何改变都能快速的响应到监听了该节点的应用程序。
节点的值变化监听
(1)在node1 主机上注册监听/test节点数据变化
[zk: localhost:2181(CONNECTED) 26] get -w /test
(2)在node2主机上修改/test 节点的数据
[zk: localhost:2181(CONNECTED) 1] set /test "watch"
(3)观察node1主机收到数据变化的监听
WATCHER::
WatchedEvent state:SyncConnected
type:NodeDataChanged
path:/test
【注意】在node2再多次修改/test的值,node上不会再收到监听。因为注册一次,只能监听一次。想再次监听,需要再次注册。
节点的子节点变化监听(路径变化)
(1)在 node1主机上注册监听/uek 节点的子节点变化
[zk: localhost:2181(CONNECTED) 1] ls -w /test
(2)在node2 主机/sanguo 节点上删除子节点
[zk: localhost:2181(CONNECTED) 2] delete /test/lasting
(3)观察node1 主机收到子节点变化的监听
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged
path:/test
【注意】节点的路径变化,也是注册一次,生效一次。想多次生效,就需要多次注册。
节点删除与查看
删除节点
[zk: localhost:2181(CONNECTED) 4] delete /test/test_delete
递归删除节点
[zk: localhost:2181(CONNECTED) 15] deleteall /test
查看节点状态
[zk: localhost:2181(CONNECTED) 17] stat /test20000000006
【注意】stat 命令和 ls -s作用一样,都是查看当前节点的结构体。