Zookeeper
Zookeeper的概述
Zookeeper是一个开源的分布式协调服务框架,主要用来解决分布式集群中应用系统的一致性问题和数据管理问题
Zookeeper的特点
Zookeeper本质上是一个分布式文件系统,适合存放小文件,也可以理解为一个数据库
Zookeeper的架构
Zookeeper集群是一个基于主从架构的高可用集群
每个服务器承担如下三种角色中的一种
Leader 一个Zookeeper集群同一时间只会有一个实际工作的Leader,它会发起并维护与各Follwer及Observer间的心跳。所有的写操作必须通过Leader完成再由Leader将写操作广播给其他服务器
Follower 一个Zookeeper集群可能同时存在多个Follower,它会响应Leader的心跳,Follower可直接处理并返回客户端的读请求,同时会将写请求转发给Leader处理,并且负责在Leader处理写请求时对请求进行投票
Observer角色与Follower类似,但是无投票权。
Zookeeper安装过程
第一步:下载Zookeeper安装包
第二步:解压
解压zookeeper的压缩包到/export/server路径下去,然后准备进行安装
cd /export/software
tar -zxvf zookeeper-3.4.9.tar.gz -C ../servers
修改配置文件
cd /export/servers/zookeeper-3.4.9/conf/
cp zoo_sample.cfg zoo.cfg
mkdir -p /export/servers/zookeeper-3.4.9/zkdatas/
vim zoo.cfg
dataDir=/export/servers/zookeeper-3.4.9/zkdatas
# 保留多少个快照
autopurge.snapRetainCount=3
# 日志多少小时清理一次
autopurge.purgeInterval=1
# 集群中服务器地址
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888
第四步:添加myid配置
在第一台机器的
/export/servers/zookeeper-3.4.9/zkdatas/这个路径下创建一个文件,文件名为myid,文件内容为1
echo 1 > /export/servers/zookeeper-3.4.9/zkdatas/myid
第五步:安装包分发并修改myid的值
scp -r /export/servers/zookeeper-3.4.9/ node02:/export/servers/
scp -r /export/servers/zookeeper-3.4.9/ node03:/export/servers/
第二台机器上修改myid的值为2
echo 1 > /export/servers/zookeeper-3.4.9/zkdatas/myid
第二台机器上修改myid的值为3
第六步:三台机器启动zookeeper服务
三台机器启动zookeeper服务
这个命令三台机器都要执行
/export/servers/zookeeper-3.4.9/bin/zkServer.sh start
查看启动状态
/export/servers/zookeeper-3.4.9/bin/zkServer.sh status
zookeeper的数据模型
Zookeeper的数据模型,在结构上和标准文件系统的非常相似,拥有一个层次的命名空间。都是采用树形层次结构
Zookeeper树中的每个结点都被称为一个Znode,和文件系统的目录树一样,Zookeeper树中的每个结点可以拥有子节点。
但也有不同之处
Znode兼具文件和目录两种特点
Znoded村数据大小有限制
Znode通过路径引用,路径必须是绝对的
每个Znode由三个部分组成
stat:此状态为
data
children
Zookeeper的Shell客户端操作
登录Zookeeper
先进入安装目录
bin/zkCli.sh -server node01:2181
# node01是主机名
# 2181是端口号
Zookeeper客户端操作命令
命令 | 说明 | 参数 |
---|
create [-s] [-e] path data acl | 创建Zonde | -s指定是顺序结点 -e指定是临时节点 | ls path [watch] | 列出Path下所有的Znode | | get path [watch] | 获取Path对应的Znode的数据和属性 | | ls2 path [watch] | 查看Path下所有的Znode一起子Znode的属性 | | set path data [version] | 更新结点 | version数据版本 | delete path[version] | 删除结点,如果要删除的节点有子节点,则无法删除 | version数据版本 | rmr path | 删除结点,如果有子Znode则递归删除 | | setquota -n|-b val path | 修改Znode配额 | -n设置子节点最大个数 -b设置节点数据最大长度 | history | 列出历史记录 | |
操作实例
列出Path下的所有的Znode
ls /
创建永久节点
# 在当前目录下创建一个hello 目录 携带的参数是 world
create /hello world
创建临时结点
create -e /abc 123
创建永久序列化节点:
create -s /zhangsan boy
创建临时序列化节点
create -e -s /lisi boy
修改节点数据
set /hello zookeeper
删除结点,如果要删除的节点有子Znode则无法删除
delete /hello
删除结点,如果有子Znode则递归删除
rmr /abc
列出历史记录
history
节点属性
每个Znode都包含了一系列的属性,通过命令get,可以获得节点的属性
dataVersion:数据版本号,每次对节点进行set操作,dataVersion的值都会增加1(即使设置的是相同的数据),可有效避免了数据更新时出现的先后顺序的问题
cversion:子节点的版本号,当znode的子节点有变化时,cversion的值就会增加1
aclVersion:ACL的版本号
cZxid:Znode创建的事物id。
mZxid:Znode被修改的事物id,即每次对id进行修改都会更新mZxid
- 对于zk来说,每次的变化都会产生一个唯一的事物id,zxid(ZooKeeper Transaction Id)。通过zxid,可以确定更新操作的先后顺序,如果zxid1小于zxid2,说明zxid1操作先与zxid2发生,zxid对于整个zk都是唯一的
time:节点创建时的时间戳
mtime:节点最新一次更新发生时的时间戳
ephemeralOwner:如果该节点为临时结点,ephemeralOwner值表示与该节点绑定的session id.如果不是,ephemeralOwner值为0
Zookeeper的watch机制
- 通知类似于数据库中的触发器,对某个Znode设置Watcher,当Znode发生变化的时候,WatchManager会调用对应的Watcher
- 当Znode发生删除,修改,创建,子节点待修改的时候,对应的Watcher会得到通知
Watcher的特点:
- 一次性触发一个Watcher只会触发一次,如果需要继续监听,则需要再吃添加Watcher
- 事件封装:Watcher得到的事件是被封装过的,包括三个内容keeperState.eventType,path
Zookeeper的Java的JAVAAPI操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0DSATJAO-1628908948738)(C:\Users\WANG\AppData\Roaming\Typora\typora-user-images\image-20210813163316729.png)]
节点的操作
创建永久节点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aAWNGeI0-1628908948741)(C:\Users\WANG\AppData\Roaming\Typora\typora-user-images\image-20210813163621546.png)]
创建临时节点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uHsJH4WG-1628908948742)(C:\Users\WANG\AppData\Roaming\Typora\typora-user-images\image-20210813181343690.png)]
注意:临时节点close之后就会消失
修改节点数据
节点下面添加数据与修改是类似的,一个节点下面会有一个数据,新的数据会覆盖旧的数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kLYiKsSk-1628908948745)(C:\Users\WANG\AppData\Roaming\Typora\typora-user-images\image-20210813182034647.png)]
节点数据查询
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jqZeL1Sg-1628908948745)(C:\Users\WANG\AppData\Roaming\Typora\typora-user-images\image-20210813182451912.png)]
节点watch机制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dTcYLZLH-1628908948746)(C:\Users\WANG\AppData\Roaming\Typora\typora-user-images\image-20210813182757756.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8qrYVXxx-1628908948747)(C:\Users\WANG\AppData\Roaming\Typora\typora-user-images\image-20210813182926249.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ri1bE9R9-1628908948747)(C:\Users\WANG\AppData\Roaming\Typora\typora-user-images\image-20210813183828644.png)]
会覆盖旧的数据
[外链图片转存中…(img-kLYiKsSk-1628908948745)]
节点数据查询
[外链图片转存中…(img-jqZeL1Sg-1628908948745)]
节点watch机制
[外链图片转存中…(img-dTcYLZLH-1628908948746)]
[外链图片转存中…(img-8qrYVXxx-1628908948747)]
[外链图片转存中…(img-ri1bE9R9-1628908948747)]
|