1.概述
1.1.功能
zookeeper,Apache旗下一款分布式服务的协调、管理组件。主要有两个功能:
- 存储
- 通知
1.存储
zookeeper的存储,类似数据库,用来存放数据,其中存放的是一些数量不大但是很重要、全局都需要的信息,比如可以用来当做注册中心、存放各个服务的信息。
2.通知
客户端向zookeeper服务器进行注册,声明自己想要观察该zookeeper server的何种信息,成为该zookeeper server的观察者,一旦所要观察的信息有变化,zookeeper会向注册在案的该信息对应的观察者发送通知。
1.2.特点
zookeeper有两大特点:
- CP,强一致性、分区容错性。
- 自带负载均衡,每次对集群中的访问会自动映射到当前负载最小的节点上去。
1.3.数据结构
zookeeper的数据模型结构与Unix文件系统很类似,是一棵树,每个节点称为znode,每一个znode默认能存储1MB数据,每个znode通过唯一路径标识。
2.安装
2.1.Windows
下载:
直接在官网上下载压缩包,解压即可。
启动:
指令脚本在安装目录下的bin目录下,Windows的启动脚本是zkServer.cmd
启动会报错,因为缺少配置文件:
zookeeper启动时去config目录下扫描的配置文件名为zoo.cfg,而该目录下默认下载安装后只有一个zoo_sample.cfg,这是zookeeper官方给出的一个配置文件模板,可以直接将其改名为zoo.cfg即可正常启动zookeeper。
启动客户端:
启动zookeeper服务器后,启动客户端即可在客户端中使用指令来操作zookeeper。
2.2.Linux
Linux的配置文件示例:
tickTime:心跳时间,沟通间隔,单位,心跳个数。
initLimit:服务器启动时的同步阶段耗时,单位,心跳个数。
syncLimit:从发出一个通知到收到响应的等待时间,单位,心跳个数。
server.编号:集群配置,集群中编号唯一,与数据目录下的myid中的值对齐。
节点IP:通信端口:选举端口;服务端口。
3.基础操作
3.1.增
不能创建空节点,只能创建带数据的节点。
-e -s 可以混用,创建有序的临时节点。
3.2.删
3.3.改
3.4.查
查数据:
查状态:
- cZxid: 这是导致创建znode更改的事务ID.
- mZxid :这是最后修改znode更改的事务ID.
- oZxid:这是用于添加或删除了节点的znode更改的事务ID。
- ctime: 表示从1970-01-01T00:00:00Z开始以毫秒为单位的znode创建时间
- mtime: 表示从1970-01-01T00:00:00Z开始以毫秒为单位的znode最近修改时间。
- dataVersion: 表示对该znode的数据所做的更改次数
- cversion: 这表示对此znode的了节点进行的更改次数
- acIVersion: 表示对此znode的ACL进行更改的次数ephemeralOwner:如果znode是ephemera类型节点,则这是node所有者的 session D,如果ode不是ephemera#点,则该字段设置为零。
- dataLength: 这是znode数据字段的长度
- numChildren: 这表示znode的子节点的数量
3.5.监听
watch,监听机制, zookeeper通知功能的落地实现,Zookeeper 中非常重要的特性,我们基于 zookeeper 上创建的节点,可以对这些节点绑定监听事件。比如可以监听节点数据变更、节点变更、状态变更等事件,通过这个事件机制,可以实现基于 zookeeper的分布式锁、集群管理等功能。
当数据发生变化的时候, zookeeper 会产生一个 watcher 事件,并且会发送到客户端。但是客户端只会收到一次通知。如果后续这个节点再次发生变化,那么之前设置 watcher 的客户端不会再次收到消息(watcher 是一次性的操作),可以通过循环监听去达到永久监听效果 。
ls 路径 watch 监听该路径下子节点的变化
get 路径 watch 监听该路径下数据的变化
4.JAVA操作Zookeeper
4.1.依赖
版本号,自己确定一下,这里博主用的3.5.8而已:
<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.5.8</version> </dependency>
4.2.客户端
构造函数有三个参数:
- 连接地址,zookeeper的IP地址
- 会话超时时间,超过此时间server没有收到client的心跳会断开会话,清理该会话的临时数据。
- watch通知,watch的数据有变的时候返回的通知。
4.3.增
三个参数:
- path:路径
- data:数据
- ACL机制:使用zookeeper API中自带的枚举类CreateMode:创建临时节点还是永久节点(-e 还是 -s),使用zookeeper API中自带的枚举类
4.4.删
zooKeeper.delete(znodePath, -1);
在 ZooKeeper 中,当删除一个 znode(节点)时,需要传递一个版本号作为版本检查的条件。这个版本号用来确保在删除操作执行时,znode 的版本和指定的版本号是一致的。如果版本号不匹配,删除操作将会失败。
在删除方法 zooKeeper.delete(znodePath, version) 中,第二个参数 version 是用来指定要删除的 znode 的版本号。当 version 参数设置为 -1 时,表示不执行版本检查,即忽略 znode 的版本,直接删除该 znode。这意味着无论 znode 的版本是什么,都会被删除。
4.5.查
查节点:
查数据:
查状态:
4.6.改
version,版本号,要与dataVersion严格对齐,
可以查状态获得版本号,
修改成功后dataVersion会自加1。