3. Zookeeper 实战
3.1. zookeeper安装
**Step1:**配置JAVA环境,检验环境:是否配置JDK,因为Zookeeper是java语言编写的依赖JDK环境
java -version
Step2: 下载解压 zookeeper
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
cd apache-zookeeper-3.5.8-bin
Step3: 重命名配置文件 zoo_sample.cfg
cp zoo_sample.cfg zoo.cfg
Step3.1: 在zoo.cfg 中添加stat 指令白名单
4lw.commands.whitelist=stat 或
#开启四字命令
4lw.commands.whitelist=*
Step4: 启动zookeeper
# 可以通过 bin/zkServer.sh 来查看都支持哪些参数
bin/zkServer.sh start conf/zoo.cfg
Step5: 检测是否启动成功
echo stat | nc 192.168.109.200
Step6: 连接服务器
bin/zkCli.sh -server ip:port
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
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
如上,没有加任何可选参数,创建的就是持久化节点
查看节点:
get /test-node
修改节点数据:
set /test-node some-data-changed
查看节点状态信息:
stat /test-node
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的数量。
查看节点状态信息同时查看数据
get -s /test-node
根据状态数据中的版本号有并发修改数据实现乐观锁的功能
比如: 客户端首先获取版本信息, get -s /node-test
/test-node 当前的数据版本是 1 , 这时客户端 用 set 命令修改数据的时候可以把版本号带上
set -v 1 /test-node changed
如果在执行上面 set命令前, 有人修改了数据,zookeeper 会递增版本号, 这个时候,如果再用以前的版本号去修改,将会导致修改失败,报如下错误
version No is not valid : /test-node
创建子节点, 这里要注意,zookeeper是以节点组织数据的,没有相对路径这么一说,所以,所有的节点一定是以 / 开头。
create /test-node/test-sub-node
查看子节点信息,比如根节点下面的所有子节点, 加一个大写 R 可以查看递归子节点列表
ls -R /
创建临时节点 :create 后跟一个 -e 创建临时节点 , 临时节点不能创建子节点
create -e /ephemeral data
创建序号节点,加参数 -s
// 创建父目录,单纯为了分类,非必须
create /seq-parent data
// 创建顺序节点。顺序节点将再seq-parent 目录下面,顺序递增
create -s /seq-parent/ data
// 添加前缀
create -s /seq-parent/a data
创建临时顺序节点,其它增删查改和其他节点无异
create -s -e /ephemeral-node/前缀-
2、事件监听机制:
针对节点的监听:一定事件触发,对应的注册立刻被移除,所以事件监听是一次性的
get -w /path // 注册监听的同时获取数据
stat -w /path // 对节点进行监听,且获取元数据信息
针对目录的监听,目录的变化,会触发事件,且一旦触发,对应的监听也会被移除,后续对节点的创建没有触发监听事件
ls -w /path
针对递归子目录的监听
ls -R -w /path : #-R 区分大小写,一定用大写
如下对/test 节点进行递归监听,但是每个目录下的目录监听也是一次性的,如第一次在/test 目录下创建节点时,触发监听事件,第二次则没有,同样,因为时递归的目录监听,所以在/test/sub0下进行节点创建时,触发事件,但是再次创建/test/sub0/subsub1节点时,没有触发事件。
Zookeeper事件类型:
None: 连接建立事件
NodeCreated: 节点创建
NodeDeleted: 节点删除
NodeDataChanged:节点数据变化
NodeChildrenChanged:子节点列表变化
DataWatchRemoved:节点监听被移除
ChildWatchRemoved:子节点监听被移除