zoukankan      html  css  js  c++  java
  • Zookeeper安装、文件系统数据结构、事件监听机制

    zk是使用java语言开发的,需要先配置java环境,不做赘述。

    一、下载解压

    cd /usr/local
    wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8-bin.tar.gz
    tar -zxvf apache-zookeeper-3.5.8-bin.tar.gz

    二、进入到conf目录,复制一份zk提供的配置示例文件

    cp zoo_sample.cfg  zoo.cfg 

    三、启动zk

    ./bin/zkServer.sh start conf/zoo.cfg

    四、检查是否启动成功,连接zk客户端

    ps -ef | grep zookeeper 
    ./bin/zkCli.sh -server ip:port

    接下来就可以使用zk了

    查看zk支持的命令:help

    [zk: localhost:2181(CONNECTED) 2] help
    ZooKeeper -server host:port cmd args
        addauth scheme auth
        close
        config [-c] [-w] [-s]
        connect host:port
        create [-s] [-e] [-c] [-t ttl] path [data] [acl] 
        delete [-v version] path
        deleteall path
        delquota [-n|-b] path
        get [-s] [-w] path 
        getAcl [-s] path
        history
        listquota path
        ls [-s] [-w] [-R] path
        ls2 path [watch]
        printwatches on|off
        quit
        reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
        redo cmdno
        removewatches path [-c|-d|-a] [-l]
        rmr path
        set [-s] [-v version] path data 
        setAcl [-s] [-v version] [-R] path acl
        setquota -n|-b val path
        stat [-w] path
        sync path

    五、zk的文件系统数据结构

    # create不加任何参数,创建持久化节点
    [zk: localhost:2181(CONNECTED) 0] create /test xxx
    Created /test
    [zk: localhost:2181(CONNECTED) 1] get /test
    xxx
    [zk: localhost:2181(CONNECTED) 2] set /test abc
    [zk: localhost:2181(CONNECTED) 3] get /test
    abc

    查看zk中的节点和递归查看所有节点,在zk中没有相对路径的说法,一切从根开始

    [zk: localhost:2181(CONNECTED) 5] ls /
    [test, zookeeper]
    [zk: localhost:2181(CONNECTED) 6] ls -R /
    /
    /test
    /zookeeper
    /zookeeper/config
    /zookeeper/quota

    查看节点状态信息:

    [zk: localhost:2181(CONNECTED) 8] stat /test
    cZxid = 0x60 # 创建节点的事务id
    ctime = Wed Nov 18 14:13:44 CST 2020 # 节点创建时间
    mZxid = 0x62 # 最后修改节点的事务id
    mtime = Wed Nov 18 14:13:51 CST 2020 # 节点最后修改时间
    pZxid = 0x60 # 最后添加或删除子节点的事务id
    cversion = 0 # 子节点版本,子节点的增删会影响
    dataVersion = 1 # 当前节点数据的版本
    aclVersion = 0  # acl版本号
    ephemeralOwner = 0x0 # 如果znode为临时节点,表示所有者的sessionId,如果不是znode,值为零
    dataLength = 3 # znode数据字段的长度
    numChildren = 0 # 子节点的数量

    使用get -s命令同样可以获取到节点状态信息,使用dataVersion实现乐观锁,再次修改节点数据的时候可以加上当前数据版本进行操作

    # 第二次进行修改,可以看到报错版本号错误
    [zk: localhost:2181(CONNECTED) 10] set -v 1 /test aaa [zk: localhost:2181(CONNECTED) 11] set -v 1 /test aaa version No is not valid : /test

    创建子节点:

    [zk: localhost:2181(CONNECTED) 13] create /test/sub1
    Created /test/sub1
    [zk: localhost:2181(CONNECTED) 14] create /test/sub2
    Created /test/sub2
    [zk: localhost:2181(CONNECTED) 15] create /test/sub3
    Created /test/sub3
    [zk: localhost:2181(CONNECTED) 16] ls -R /
    /
    /test
    /zookeeper
    /test/sub1
    /test/sub2
    /test/sub3
    /zookeeper/config
    /zookeeper/quota

    创建临时节点,客户端断开后会丢失,create -e ,临时节点不能创建子节点

    [zk: localhost:2181(CONNECTED) 17] create -e /ephemeral temp
    Created /ephemeral
    [zk: localhost:2181(CONNECTED) 18] create -e /ephemeral/sub1 tempsub1
    Ephemerals cannot have children: /ephemeral/sub1

    创建顺序节点,create -s,zk会自动给节点编号:

    [zk: localhost:2181(CONNECTED) 10] create -s /seq
    Created /seq0000000016
    [zk: localhost:2181(CONNECTED) 11] create -s /seq
    Created /seq0000000017
    [zk: localhost:2181(CONNECTED) 12] create -s /seq
    Created /seq0000000018

    使用create -e -s可以创建临时顺序节点,不再赘述。

    使用create -c创建容器节点,容器节点的意义就在于存放子节点,如果没有子节点,就相当于持久化节点,如果有子节点,再把子节点清空,容器节点也会自动被删除,不再赘述。

    使用create -t: 可以给节点添加过期时间,默认情况下是禁用的,需要通过配置来开启,修改zkServer.sh,在ZOOMAIN处设置参数:-Dzookeeper.extendedTypesEnabled=true

    六、事件监听机制

    1)针对节点监听:get -w /path,注册监听的同时获取数据,stat -w /path,注册监听的同时获取元数据。

    开启两个客户端进行测试,A客户端执行:get -w /test,B客户端执行:set /test abc,可以看到A客户端收到了NodeDataChanged事件。B客户端再次执行set /test abc,A客户端无反应,事件一旦监听到,对应的注册会被移出,是一次性的。

    # A客户端监听/test节点,只会收到一次时事件通知
    [zk: localhost:2181(CONNECTED) 3] get -w /test
    aaa
    [zk: localhost:2181(CONNECTED) 4]
    WATCHER::
    
    WatchedEvent state:SyncConnected type:NodeDataChanged path:/test
    # B客户端一共执行了两次
    [zk: localhost:2181(CONNECTED) 0] set /test  bbb
    [zk: localhost:2181(CONNECTED) 1] set /test  ccc

    2)针对目录的监听:ls -w /path,同样是一次性的,可以去创建、删除子节点验证。

    # A客户端监听/dir目录,只会有一次事件通知
    [zk: localhost:2181(CONNECTED) 6] ls -w /dir
    []
    [zk: localhost:2181(CONNECTED) 7]
    WATCHER::
    
    WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/dir
    # B客户端在/dir下创建两个子节点
    [zk: localhost:2181(CONNECTED) 3] create /dir/sub1
    Created /dir/sub1
    [zk: localhost:2181(CONNECTED) 4] create /dir/sub2
    Created /dir/sub2

    3)针对目录递归监听:ls -R -w /path,针对每个目录节点也都是一次性的监听,不在赘述。

    列举zk中的监听事件:
    None 连接建立事件
    NodeCreated 节点创建
    NodeDeleted 节点删除
    NodeDataChanged 节点数据变化
    NodeChildrenChanged 子节点列表变化
    DataWatchRemoved 节点监听被移除
    ChildWatchRemoved 子节点监听被移除
     

  • 相关阅读:
    接口和抽像类
    java中FastJson的json类型转换
    可参考的源码
    @Autowired注解和静态属性
    IDEA中,将项目加入maven管理。
    关于.idea未上传导致不能显示项目文件结构的问题
    Master-Worker模式
    Future模式
    了解Queue
    ConcurrentMap与CopyOnWrite容器
  • 原文地址:https://www.cnblogs.com/dlcode/p/13999444.html
Copyright © 2011-2022 走看看