3. Zookeeper 实战
    3.1. zookeeper安装
    Step1:配置JAVA环境,检验环境:

    1. java -version

    Step2: 下载解压 zookeeper

    https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9-bin.tar.gz
    tar -zxvf apache-zookeeper-3.5.9-bin.tar.gz
    cd  apache-zookeeper-3.5.9-bin
    

    Step3: 重命名配置文件 zoo_sample.cfg

    cp conf/zoo_sample.cfg conf/zoo.cfg
    

    Step4: 启动zookeeper

    # 可以通过 bin/zkServer.sh  来查看都支持哪些参数 
    bin/zkServer.sh start conf/zoo.cfg
    

    Step5: 检测是否启动成功

    echo stat | nc 192.168.0.200 // 前提是配置文件中中讲 stat 四字命令设置了了白名单 
    如:
    4lw.commands.whitelist=stat
    

    Step6: 连接服务器
    bin/zkCli.sh -server ip:port

    连接本机
    bin/zkCli.sh 
    连接其它主机
    bin/zkCli.sh -server 192.168.0.200:2181
    

    3.2. 使用命令行操作zookeeper
    输入命令 help 查看zookeeper所支持的所有命令:

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

    查看所有目录结构
    image.png
    1. 创建zookeeper 节点命令

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

    中括号为可选项,没有则默认创建持久化节点
    -s: 顺序节点
    -e: 临时节点
    -c: 容器节点
    -t: 可以给节点添加过期时间,默认禁用,需要通过系统参数启用
    (-Dzookeeper.extendedTypesEnabled=true, znode.container.checkIntervalMs : (Java system property only) New in 3.5.1: The time interval in milliseconds for each check of candidate container and ttl nodes. Default is “60000”.)
    创建节点:

    create  /test-node some-data
    

    如上,没有加任何可选参数,创建的就是持久化节点
    image.png
    查看节点:

     get /test-node
    

    image.png
    修改节点数据:

    set /test-node some-data-changed
    

    image.png
    查看节点状态信息:

    stat /test-node
    

    image.png
    Stat

    • cZxid:创建znode的事务ID(Zxid的值)。
    • mZxid:最后修改znode的事务ID。
    • pZxid:最后添加或删除子节点的事务ID(子节点列表发生变化才会发生改变)。
    • ctime:znode创建时间。
    • mtime:znode最近修改时间。
    • dataVersion:znode的当前数据版本。
    • cversion:znode的子节点结果集版本(一个节点的子节点增加、删除都会影响这个版本)。
    • aclVersion:表示对此znode的acl版本。
    • ephemeralOwner:znode是临时znode时,表示znode所有者的 session ID。 如果znode不是临时znode,则该字段设置为零。
    • dataLength:znode数据字段的长度。
    • numChildren:znode的子znode的数量。

    查看节点状态信息同时查看数据
    image.png
    根据状态数据中的版本号有并发修改数据实现乐观锁的功能
    比如: 客户端首先获取版本信息, get -s /node-test
    image.png
    /test-node 当前的数据版本是 1 , 这时客户端 用 set 命令修改数据的时候可以把版本号带上
    image.png
    如果在执行上面 set命令前, 有人修改了数据,zookeeper 会递增版本号, 这个时候,如果再用以前的版本号去修改,将会导致修改失败,报如下错误
    image.png
    创建子节点, 这里要注意,zookeeper是以节点组织数据的,没有相对路径这么一说,所以,所有的节点一定是以 / 开头。
    create /test-node/test-sub-node

    create /test-node/test-sub-node
    

    image.png
    查看子节点信息,比如根节点下面的所有子节点, 加一个大写 R 可以查看递归子节点列表

    ls /
    

    image.png
    查看 /test-node 下面所有的子节点
    image.png
    创建临时节点

     create -e /ephemeral data
    

    create 后跟一个 -e 创建临时节点 , 临时节点不能创建子节点
    image.png
    创建序号节点,加参数 -s

    create    /seq-parent  data // 创建父目录,单纯为了分类,非必须
    create -s /seq-parent/  data // 创建顺序节点。顺序节点将再seq-parent 目录下面,顺序递增
    

    为了容纳子节点,先创建个父目录 /seq-parent
    image.png
    也可以再序号节点前面带一个前缀
    image.png
    创建临时顺序节点,其它增删查改和其他节点无异,不再贴图

     create -s -e /ephemeral-node/前缀-
    

    创建容器节点

    create -c /container
    
    1. 事件监听机制:
      针对节点的监听:一定事件触发,对应的注册立刻被移除,所以事件监听是一次性的
      get  -w  /path   // 注册监听的同时获取数据
      stat -w /path   // 对节点进行监听,且获取元数据信息
      
      image.png
      针对目录的监听,如下图,目录的变化,会触发事件,且一旦触发,对应的监听也会被移除,后续对节点的创建没有触发监听事件
      ls -w /path
      
      image.png
      针对递归子目录的监听
      ls -R -w /path : -R 区分大小写,一定用大写
      
      如下对/test 节点进行递归监听,但是每个目录下的目录监听也是一次性的,如第一次在/test 目录下创建节点时,触发监听事件,第二次则没有,同样,因为时递归的目录监听,所以在/test/sub0下进行节点创建时,触发事件,但是再次创建/test/sub0/subsub1节点时,没有触发事件。
      image.png
      Zookeeper事件类型:
      None: 连接建立事件
      NodeCreated: 节点创建
      NodeDeleted: 节点删除
      NodeDataChanged:节点数据变化
      NodeChildrenChanged:子节点列表变化
      DataWatchRemoved:节点监听被移除
      ChildWatchRemoved:子节点监听被移除