经过./zkCli.sh 打开zk的客户端进入命令行后台node
[zk: localhost:2181(CONNECTED) 5] ls2 / [cluster, controller_epoch, brokers, zookeeper, admin, isr_change_notification, consumers, log_dir_event_notification, latest_producer_id_block, config] cZxid = 0x0 ctime = Thu Jan 01 08:00:00 CST 1970 mZxid = 0x0 mtime = Thu Jan 01 08:00:00 CST 1970 pZxid = 0x4e cversion = 14 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 10
[zk: localhost:2181(CONNECTED) 6] stat / cZxid = 0x0 ctime = Thu Jan 01 08:00:00 CST 1970 mZxid = 0x0 mtime = Thu Jan 01 08:00:00 CST 1970 pZxid = 0x4e cversion = 14 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 10
[zk: localhost:2181(CONNECTED) 8] get /zookeeper cZxid = 0x0 #该节点建立(Create)时的id ctime = Thu Jan 01 08:00:00 CST 1970 mZxid = 0x0 #该节点修改(Modify)后的id mtime = Thu Jan 01 08:00:00 CST 1970 pZxid = 0x0 #子节点列表最后一次被修改的事务id cversion = -1 #子节点的版本号 dataVersion = 0 #当前节点数据的版本号 节点数据改变时这个值会变化 aclVersion = 0 # 权限版本, 权限发生变化时版本号回发生变化 ephemeralOwner = 0x0 dataLength = 0 #数据长度 numChildren = 1 #子节点数量
客户端与服务端之间的连接存在Session(会话)shell
每一个会话能够设置一个超时时间session
心跳机制: 客户端向服务端的ping包请求并发
心跳结束, session则过时命令行
Session过时, 则临时节点znode会被抛弃code
create命令对象
[zk: localhost:2181(CONNECTED) 10] create /czk czk-data #建立永久节点 Created /czk [zk: localhost:2181(CONNECTED) 11] get /czk czk-data cZxid = 0x50 ctime = Sat Dec 29 17:17:53 CST 2018 mZxid = 0x50 mtime = Sat Dec 29 17:17:53 CST 2018 pZxid = 0x50 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 12 numChildren = 0
[zk: localhost:2181(CONNECTED) 12] create -e /czk/tmp czk-data Created /itheima/tmp [zk: localhost:2181(CONNECTED) 13] get /czk itheima-data cZxid = 0x50 ctime = Sat Dec 29 17:17:53 CST 2018 mZxid = 0x50 mtime = Sat Dec 29 17:17:53 CST 2018 pZxid = 0x51 cversion = 1 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 12 numChildren = 1
[zk: localhost:2181(CONNECTED) 1] ls /czk [] [zk: localhost:2181(CONNECTED) 2] create -s /czk/sec seq Created /itheima/sec0000000001 [zk: localhost:2181(CONNECTED) 3] create -s /czk/sec seq Created /itheima/sec0000000002 [zk: localhost:2181(CONNECTED) 4] ls /czk [sec0000000001, sec0000000002]
set命令:事件
set path data [version] # set 路径 数据 [版本号] []内为可选参数
[zk: localhost:2181(CONNECTED) 17] get /czk czk-data1 cZxid = 0x5b ctime = Sat Dec 29 17:45:26 CST 2018 mZxid = 0x66 mtime = Sat Dec 29 18:00:12 CST 2018 pZxid = 0x65 cversion = 5 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 13 numChildren = 3 [zk: localhost:2181(CONNECTED) 18] set /czk czk-data2 cZxid = 0x5b ctime = Sat Dec 29 17:45:26 CST 2018 mZxid = 0x67 mtime = Sat Dec 29 18:02:15 CST 2018 pZxid = 0x65 cversion = 5 dataVersion = 2 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 13 numChildren = 3 [zk: localhost:2181(CONNECTED) 19] get /czk czk-data2 cZxid = 0x5b ctime = Sat Dec 29 17:45:26 CST 2018 mZxid = 0x67 mtime = Sat Dec 29 18:02:15 CST 2018 pZxid = 0x65 cversion = 5 dataVersion = 2 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 13 numChildren = 3
[zk: localhost:2181(CONNECTED) 22] set /czk czk-data3 1 version No is not valid : /czk #版本不匹配 修改失败 当前版本2 [zk: localhost:2181(CONNECTED) 23] set /czk czk-data3 2 cZxid = 0x5b ctime = Sat Dec 29 17:45:26 CST 2018 mZxid = 0x69 mtime = Sat Dec 29 18:29:21 CST 2018 pZxid = 0x65 cversion = 5 dataVersion = 3 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 13 numChildren = 3 [zk: localhost:2181(CONNECTED) 24] get /czk itheima-data3 cZxid = 0x5b ctime = Sat Dec 29 17:45:26 CST 2018 mZxid = 0x69 mtime = Sat Dec 29 18:29:21 CST 2018 pZxid = 0x65 cversion = 5 dataVersion = 3 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 13 numChildren = 3
[zk: localhost:2181(CONNECTED) 25] ls /czk [sec0000000003, sec0000000001, sec0000000002] [zk: localhost:2181(CONNECTED) 27] delete /czk/sec000000000 sec0000000003 sec0000000001 sec0000000002 [zk: localhost:2181(CONNECTED) 27] delete /czk/sec0000000001 [zk: localhost:2181(CONNECTED) 28] ls /czk [sec0000000003, sec0000000002] [zk: localhost:2181(CONNECTED) 29] set /czk/sec000000000 sec0000000003 sec0000000002 [zk: localhost:2181(CONNECTED) 29] set /czk/sec0000000002 test2 cZxid = 0x64 ctime = Sat Dec 29 17:49:38 CST 2018 mZxid = 0x6b mtime = Sat Dec 29 18:54:33 CST 2018 pZxid = 0x64 cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 5 numChildren = 0 [zk: localhost:2181(CONNECTED) 30] delete /czk/sec000000000 sec0000000003 sec0000000002 [zk: localhost:2181(CONNECTED) 30] delete /czk/sec0000000002 0 version No is not valid : /czk/sec0000000002
总结 使用set / delete命令的时候尽可能使用版本号 避免误操做事务
针对每一个节点的操做, 都会有一个监督者->watcherget
当监控的某个对象(znode)发生了变化, 则触发watcher事件
zk中的watcher是一次性的, 触发后当即销毁
父节点, 子节点增删改都能触发其watcher
针对不一样类型的操做, 触发的watcher事件也不一样:
watcher命令行
建立父节点触发: NodeCreated
[zk: localhost:2181(CONNECTED) 33] stat /czk watch Node does not exist: /itcast [zk: localhost:2181(CONNECTED) 35] create /czk 123 WATCHER::Created /czk WatchedEvent state:SyncConnected type:NodeCreated path:/czk
[zk: localhost:2181(CONNECTED) 36] get /czk watch 123 cZxid = 0x6d ctime = Sat Dec 29 19:43:13 CST 2018 mZxid = 0x6d mtime = Sat Dec 29 19:43:13 CST 2018 pZxid = 0x6d cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 3 numChildren = 0 [zk: localhost:2181(CONNECTED) 37] set /itcast 789 WATCHER:: WatchedEvent state:SyncConnected type:NodeDataChanged path:/czk cZxid = 0x6d ctime = Sat Dec 29 19:43:13 CST 2018 mZxid = 0x6e mtime = Sat Dec 29 19:47:24 CST 2018 pZxid = 0x6d cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 3 numChildren = 0
[zk: localhost:2181(CONNECTED) 38] ls /czk watch [] [zk: localhost:2181(CONNECTED) 39] delete /czk WATCHER:: WatchedEvent state:SyncConnected type:NodeDeleted path:/czk
ls为父节点设置watcher, 建立子节点触发:NodeChildrenChanged
ls为父节点设置watcher, 删除子节点触发:NodeChildrenChanged
ls为父节点设置watcher, 修改子节点不触发事件
[zk: localhost:2181(CONNECTED) 49] ls /czk watch [sec0000000003, dir1, sec0000000002] [zk: localhost:2181(CONNECTED) 51] create /czk/dir2 123 WATCHER::Created /czk/dir2 WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/czk [zk: localhost:2181(CONNECTED) 52] ls /czk watch [sec0000000003, dir2, dir1, sec0000000002] [zk: localhost:2181(CONNECTED) 53] delete /czk/dir2 WATCHER:: WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/czk [zk: localhost:2181(CONNECTED) 54]