一、zookeeper安装
- 配置JAVA环境,检验环境
java ‐version
- 下载解压 zookeeper
# 下载
wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper‐3.5.8/apache‐zookeepe
r‐3.5.8‐bin.tar.gz
# 解压
tar ‐zxvf apache‐zookeeper‐3.5.8‐bin.tar.gz
cd apache‐zookeeper‐3.5.8‐bin
- 重命名配置文件 zoo_sample.cfg
cp zoo_sample.cfg zoo.cfg
- 启动zookeeper
# 可以通过 bin/zkServer.sh 来查看都支持哪些参数
bin/zkServer.sh start conf/zoo.cfg
- 检测是否启动成功
echo stat | nc 192.168.109.200 // 前提是配置文件中中讲 stat 四字命令设置了了白名单
4lw.commands.whitelist=stat
- 连接服务器
bin/zkCli.sh ‐server ip:port
二、使用命令行操作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:port
2;port3[,...]*]] | [‐add serverId=host:port1:port2;port3[,...]]* [‐remove serverI
d[,...]*]
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
- 创建zookeeper 节点命令
create [‐s] [‐e] [‐c] [‐t ttl] path [data] [acl]
中括号为可选项,没有则默认创建持久化节点
-s: 顺序节点
-e: 临时节点
-c: 容器节点
-t: 可以给节点添加过期时间,默认禁用,需要通过系统参数启用
- 创建节点
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 /node-test changeData
如果在执行上面 set命令前, 有人修改了数据,zookeeper 会递增版本号, 这个时候,如果再用以前的版本号去修改,将会导致修改失败,报如下错误
zookeeper是以节点组织数据的,没有相对路径这么一说,所有的节点一定是以 / 开头
create /test‐node/test‐sub‐node
查看子节点信息,比如根节点下面的所有子节点, 加一个大写 R 可以查看递归子节点列表
ls /
- 查看 /test-node 下面所有的子节点
ls /test‐node
- 创建临时节点
create ‐e /ephemeral data
create 后跟一个 -e 创建临时节点 , 临时节点不能创建子节点
- 创建顺序节点,加参数 -s
create /seq‐parent data // 创建父目录
create ‐s /seq‐parent/ data // 创建顺序节点。顺序节点将再seq‐parent 目录下面,顺序递增
- 创建临时顺序节点
create ‐s ‐e /ephemeral‐node/前缀‐
- 创建容器节点
create ‐c /container
容器节点主要用来容纳字节点,如果没有给其创建子节点,容器节点表现和持久化节点一样,如果给容器节点创建了子节点,后续又把子节点清空,容器节点也会被zookeeper删除
三、事件监听机制
针对节点的监听:一定事件触发,对应的注册立刻被移除,所以事件监听是一次性的
get ‐w /path // 注册监听的同时获取数据
stat ‐w /path // 对节点进行监听,且获取元数据信息
针对目录的监听,目录的变化,会触发事件,且一旦触发,对应的监听也会被移除,后续对节点的创建没有触发监听事件
ls ‐w /path
针对递归子目录的监听
ls ‐R ‐w /path : ‐R 区分大小写,一定用大写
如下对/test 节点进行递归监听,但是每个目录下的目录监听也是一次性的,如第一次在/test 目录下创建节点时,触发监听事件,第二次则没有,同样,因为时递归的目录监听,所以在/test/sub0下进行节点创建时,触发事件,但是再次创建/test/sub0/subsub1节点时,没有触发事件
- Zookeeper事件类型
- None: 连接建立事件
- NodeCreated: 节点创建
- NodeDataChanged:节点数据变化
- NodeChildrenChanged:子节点列表变化
- DataWatchRemoved:节点监听被移除
- ChildWatchRemoved:子节点监听被移除