• Zookeeper系列(2):客户端基本命令与监听机制


    客户端基本命令

    version

    查看Zookeeper客户端版本:

    [zk: localhost:2181(CONNECTED) 28] version 
    ZooKeeper CLI version: 3.6.3--6401e4ad2087061bc6b9f80dec2d69f2e3c8660a, built on 04/08/2021 16:35 GMT
    
    ls

    语法:

    ls [-s] [-w] [-R] path
    

    显示指定节点的子节点:

    [zk: localhost:2181(CONNECTED) 25] ls /
    [zookeeper]
    

    显示指定节点的子节点以及指定节点的状态信息:

    [zk: localhost:2181(CONNECTED) 33] 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
    

    递归显示所有子孙节点:

    [zk: localhost:2181(CONNECTED) 35] ls -R /
    /
    /zookeeper
    /zookeeper/config
    /zookeeper/quota
    /zookeeper/temp1
    
    create

    默认不带参数就是创建持久节点,节点数据是可选的,可以创建节点时指定,也可以不指定。

    语法:

    create [-s] [-e] [-c] [-t ttl] path [data] [acl]
    

    创建持久节点:

    [zk: localhost:2181(CONNECTED) 46] create /p_node mydata
    Created /p_node
    

    创建临时节点:

    [zk: localhost:2181(CONNECTED) 57] create -e /e_node mydata
    Created /e_node
    

    创建持久顺序节点:

    [zk: localhost:2181(CONNECTED) 59] create -s /ps_node mydata
    Created /ps_node0000000005
    

    创建临时顺序节点:

    [zk: localhost:2181(CONNECTED) 61] create -s -e /es_node mydata
    Created /es_node0000000006
    

    创建容器节点:

    当容器节点的最后一个子元素被删除时,该容器节点将会被删除。

    [zk: localhost:2181(CONNECTED) 9]  create -c /container_node mydata
    Created /container_node
    
    stat

    查看节点状态信息:

    [zk: localhost:2181(CONNECTED) 46] stat /
    cZxid = 0x0
    ctime = Thu Jan 01 08:00:00 CST 1970
    mZxid = 0x0
    mtime = Thu Jan 01 08:00:00 CST 1970
    pZxid = 0x18
    cversion = 6
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 0
    numChildren = 4
    

    cZxid:创建节点的zxid。

    ctime:创建节点的时间(从1970年开始)。

    mZxid:节点最后更新的zxid。

    mtime:节点最后更新的时间(从1970年开始)。

    pZxid:节点最后更新的子节点zxid。

    cversion:子节点被更改的次数,子节点的变化都会导致该值递增。

    dataVersion:数据被更改的次数,每次数据变化都会导致该值递增。

    aclVersion:ACL更改次数,每次ACL的变更都会导致该值递增。

    ephemeralOwner:如果节点是一个临时节点,则该值为会话ID。如果节点不是临时节点,则该值为0。

    dataLength:节点数据长度。

    numChildren:节点的子节点数量。

    get

    语法:

    get [-s] [-w] path
    

    查看节点数据:

    [zk: localhost:2181(CONNECTED) 1] get /p_node
    mydata
    

    查看节点数据以及节点状态信息:

    [zk: localhost:2181(CONNECTED) 5] get -s /p_node
    mydata
    cZxid = 0x3
    ctime = Thu Apr 22 15:56:50 CST 2021
    mZxid = 0x3
    mtime = Thu Apr 22 15:56:50 CST 2021
    pZxid = 0x3
    cversion = 0
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 6
    numChildren = 0
    
    set

    语法:

    set [-s] [-v version] path data
    

    更新节点数据:

    [zk: localhost:2181(CONNECTED) 7] set /p_node data1
    [zk: localhost:2181(CONNECTED) 8] get /p_node
    data1
    

    更新节点数据并显示节点状态信息:

    [zk: localhost:2181(CONNECTED) 11] set -s /p_node data3
    cZxid = 0x3
    ctime = Thu Apr 22 15:56:50 CST 2021
    mZxid = 0x9
    mtime = Thu Apr 22 16:04:26 CST 2021
    pZxid = 0x3
    cversion = 0
    dataVersion = 4
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 5
    numChildren = 0
    [zk: localhost:2181(CONNECTED) 12] get /p_node 
    data3
    

    使用CAS更新节点数据:

    -v 指定数据版本号,如果指定的数据版本号和数据当前版本号不一致,则更新失败。

    [zk: localhost:2181(CONNECTED) 16] set -v 4 /p_node data0
    [zk: localhost:2181(CONNECTED) 17] get /p_node
    data0
    
    delete

    delete命令只能删除没有子节点的节点。

    语法:

    delete [-v version] path
    

    删除节点:

    [zk: localhost:2181(CONNECTED) 27] delete /temp
    [zk: localhost:2181(CONNECTED) 28] get /temp
    Node does not exist: /temp
    

    delete也支持指定版本删除:

    [zk: localhost:2181(CONNECTED) 27] delete -v 0 /temp
    [zk: localhost:2181(CONNECTED) 28] get /temp
    Node does not exist: /temp
    
    deleteall

    删除节点以及所有子孙节点:

    [zk: localhost:2181(CONNECTED) 35] deleteall /temp
    
    history

    显示最近执行的11条命令的历史记录:

    [zk: localhost:2181(CONNECTED) 37] history
    27 - delete -v 0 /temp
    28 - get /temp
    29 - ls /
    ...
    
    getAllChildrenNumber

    获取节点下的所有子孙节点数量:

    [zk: localhost:2181(CONNECTED) 39] getAllChildrenNumber /
    5
    
    getEphemerals

    获取当前客户端创建的所有临时节点:

    [zk: localhost:2181(CONNECTED) 42] create -e /temp1 mydata1 
    Created /temp1
    [zk: localhost:2181(CONNECTED) 43] create -e /temp2 mydata2 
    Created /temp2
    [zk: localhost:2181(CONNECTED) 44] getEphemerals
    [/temp2, /temp1]
    

    获取当前客户端在指定节点下创建的所有临时节点:

    [zk: localhost:2181(CONNECTED) 49] getEphemerals /
    [/temp2, /temp1]
    
    sync

    在leader和follower之间同步一个节点的数据(异步执行):

    [zk: localhost:2181(CONNECTED) 5] sync /
    Sync is OK
    
    quit

    退出当前客户端

    [zk: localhost:2181(CONNECTED) 6] quit 
    

    监听机制

    客户端可以监听节点的变化,当节点发生改变时,将触发相应的事件。当事件被触发时,客户端会收到一个数据包,说明节点已经改变。

    监听节点目录变化

    监听节点的子节点变化,当子节点发生改变时触发。

    语法:

    ls -w path
    

    创建/watchtest节点的目录监听:

    [zk: localhost:2181(CONNECTED) 71] ls -w /watchtest
    

    创建/watchtest节点的子节点来触发事件:

    [zk: localhost:2181(CONNECTED) 73] create /watchtest/w1 data1
    
    WATCHER::
    
    WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/watchtest
    Created /watchtest/w1
    

    一次性监听,触发后会被删除,无法再次触发:

    [zk: localhost:2181(CONNECTED) 74] create /watchtest/w2 data1
    Created /watchtest/w2
    
    监听节点数据变化

    监听节点数据变化,当节点数据发生改变时触发。

    语法:

    get -w path
    

    创建/watchtest节点的数据监听:

    [zk: localhost:2181(CONNECTED) 94] get -w /watchtest 
    mydata2
    

    更新/watchtest节点数据来触发事件:

    [zk: localhost:2181(CONNECTED) 95] set /watchtest mydata3
    
    WATCHER::
    
    WatchedEvent state:SyncConnected type:NodeDataChanged path:/watchtest
    

    一次性监听,触发后会被删除,无法再次触发:

    [zk: localhost:2181(CONNECTED) 96] set /watchtest mydata4
    [zk: localhost:2181(CONNECTED) 97]
    
    永久监听

    在Zookeeper 3.6.0版本之后,客户端可以在节点上创建永久监听,永久监听在被触发后不会被删除。

    语法:

    addWatch [-m mode] path
    

    永久监听在创建时可以通过 -m 指定模式,模式分为两种:PERSISTENT和PERSISTENT_RECURSIVE,不指定默认使用PERSISTENT_RECURSIVE模式。

    PERSISTENT:节点的数据变化以及子节点的变化会触发相应事件,子节点的数据变化不会触发。

    [zk: localhost:2181(CONNECTED) 124] addWatch -m PERSISTENT /watchtest 
    [zk: localhost:2181(CONNECTED) 125] set /watchtest mydata100
    
    WATCHER::
    
    WatchedEvent state:SyncConnected type:NodeDataChanged path:/watchtest
    [zk: localhost:2181(CONNECTED) 126] create /watchtest/w1
    
    WATCHER::
    
    WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/watchtest
    Created /watchtest/w1
    [zk: localhost:2181(CONNECTED) 127] delete /watchtest/w1 
    
    WATCHER::
    
    WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/watchtest
    

    PERSISTENT_RECURSIVE:节点的数据变化以及所有子孙节点的目录或者数据变化都会触发相应事件。

    [zk: localhost:2181(CONNECTED) 129] addWatch -m PERSISTENT_RECURSIVE /watchtest 
    [zk: localhost:2181(CONNECTED) 130] ls /watchtest 
    []
    [zk: localhost:2181(CONNECTED) 131] set /watchtest mydata101
    
    WATCHER::
    
    WatchedEvent state:SyncConnected type:NodeDataChanged path:/watchtest
    [zk: localhost:2181(CONNECTED) 132] create /watchtest/w1
    
    WATCHER::
    
    WatchedEvent state:SyncConnected type:NodeCreated path:/watchtest/w1
    Created /watchtest/w1
    [zk: localhost:2181(CONNECTED) 133] create /watchtest/w1/w1_1
    
    WATCHER::
    
    WatchedEvent state:SyncConnected type:NodeCreated path:/watchtest/w1/w1_1
    Created /watchtest/w1/w1_1
    [zk: localhost:2181(CONNECTED) 134] set /watchtest/w1/w1_1 data101
    
    WATCHER::
    
    WatchedEvent state:SyncConnected type:NodeDataChanged path:/watchtest/w1/w1_1
    
    删除节点的监听

    语法:

    removewatches path [-c|-d|-a] [-l]
    

    无论是一次性监听还是永久监听都可以removewatches删除。

    [zk: localhost:2181(CONNECTED) 116] removewatches /watchtest 
    
    WATCHER::
    
    WatchedEvent state:SyncConnected type:PersistentWatchRemoved path:/watchtest
    

    参考资料:

    Zookeeper官方文档

  • 相关阅读:
    软件研发:公司内部技术考试——算法编程题程序框架
    软件研发:公司内部技术考试——答题方法
    JConsole & JVisualVM远程监视Websphere服务器JVM的配置方法
    java.sql.SQLException: ORA-01578: ORACLE 数据块损坏问题解决办法
    ORA-00001: unique constraint (...) violated并不一定是数据冲突
    Linux部署Web应用程序超链接下载中文名称文件404问题解决办法
    Windows平台使用RMAN命令自动删除Oracle过期归档日志的方法
    Oracle调整内存超出限制出现ORA-27100: shared memory realm already exists问题解决办法
    linux下查看最消耗CPU、内存的进程
    RMAN正确地删除Archivelog以及设置有备库的归档删除策略
  • 原文地址:https://www.cnblogs.com/seve/p/14701705.html
Copyright © 2020-2023  润新知