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

    1. java -version

    Step2: 下载解压 zookeeper

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

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

    1. cp conf/zoo_sample.cfg conf/zoo.cfg

    Step4: 启动zookeeper

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

    Step5: 检测是否启动成功

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

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

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

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

    1. [zk: localhost:2181(CONNECTED) 80] help
    2. ZooKeeper -server host:port cmd args
    3. addauth scheme auth
    4. close
    5. config [-c] [-w] [-s]
    6. connect host:port
    7. create [-s] [-e] [-c] [-t ttl] path [data] [acl]
    8. delete [-v version] path
    9. deleteall path
    10. delquota [-n|-b] path
    11. get [-s] [-w] path
    12. getAcl [-s] path
    13. history
    14. listquota path
    15. ls [-s] [-w] [-R] path
    16. ls2 path [watch]
    17. printwatches on|off
    18. quit
    19. reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
    20. redo cmdno
    21. removewatches path [-c|-d|-a] [-l]
    22. rmr path
    23. set [-s] [-v version] path data
    24. setAcl [-s] [-v version] [-R] path acl
    25. setquota -n|-b val path
    26. stat [-w] path
    27. sync path

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

    1. 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”.)
    创建节点:

    1. create /test-node some-data

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

    1. get /test-node

    image.png
    修改节点数据:

    1. set /test-node some-data-changed

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

    1. 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

    1. create /test-node/test-sub-node

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

    1. ls /

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

    1. create -e /ephemeral data

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

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

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

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

    创建容器节点

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