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