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 子节点监听被移除
 

 

posted @ 2020-11-18 14:02  以战止殇  阅读(122)  评论(0编辑  收藏  举报