zookerper介绍
ZooKeeper 是一个开源的分布式协调框架,主要用来解决分布式集群中应用系统的一致性问题.
ZooKeeper本质上是一个分布式的小文件存储系统(Zookeeper=文件系统+监听机制).提供基于类似于文件系统的目录树方式的数据存储,并且可以对树中的节点进行有效管理,从而用来维护和监控存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理、统一命名服务、分布式配置管理、分布式消息队列、分布式锁、分布式协调等功能。
安装
1.下载
// 下载地址
https://zookeeper.apache.org/releases.html
2.解压,复制配置文件
// 启动会默认读取文件zoo.cfg
cp zoo_sample.cfg zoo.cfg
3.启动zkserver
// 启动命令
bin/zkServer.sh start
// 启动日志
ZooKeeper JMX enabled by default
Using config: /Users/gy/java/apache-zookeeper-3.8.3-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
4.zkCli连接
// 客户端链接命令
bin/zkCli.sh
// 连接成功
mplete on server localhost/127.0.0.1:2181, session id = 0x10005ccbcd30000, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
客户端命令
// 显示所有客户端命令
help
// 查看节点
ls [-s] [-w] [-R] path
ls /path --查看当前znode子节点
ls -w /path --监听子节点变化
ls -s /path -- 查看节点状态信息
ls -R /path --表示递归获取
// 创建节点
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
-s : 创建有序节点
-e : 创建临时节点
-c : 创建一个容器节点。
t ttl : 创建一个TTL节点,-t时间(单位毫秒)
data:节点的数据,可选,如果不使用时,节点
数据就为null
acl:访问控制
// 获取节点数据信息.
get [-s] [-w] path
-s: 节点状态信息;
-w: 监听节点变化
// 设置节点数据
set [-s] [-v version] path data
-s:表示节点为顺序节点
-v: 指定版本号
// 获取节点的访问控制信息
getAcl [-s] path
-s: 节点状态信息
// 设置节点的访问控制列表
setAcl [-s] [-v version] [-R] path acl
-s:节点状态信息(时间戳、版本号、数据大小
等)
-v:指定版本号
-R:递归的设置
// 查看节点状态信息
stat [-w] path 查看节点状态信息
// 删除某一节点
delete [-v version] path
只能删除无子节点的节点。
-v: 表示节点版本号
// 递归的删除某一节点及其子节点
deleteall path
// 对节点增加限制
setquota -n|-b val path
n:表示子节点的最大个数
b:数据值的最大长度,-1表示无限制
节点分类
// 持久节点 persistent node
创建后会一直存储在ZooKeeper服务器上
create /pNode
// 临时节点 ephemeral node
创建临时节点后,若创建该节点的客户端异常超市或关闭后,该节点也会被删除.
create -e /eNode
// 有序节点 sequential node
在我们创建有序节点的时候会自动使用一个
单调递增的数字作为后缀。
create -s /sNode
// 容器节点 container node
当一个容器节点的最后一个子节点被删除后,容器节点也会被删除。
create -c /sNode
// TTL节点 ttl node
当一个TTL节点在 TTL 内没有被修改并且没有子节点,会被删除。注意:默认此功能不开启,需要修改配置文件extendedTypesEnabled=true,且TTL不能用于临时节点.
create -t 1000 /ttl_node
节点状态信息
// stat /test
cZxid = 0x1b // Znode事务id
ctime = Thu Jan 04 17:19:30 CST 2024 // Znode创建时间
mZxid = 0x1b // Znode被修改的事务id(与cZxid比较可以确定更新操作的顺序)
mtime = Thu Jan 04 17:19:30 CST 2024 // Znode最新更新时间
pZxid = 0x1c // 表示该节点子节点列表最后修改的事务id
cversion = 1 // Znode的版本号
dataVersion = 0 // 数据版本号
aclVersion = 0 // qcl版本号
ephemeralOwner = 0x0 // 若为临时节点,ephemeralOwner与session id绑定,其他都为0
dataLength = 0 // 数据长度
numChildren = 1 // 子节点数量
监听机制
Zookeeper中的watch机制,必须客户端先去服务端注册监听,这样事件发送才会触发监听,通知给客户端.监听的对象是事件.
// 事件类型
None: 连接建立事件
NodeCreated: 节点创建
NodeDeleted: 节点删除
NodeDataChanged:节点数据变化
NodeChildrenChanged:子节点列表变化
DataWatchRemoved:节点监听被移除
ChildWatchRemoved:子节点监听被移除
// Watch
watch是一次性的,一旦被触发就会移除,再次
使用时需要重新注册
// addWatch
永久性Watch.addWatch的作用是针对指定节点添加事件监听,支持两种模式:
PERSISTENT:持久化订阅,针对当前节点的修改和删除事件,以及当前节点的子节点的删除和新增事件。
PERSISTENT_RECURSIVE:持久化递归订阅(默认),在PERSISTENT的基础上,增加了子节点修改的事件触发,以及子节点的子节点的数据变化都会触发相关事件(满足递归订阅特性)
应用场景
ZooKeeper适用于存储和协同相关的关键数据,不适合用于大数据量存储。有了上述众多节点特性,使得 zookeeper 能开发不出不同的经典应用场景,比如:
注册中心、数据发布/订阅(常用于实现配置中心)、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁、分布式队列