• zookeeper结构和命令


    1.1. zookeeper特性

    1、Zookeeper:一个leader,多个follower组成的集群

    2、全局数据一致:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的

    3、分布式读写,更新请求转发,由leader实施

    4、更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行

    5、数据更新原子性,一次数据更新要么成功,要么失败

    6、实时性,在一定时间范围内,client能读到最新数据

    1.2. zookeeper数据结构

    1、层次化的目录结构,命名符合常规文件系统规范(见下图)

    2、每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识

    3、节点Znode可以包含数据和子节点(但是EPHEMERAL类型的节点不能有子节点,下一页详细讲解)

    4、客户端应用可以在节点上设置监视器(后续详细讲解)   

    1.3. 数据结构的图

     

    1.4. 节点类型

    1、Znode有两种类型:

    短暂(ephemeral)(断开连接自己删除)

    持久(persistent)(断开连接不删除)

    2、Znode有四种形式的目录节点(默认是persistent )

    PERSISTENT 持久

    PERSISTENT_SEQUENTIAL(持久序列/test0000000019 )

    EPHEMERAL 短暂

    EPHEMERAL_SEQUENTIAL 短暂带序列

    3、创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护

    4、在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序

    1.5. zookeeper命令行操作

    运行 zkCli.sh –server <ip>进入命令行工具

    1、使用 ls 命令来查看当前 ZooKeeper 中所包含的内容:

    [zk: 202.115.36.251:2181(CONNECTED) 1] ls /

    2、创建一个新的 znode ,使用 create /zk myData 。这个命令创建了一个新的 znode 节点“ zk ”以及与它关联的字符串:

    [zk: 202.115.36.251:2181(CONNECTED) 2] create /zk "myData“

    3、我们运行 get 命令来确认 znode 是否包含我们所创建的字符串:

    [zk: 202.115.36.251:2181(CONNECTED) 3] get /zk

    #监听这个节点的变化,当另外一个客户端改变/zk时,它会打出下面的

    #WATCHER::

    #WatchedEvent state:SyncConnected type:NodeDataChanged path:/zk

    [zk: localhost:2181(CONNECTED) 4] get /zk watch

    4、下面我们通过 set 命令来对 zk 所关联的字符串进行设置:

    [zk: 202.115.36.251:2181(CONNECTED) 4] set /zk "zsl“

    5、下面我们将刚才创建的 znode 删除:

    [zk: 202.115.36.251:2181(CONNECTED) 5] delete /zk

    6、删除节点:rmr

    [zk: 202.115.36.251:2181(CONNECTED) 5] rmr /zk

     

    1.简介

    ZooKeeper提供了一个非常简单的命令行客户端zkCli,它在ZooKeeper安装目录的bin目录下。

    [root@s1 zk]# ls /usr/local/zookeeper/bin/
    zkCleanup.sh  zkCli.sh  zkEnv.sh  zkServer.sh

    先连接一个已经启动的ZooKeeper实例。例如:

    zkCli.sh -server localhost:2181

    连接过程中会输出一大堆信息。当连接成功后,将进入ZooKeeper的交互式模式:

    WatchedEvent state:SyncConnected type:None path:null
    [zk: localhost:2181(CONNECTED) 0]   # 在这里输入ZooKeeper允许的命令

    ZooKeeper的命令很少很简单,大致分为几个类型:

    1. create:在树中的某个位置创建一个节点。
    2. delete:删除一个节点。
    3. exists:测试一个节点是否存在。
    4. get data:读取节点数据。
    5. set data:向节点中写入数据。
    6. get children:检索某节点的子节点列表。
    7. sync:等待要传播的数据。

    注意,这只是命令的功能类型,并不意味着它们就是命令。

    2.创建znode

     
    create [-s] [-e] path data acl

    -s:创建的是带序列号的节点,序列号用0填充节点路径。
    -e:创建的是临时节点。
    path:znode的路径,ZooKeeper中没有相对路径,所有路径都必须以'/'开头。
    data:znode携带的数据。
    acl:这个节点的ACL。

    例如,创建一个znode节点:

    [zk: localhost:2181(CONNECTED) 1] create /zk_test mydata1
    Created /zk_test

    其中/zk_test是节点名称,mydata1是该节点携带的数据。

    创建一个子节点:

    [zk: localhost:2181(CONNECTED) 2] create /zk_test/child_node1 "mydata2"
    Created /zk_test/child_node1

    创建一个带序列号的znode:

    [zk: localhost:2181(CONNECTED) 31] create -s /test1 222
    Created /test10000000003

    注意,创建了带序列号的znode后,以后只能使用带序列号的路径/test10000000003来引用这个znode,而不能用/test1来引用。

    创建一个临时znode:

    [zk: localhost:2181(CONNECTED) 32] create -e /test2 333
    Created /test2

    临时znode在会话退出时会自动删除,所以不能在临时节点上创建子节点。另外,虽然临时节点属于某会话,但所有客户端都可以查看、引用它。

    3.查看节点的数据和状态信息

    获取节点数据、状态信息:

    [zk: localhost:2181(CONNECTED) 6] get /zk_test
    mydata1           # 节点携带的数据
    cZxid = 0x4
    ctime = Wed Jun 27 02:05:44 CST 2018
    mZxid = 0x4
    mtime = Wed Jun 27 02:05:44 CST 2018
    pZxid = 0x5
    cversion = 1
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 7
    numChildren = 1
    [zk: localhost:2181(CONNECTED) 7] get /zk_test/child_node1
    mydata2
    cZxid = 0x5
    ctime = Wed Jun 27 02:29:12 CST 2018
    mZxid = 0x5
    mtime = Wed Jun 27 02:29:12 CST 2018
    pZxid = 0x5
    cversion = 0
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 7
    numChildren = 0

    如果只是要获取节点的状态信息,可以使用stat命令:

    [zk: localhost:2181(CONNECTED) 8] stat /zk_test
    cZxid = 0x4
    ctime = Wed Jun 27 02:05:44 CST 2018
    mZxid = 0x4
    mtime = Wed Jun 27 02:05:44 CST 2018
    pZxid = 0x5
    cversion = 1
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 7
    numChildren = 1

    ls2命令是lsstat两个命令的结合体,可以获取给定节点下的子节点,以及给定节点的状态信息:

    [zk: localhost:2181(CONNECTED) 12] ls2 /
    [zookeeper, zk_test]    # 子节点列表
    cZxid = 0x0
    ctime = Thu Jan 01 08:00:00 CST 1970
    mZxid = 0x0
    mtime = Thu Jan 01 08:00:00 CST 1970
    pZxid = 0x4
    cversion = 0
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 0
    numChildren = 2      # 子节点数量

    4.查看子节点

    ls命令查看某节点下的子节点。注意,不会递归检索。

    [zk: localhost:2181(CONNECTED) 3] ls /
    [zookeeper, zk_test]
    
    [zk: localhost:2181(CONNECTED) 4] ls /zk_test
    [child_node1]

    5.修改节点数据

    set命令用于修改节点:

    [zk: localhost:2181(CONNECTED) 13] set /zk_test "mydata2"
    cZxid = 0x4
    ctime = Wed Jun 27 02:05:44 CST 2018
    mZxid = 0x9
    mtime = Wed Jun 27 02:42:45 CST 2018
    pZxid = 0x7
    cversion = 2
    dataVersion = 1
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 7
    numChildren = 0

    6.删除节点

    delete可以删除节点。注意,它不会递归删除,所以要删除一个包含子节点的节点,需要先删除所有子节点。

    [zk: localhost:2181(CONNECTED) 21] delete /zk_test
    Node not empty: /zk_test
    
    [zk: localhost:2181(CONNECTED) 22] delete /zk_test/child_node1

    rmr命令可以递归删除节点,所以也会删除节点中的所有子节点。

    [zk: localhost:2181(CONNECTED) 36] create /test/hello 2323
    Created /test/hello
    [zk: localhost:2181(CONNECTED) 37] create /test/hello/hello1 23233
    Created /test/hello/hello1
    [zk: localhost:2181(CONNECTED) 38] rmr /test
    [zk: localhost:2181(CONNECTED) 39] ls /
    [test2, mynode, zookeeper, test10000000003, zk_test]

    7.history和redo

    history命令可以列出最近操作的10条命令历史,并给出每个历史命令的编号。redo命令可以根据历史命令的编号重新调用这些命令。

    [zk: localhost:2181(CONNECTED) 18] history
    8 - stat /zk_test
    9 - get /
    10 - get child /
    11 - get children /
    12 - ls2 /
    13 - ls /
    14 - ls2 /zk_test
    15 - get /
    16 - help
    17 - ls /zk
    18 - history

    重新执行编号为13的历史命令:

    [zk: localhost:2181(CONNECTED) 27] redo 13
    [zookeeper, zk_test]

    8.connect和close

    connect命令用于连接其它ZooKeeper服务器,close用于关闭当前连接。就像ssh到其它服务器,然后exit一样。

    # 注意下面的ZooKeeper shell提示符中地址和连接状态的变化:
    [zk: localhost:2181(CONNECTED) 40] connect 192.168.100.21:2181
    [zk: 192.168.100.21:2181(CONNECTED) 41] close
    [zk: 192.168.100.21:2181(CLOSED) 43]

    需要注意,当connect到其它服务器后,当前的连接就会断开,当前会话中的临时znode就会被删除。以下是connect到其它服务器时zookeeper.out中相关内容:

    2018-06-27 04:36:16,734 [myid:] - INFO  [ProcessThread(sid:0 cport:2181)::PrepRequestProcessor@487] - Processed session termination for sessionid: 0x10007ee8bb20003
    2018-06-27 04:36:16,737 [myid:] - INFO  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@1040] - Closed socket connection for client /0:0:0:0:0:0:0:1:34376 which had sessionid 0x10007ee8bb20003

    所以,上面执行了close后,不会切换回之前的连接,需要手动再连接。

    [zk: 192.168.100.21:2181(CONNECTED) 41] close
    [zk: 192.168.100.21:2181(CLOSED) 43] ls /
    Not connected
    
    [zk: 192.168.100.21:2181(CLOSED) 44] connect localhost:2181
    
    [zk: localhost:2181(CONNECTED) 45] ls /
    [mynode, zookeeper, test10000000003, zk_test]

    9.quit

    quit命令退出ZooKeeper的交互式命令行。

    [zk: localhost:2181(CONNECTED) 29] quit
    Quitting...
     
     
     
    https://www.cnblogs.com/zzzmublog/p/11127657.html
  • 相关阅读:
    POJ 2236 Wireless Network(并查集)
    POJ 2010 Moo University
    POJ 3614 Sunscreen(贪心,区间单点匹配)
    POJ 2184 Cow Exhibition(背包)
    POJ 1631 Bridging signals(LIS的等价表述)
    POJ 3181 Dollar Dayz(递推,两个long long)
    POJ 3046 Ant Counting(递推,和号优化)
    POJ 3280 Cheapest Palindrome(区间dp)
    POJ 3616 Milking Time(dp)
    POJ 2385 Apple Catching(01背包)
  • 原文地址:https://www.cnblogs.com/suger43894/p/11207002.html
Copyright © 2020-2023  润新知