zookeeper常用命令行操作

通过 zkCli.sh 来打开zk客户端:

[root@study-01 ~]# zkCli.sh

[zk: localhost:2181(CONNECTED) 0]

ls 与 ls2 命令:

[zk: localhost:2181(CONNECTED) 0] ls / # ls命令用于查看节点,类似于Linux中的查看目录

[zookeeper]

[zk: localhost:2181(CONNECTED) 1] ls2 / # 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 = 0x0

cversion = -1

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 0

numChildren = 1

[zk: localhost:2181(CONNECTED) 2]

get 与 stat命令:

[zk: localhost:2181(CONNECTED) 2] stat / # stat命令用于查看节点状态的详细信息

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

[zk: localhost:2181(CONNECTED) 3] get / # get命令用于查看节点的数据以及节点状态的详细信息,由于没有数据所以这里显示的是空行

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

[zk: localhost:2181(CONNECTED) 4]

关于节点状态属性信息的描述,如下表:

属性

描述

cZxid

节点的创建时间所对应的Zxid格式时间戳

ctime

节点的创建时间

mZxid

节点最后的修改时间所对应的Zxid格式时间戳

mtime

节点最后的的修改时间

pZxid

该节点的子节点(或该节点)的最近一次 创建 / 删除 所对应的Zxid格式时间戳

cversion

节点所拥有的子节点被修改的版本号,删除或添加子节点,版本号会自增

dataVersion

当前节点数据的版本号,数据写入操作,版本号会递增

aclVersion

节点ACL权限版本,权限写入操作,版本号会递增

ephemeralOwner

临时节点创建时的事务id,如果节点是永久节点,则它的值为0

dataLength

节点数据长度(单位:byte),中文占3个byte

numChildren

子节点数量

session的基本原理与create命令的使用

zk特性-session的基本原理:

客户端与服务端之间的连接存在会话

每个会话都可以设置一个超时时间

心跳结束,session则过期

session过期,则临时节点znode会被抛弃

心跳机制:客户端向服务端的ping包请求

create命令的使用:

[zk: localhost:2181(CONNECTED) 7] create /testDir test-data # 创建一个节点,节点的数据为test-data

Created /testDir

[zk: localhost:2181(CONNECTED) 8] ls /

[zookeeper, testDir]

[zk: localhost:2181(CONNECTED) 9] get /testDir

test-data

cZxid = 0x4

ctime = Sun Apr 22 18:17:56 CST 2018

mZxid = 0x4

mtime = Sun Apr 22 18:17:56 CST 2018

pZxid = 0x4

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 9

numChildren = 0

[zk: localhost:2181(CONNECTED) 10]

这种创建方式创建出来的节点是持久化的,也就是持久节点(PERSISTENT)。所谓持久节点,是指在节点创建后,就一直存在,直到有删除操作来主动清除这个节点——不会因为创建该节点的客户端会话失效而消失。除了持久节点之外,我们还可以创建临时节点(EPHEMERAL),那么我们来看看如何创建临时节点:

[zk: localhost:2181(CONNECTED) 11] create -e /testDir/tmp tmp-data # -e指定创建的节点是临时节点

Created /testDir/tmp

[zk: localhost:2181(CONNECTED) 12] get /testDir

test-data

cZxid = 0x4

ctime = Sun Apr 22 18:17:56 CST 2018

mZxid = 0x4

mtime = Sun Apr 22 18:17:56 CST 2018

pZxid = 0x5

cversion = 1 # 由于在testDir下创建了一个子节点,所以 cversion 的值就会进行累加

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x0 # 表示持久节点

dataLength = 9

numChildren = 1

[zk: localhost:2181(CONNECTED) 16] get /testDir/tmp

tmp-data

cZxid = 0x5

ctime = Sun Apr 22 18:20:26 CST 2018

mZxid = 0x5

mtime = Sun Apr 22 18:20:26 CST 2018

pZxid = 0x5

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x10000052f5b0000 # 表示临时节点

dataLength = 8

numChildren = 0

[zk: localhost:2181(CONNECTED) 17]

和持久节点不同的是,临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。注意,这里提到的是会话失效,而非连接断开,当然连接断开也会导致会话失效,但是并不是主要原因。另外,在临时节点下面不能创建子节点。我们上面提到了,心跳结束,session就会过期,而session过期,则临时节点znode就会被抛弃。那么我们来断开与服务端的连接,看看临时节点是否会被清除:

[zk: localhost:2181(CONNECTED) 17] quit # 退出

Quitting...

2018-04-22 18:25:44,884 [myid:] - INFO [main:ZooKeeper@687] - Session: 0x10000052f5b0000 closed # session关闭了

2018-04-22 18:25:44,885 [myid:] - INFO [main-EventThread:ClientCnxn$EventThread@520] - EventThread shut down for session: 0x10000052f5b0000

[root@study-01 ~]# zkCli.sh # 重新连接服务端

[zk: localhost:2181(CONNECTED) 0] ls /testDir # 可以看到,tmp节点就消失了

[]

[zk: localhost:2181(CONNECTED) 1]

以上我们演示了持久节点和临时节点的创建,下面我们来看一下持久顺序节点(PERSISTENT_SEQUENTIAL)的创建:

[zk: localhost:2181(CONNECTED) 1] create -s /testDir/sec seq # -s指定创建持久顺序节点

Created /testDir/sec0000000001 # 会自动为给定节点名加上一个数字后缀

[zk: localhost:2181(CONNECTED) 2] ls /testDir

[sec0000000001]

[zk: localhost:2181(CONNECTED) 3] create -s /testDir/sec seq

Created /testDir/sec0000000002 # 再次创建节点数字就会递增

[zk: localhost:2181(CONNECTED) 4] ls /testDir

[sec0000000001, sec0000000002] # 这时就会有两个节点

[zk: localhost:2181(CONNECTED) 7] create -s /testDir/test seq # 创建前缀不同的节点,数字也会递增

Created /testDir/test0000000003

[zk: localhost:2181(CONNECTED) 8] ls /testDir

[test0000000003, sec0000000001, sec0000000002]

[zk: localhost:2181(CONNECTED) 9]

这类节点的基本特性和持久节点类型是一致的。额外的特性是,在ZK中,每个父节点会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。基于这个特性,在创建子节点的时候,可以设置这个属性,那么在创建节点过程中,ZK会自动为给定节点名加上一个数字后缀,作为新的节点名。这个数字后缀的范围是整型的最大值。

当 -s 与 -e 选项同时使用就是创建临时顺序节点(EPHEMERAL_SEQUENTIAL) ,此节点是属于临时节点,不过带有顺序,和临时节点一样,当session过期节点就会消失,而客户端会话连接结束也会导致session过期,所以同样的该节点也会消失,这种类型的节点一般用于实现分布式锁。以下演示一下临时顺序节点的创建方式:

[zk: localhost:2181(CONNECTED) 15] create /testTmp testTmp-data # 创建一个持久节点

Created /testTmp

[zk: localhost:2181(CONNECTED) 16] create -s -e /testTmp/secTmp secTmp-data # 在该节点下,创建临时顺序节点

Created /testTmp/secTmp0000000000

[zk: localhost:2181(CONNECTED) 17] create -s -e /testTmp/secTmp secTmp-data

Created /testTmp/secTmp0000000001

[zk: localhost:2181(CONNECTED) 18] create -s -e /testTmp/testTmp secTmp-data

Created /testTmp/testTmp0000000002

[zk: localhost:2181(CONNECTED) 19] ls /testTmp

[testTmp0000000002, secTmp0000000001, secTmp0000000000]

[zk: localhost:2181(CONNECTED) 20]

断开客户端与服务端的连接,看看临时顺序节点是否会被清除:

[zk: localhost:2181(CONNECTED) 21] quit # 退出

Quitting...

2018-04-22 19:07:13,527 [myid:] - INFO [main:ZooKeeper@687] - Session: 0x10000052f5b0001 closed

2018-04-22 19:07:13,528 [myid:] - INFO [main-EventThread:ClientCnxn$EventThread@520] - EventThread shut down for session: 0x10000052f5b0001

[root@study-01 ~]# zkCli.sh

[zk: localhost:2181(CONNECTED) 1] ls /testTmp # 可以看到,节点都被清除了

[]

[zk: localhost:2181(CONNECTED) 2]

set与delete命令的使用

使用set命令可以对某个节点进行修改:

[zk: localhost:2181(CONNECTED) 2] set /testDir new-data # 修改testDir节点的数据

cZxid = 0x4

ctime = Sun Apr 22 18:17:56 CST 2018

mZxid = 0x12

mtime = Sun Apr 22 19:24:41 CST 2018

pZxid = 0xa

cversion = 5

dataVersion = 1

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 8

numChildren = 3

[zk: localhost:2181(CONNECTED) 3] get /testDir

new-data # 可以看到数据更新了

cZxid = 0x4

ctime = Sun Apr 22 18:17:56 CST 2018

mZxid = 0x12

mtime = Sun Apr 22 19:24:41 CST 2018

pZxid = 0xa

cversion = 5

dataVersion = 1 # 此时数据版本就会递增为1

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 8

numChildren = 3

[zk: localhost:2181(CONNECTED) 4]

我们可以利用数据版本 dataVersion 来达到一个乐观锁的效果,所以每次我们修改节点数据的时候,应该加上这个 dataVersion 的值去进行修改,以免在并发的时候导致数据不一致:

[zk: localhost:2181(CONNECTED) 4] set /testDir OneVerstion-data 1 指定版本去修改数据

cZxid = 0x4

ctime = Sun Apr 22 18:17:56 CST 2018

mZxid = 0x13

mtime = Sun Apr 22 19:29:29 CST 2018

pZxid = 0xa

cversion = 5

dataVersion = 2

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 16

numChildren = 3

[zk: localhost:2181(CONNECTED) 5] set /testDir OneVerstion-data 1 # 如果此时别人再次使用版本1去修改数据,就会报错

version No is not valid : /testDir

[zk: localhost:2181(CONNECTED) 6]

使用delete命令可以对某个节点进行删除:

[zk: localhost:2181(CONNECTED) 8] ls /testDir

[test0000000003, sec0000000001, sec0000000002]

[zk: localhost:2181(CONNECTED) 9] delete /testDir/sec0000000001 # 删除节点

[zk: localhost:2181(CONNECTED) 10] ls /testDir

[test0000000003, sec0000000002]

[zk: localhost:2181(CONNECTED) 11] delete /testDir/sec0000000002 0 # 通过指定版本号来删除节点

[zk: localhost:2181(CONNECTED) 12] ls /testDir

[test0000000003]

[zk: localhost:2181(CONNECTED) 13]

watcher机制

watcher是zk中比较重要的特性,定义如下:

针对每个节点的操作,都会有一个监督者 -> watcher

当监控的某个对象(znode)发生了变化,则触发watcher事件

简单来说,watcher类似于sql中的触发器

zk中的watcher是一次性的,触发后立即销毁

父节点,子节点 的增删改都能够触发其watcher

针对不同类型的操作,触发的watcher事件也不同:

(子)节点创建事件

(子)节点删除事件

(子)节点数据变化事件

父节点watcher事件

watcher命令行学习:

通过get path [watcher] 可以设置watcher,其他的诸如stat、ls、ls2命令也可以设置watcher

父节点 增 删 改 操作触发watcher

子节点 增 删 改 操作触发watcher

watcher事件类型-父节点:

创建父节点触发 NodeCreated 事件

修改父节点数据触发 NodeDataChanged 事件

删除父节点触发 NodeDeleted 事件

创建父节点触发 NodeCreated 事件,示例:

[zk: localhost:2181(CONNECTED) 19] stat /testWatch watch # 在节点创建之前,我们可以通过 stat 命令去设置watcher

Node does not exist: /testWatch

[zk: localhost:2181(CONNECTED) 20] create /testWatch test-data # 创建父节点

WATCHER::

WatchedEvent state:SyncConnected type:NodeCreated path:/testWatch # 触发 NodeCreated 事件

Created /testWatch

[zk: localhost:2181(CONNECTED) 21]

修改父节点数据触发 NodeDataChanged 事件,示例:

[zk: localhost:2181(CONNECTED) 21] get /testWatch watch # 因为zk事件是一次性的,所以我们还需要通过 get 命令设置 watcher

test-data

cZxid = 0x19

ctime = Sun Apr 22 23:37:08 CST 2018

mZxid = 0x19

mtime = Sun Apr 22 23:37:08 CST 2018

pZxid = 0x19

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 9

numChildren = 0

[zk: localhost:2181(CONNECTED) 22] set /testWatch new-data # 修改父节点数据

WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/testWatch # 触发 NodeDataChanged 事件

cZxid = 0x19

ctime = Sun Apr 22 23:37:08 CST 2018

mZxid = 0x1a

mtime = Sun Apr 22 23:40:32 CST 2018

pZxid = 0x19

cversion = 0

dataVersion = 1

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 8

numChildren = 0

[zk: localhost:2181(CONNECTED) 23]

删除父节点触发 NodeDeleted 事件,示例:

[zk: localhost:2181(CONNECTED) 23] ls /testWatch watch # 通过 ls 命令来设置 watcher

[]

[zk: localhost:2181(CONNECTED) 24] delete /testWatch # 删除父节点

WATCHER::

WatchedEvent state:SyncConnected type:NodeDeleted path:/testWatch # 触发 NodeDeleted 事件

[zk: localhost:2181(CONNECTED) 25]

子节点watcher事件

watcher事件类型-子节点:

使用 ls 命令为父节点设置watcher,创建子节点时就会触发 NodeChildrenChanged 事件

使用 ls 命令为父节点设置watcher,删除子节点时也会触发 NodeChildrenChanged 事件

使用 ls 命令为父节点设置watcher,修改子节点数据时不会触发任何事件

使用 get 命令为子节点设置watcher,修改子节点数据时会触发 NodeDataChanged 事件

使用 ls 命令为父节点设置watcher,创建子节点时就会触发 NodeChildrenChanged 事件,示例:

[zk: localhost:2181(CONNECTED) 29] create /testWatch test-data # 创建父节点

Created /testWatch

[zk: localhost:2181(CONNECTED) 30] ls /testWatch watch # 使用 ls 命令为父节点设置watcher

[]

[zk: localhost:2181(CONNECTED) 31] create /testWatch/testChildren children-data # 创建子节点

WATCHER::

WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/testWatch # 触发 NodeChildrenChanged 事件

Created /testWatch/testChildren

[zk: localhost:2181(CONNECTED) 32]

使用 ls 命令为父节点设置watcher,删除子节点时也会触发 NodeChildrenChanged 事件,示例:

[zk: localhost:2181(CONNECTED) 32] ls /testWatch watch # 使用 ls 命令为父节点设置watcher

[testChildren]

[zk: localhost:2181(CONNECTED) 33] delete /testWatch/testChildren # 删除子节点

WATCHER::

WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/testWatch # 触发 NodeChildrenChanged 事件

[zk: localhost:2181(CONNECTED) 34]

简单说明一下为什么创建和删除子节点都是触发 NodeChildrenChanged 事件,这是因为子节点都是挂在父节点之下,而我们是给父节点设置的 watcher,不是给子节点设置 watcher ,不管子节点是删除还是创建,都是一个改变的过程,所以都是触发同一个事件。

使用 ls 命令为父节点设置watcher,修改子节点数据时不会触发任何事件,示例:

[zk: localhost:2181(CONNECTED) 35] create /testWatch/testChildren children-data # 创建子节点

[zk: localhost:2181(CONNECTED) 36] ls /testWatch watch # 使用 ls 命令为父节点设置watcher

[testChildren]

[zk: localhost:2181(CONNECTED) 37] set /testWatch/testChildren new-children-data # 修改子节点数据时不会触发任何事件

cZxid = 0x1f

ctime = Sun Apr 22 23:58:44 CST 2018

mZxid = 0x20

mtime = Sun Apr 22 23:59:24 CST 2018

pZxid = 0x1f

cversion = 0

dataVersion = 1

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 17

numChildren = 0

[zk: localhost:2181(CONNECTED) 38]

不会触发事件是因为这个watcher是设置在父节点上的,所以修改子节点数据时不会触发父节点所设置的watcher事件。

使用 get 命令为子节点设置watcher,修改子节点数据时会触发 NodeDataChanged 事件,示例:

[zk: localhost:2181(CONNECTED) 40] get /testWatch/testChildren watch # 使用 get 命令为子节点设置watcher

new-children-data

cZxid = 0x1f

ctime = Sun Apr 22 23:58:44 CST 2018

mZxid = 0x21

mtime = Mon Apr 23 00:01:41 CST 2018

pZxid = 0x1f

cversion = 0

dataVersion = 2

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 17

numChildren = 0

[zk: localhost:2181(CONNECTED) 41] set /testWatch/testChildren new-children-data2 # 修改子节点数据

WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/testWatch/testChildren # 触发 NodeDataChanged 事件

cZxid = 0x1f

ctime = Sun Apr 22 23:58:44 CST 2018

mZxid = 0x22

mtime = Mon Apr 23 00:02:11 CST 2018

pZxid = 0x1f

cversion = 0

dataVersion = 3

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 18

numChildren = 0

[zk: localhost:2181(CONNECTED) 42]

linux怎么看zk的版本号,zookeeper基本特性与基于Linux的ZK客户端命令行学习相关推荐

  1. linux下zookeeper启动命令,For Linux Zookeeper客户端命令行操作指令

    目录 客户端命令行操作 1.启动客户端 2.停止客户端 3.显示所有操作命令 4.查看当前节点信息 ls ~ 详细信息  ls2 5.分别创建两个普通节点 6.获取节点的值 7.创建短暂节点 ~ cr ...

  2. ZooKeeper进阶之客户端命令行操作

    一 Znode数据结构 ZK有一个最开始的节点 / ZK的节点叫做znode节点 每个znode节点都可存储数据 每个znode节点(临时节点除外)都可创建自己的子节点 多个znode节点共同形成了z ...

  3. Zookeeper之客户端命令行操作

    Zookeeper客户端命令行操作 节点类型: 启动客户端 [codecat@hadoop103 zookeeper-3.5.9]$ zkCli.sh 显示所有操作命令 [zk: localhost: ...

  4. linux使用mysql命令行工具_我使用过的Linux命令之mysql - MySQL客户端命令行工具

    我使用过的Linux命令之mysql - MySQL客户端命令行工具 用途说明 mysql命令是用来连接MySQL服务器并执行用户命令行的工具,如果使用MySQL作为数据库,那这个命令就是经常需要用到 ...

  5. linux中mysql客户端命令行连接不了 docker 创建的mysql

    linux中mysql客户端命令行连接不了 docker 创建的mysql 问题 :如题 a@z:~$ mysql -h localhost -p ERROR 2002 (HY000): Can't ...

  6. linux下perl命令行参数,Perl One-Liners | Perl命令行学习1 -e参数

    注:本内容需要点的perl编程基础,最好是读过<perl语言入门>. 本系列是自己平常学习工作中的总结,每一个实例均为我为了讲解而设置的,自己试过的,如有错误,望能见谅 Perl 命令行参 ...

  7. 基于Linux系统的手机,中国最新超算操作系统揭秘:基于Linux

    世界第一超级计算机神威太湖之光亮相之后,令世界瞩目.这款超级计算机由中国自主研发,处理器采用64位国产260核CPU申威SW26010,性能几乎是天河2号的三倍,但总功耗反而更低. 这款超算不仅有强悍 ...

  8. linux命令行学习游戏,如何在Linux命令行中下载GOG游戏

    如果你是一个游戏玩家同时也是一个Linux用户,你可能很高兴在GOG在几个月前宣布它会在你最喜欢的操作系统上推出游戏.如果你之前从来没有听说过GOG,我鼓励你看看他们的产品目录中的"很棒的老 ...

  9. linux中文语音合成软件,中文TTS 的容易告终(基于linux)之 语音库的告终

    语音库保留着常用汉字的发音(多音的汉字只登记其一种发音,这也是本系统的一个缺点,必需尔后健全),因而先要获得一汉字集,这个汉字集包括了大局部常用的汉字,然后在依据这个汉字集,来一个个的获得汉字的发音, ...

最新文章

  1. 重启nagios有异常提示Starting nagios:This account is currently not available
  2. c语言删除文件中的数据_第20问:删除了数据文件,该往哪个方向逃跑
  3. Android O限制系统全屏进一步遏制手机勒索
  4. 对愤怒小鸟首席美术设计Ellinoora的访谈
  5. RocketMQ消息的存储结构
  6. Activiti 多个并发子流程的应用
  7. 对标小米!华为P50 Pro+将有望搭载液态镜头技术
  8. Windows Phone开发(15):资源
  9. 德芙背后刻骨铭心的痛
  10. 风控体系建设、数字化转型、金融科技应用前,您是如何看待数据问题的?
  11. 什么是计算机剪贴板介绍,剪贴板功能介绍
  12. java工程师容易秃头吗_程序员因发际线后悔学java!
  13. 总以为猜对了结局,但烧脑推理电影却总是让我扭伤腰
  14. Windows热键注册原理
  15. 输入一个数字n,输出一个n层的特定三角形
  16. 订单超过 7 天不允许退货
  17. 微信小程序+.NET(九) 小程序之简单的广告拦截
  18. 深信服实习面经11_02
  19. 哥德巴赫猜想(python)
  20. 看!Tiktok 还能这样为亚马逊店铺引流?--TK领航社最新电商变现干货分享

热门文章

  1. 何星火致全体镇邦会战友的一封信
  2. adc去质器什么意思_LOL:人形ADC去质器简略玩法,你的心态有没有被他抓爆过?...
  3. 免费非破解 Mybatis Log Plugin
  4. 苹果自动关机_苹果手机没充满电就拔下来会有什么影响_电工百科
  5. FZOJ--2221-- RunningMan 福建第六届省赛
  6. 初步学习My SQL
  7. 转--Python安全测试工具合集
  8. fzu 2230 翻翻棋
  9. 世行称中国GDP缩水40% 人均收入不及美国1/10
  10. 同性社交软件Blued整改:暂停注册,对未成年人禁用