ZooKeeper是一个分布式协调服务的开源框架。主要用来解决分布式集群中应用系统的一致性的问题,例如怎样避免同时操作同一数据造成脏读的问题。ZooKeeper本质上是一个分布式的小文件存储系统。提供基于类似于文件系统的目录树方式的数据存储,并且可以对树种 的节点进行有效管理里。从而来维护和监控你存储的数据的状态变化。将通过监控这些数据状态的变化,从而可以达到基于数据的集群管理。诸如:统一命名服务(dubbo)、分布式配置管理(solr的配置集中管理)、分布式消息队列(sub/pub)、分布式锁、分布式协调等功能。
Zookeeper架构图
image.png-
Leader:
ZooKeeper集群工作的核心
事务请求(写操作)的唯一调度和处理者,保证集群事务处理的顺序性;集群内部各个服务的调度者。
对于 create,setData,delete 等有写操作的请求,则需要统一转发给leader处理,leader需要决定编号、执行操作,这个过程称为一个事务。 -
Follower:
处理客户端非事务(读操作)请求
转发事务请求给Leader
参与集群leader选举投票2n-1台可以做集群投票此外,针对访问量比较大的zookeeper集群,还可以新增观察者角色
- Observer:
观察者角色,观察ZooKeeper集群的最新状态变化并将这些状态同步过来,其对于非事务请求可以进行独立处理,对于事务请求,则会转发给Leader服务器处理
不会参与任何形式的投票只提供服务,通常用于在不影响集群事务处理能力的前提下提升集群的非事务处理能力
扯淡:说白了就是增加并发的请求
ZooKeeper当中的主从与主备:
- 主从:主节点少,从节点多,主节点分配任务,从节点具体执行任务
- 主备:主节点与备份节点,主要用于解决我们主机节点挂掉以后,如何选出来一个新的主节点的问题,保证我们的主节点不会宕机
- 很多时候,主从与主备没有太明显的分界线,很多时候都是一起出现
Zookeeper的特性
- 全局数据的一致:每个server保存一份相同的数据副本,client无论链接到哪个server,展示的数据都是一致的
2.可靠性:如果消息被其中一台服务器接受,那么将被所有的服务器接受
3.顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有server上消息a豆浆在消息b前被发布,偏序是指如果以个消息b在消息a后被同一个发送者发布,a必须将排在b前面
4.数据更新院子性:一次数据更新要么成功,要么失败,不存在中间状态
5.实时性:ZooKeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息
三台机器ZooKeeper的集群环境搭建
ZooKeeper集群搭建指的是ZooKeeper集群分布式模式安装。通常由2n+1台server组成。这是因为为了保证Leader选举(基于Paxos算法的实现)能得到多数的支持 ,所以ZooKeeper集群的数量一般为奇数。ZooKeeper运行需要java环境,所以需要提前安装jdk
leader+follower模式的集群,大致过程如下
- 配置主机名称到IP地址映射配置
- 修改ZooKeeper配置文件
- 远程复制分发安装文件
- 设置myid
- 启动ZooKeeper集群
如果想要使用Observer模式,可在对应节点的配置文件添加如下配置:
peerType=observer
其次,必须在配置文件制定那些节点被制定为Observer,如:
server.1:localhost:2181:3181:observer
服务器IP 主机名 myid的值
192.168.131.131 node01 1
192.168.131.129 node02 2
192.168.131.130 node03 3
-
第一步:下载ZooKeeper的压缩包,下载网址如下
https://apache.org/dist我们在这个网址下载我们使用的ZooKeeper版本为3.4.9
下载完成之后,上传到我们的linux的/root/路径下准备安装- 第二部解压
解压ZooKeeper的压缩包到/root/路径下去,然后准备 安装
tar - zxvf zookeeper-3.4.9.tar.gz -C /root/ - 第三步 : 修改配置文件
第一台机器修改配置文件cd /zookeeper-3.4.9/conf cp zoo_sample.cfg zoo.cfg mkdir -p /root/file/apache-zookeeper-3.5.5/zkdatas vim zoo.cfg
- 第二部解压
image.png
- 第四步:添加myid配置
在第一台机器的 /root/file/apache-zookeeper-3.5.5/zkdatas/ 这个路径下创建一个文件,文件名为myid,文件内容为1echo 1 > /root/file/apache-zookeeper-3.5.5/zkdatas/myid
- 第五步:安装包分发并修改myid的值
安装包分发到其他机器
第一台机器上面执行以下两个命令
第二台机器上次改myid的值为2scp -r /root/file/apache-zookeeper-3.5.5/ node02:/root/file/ scp -r /root/file/apache-zookeeper-3.5.5/ node03:/root/file/
第三台机器上次改myid的值为2echo 2 > /root/file/apache-zookeeper-3.5.5/zkdatas/myid
echo 3 > /root/file/apache-zookeeper-3.5.5/zkdatas/myid
- 第六步:三台机器启动ZooKeeper服务
三台机器自动ZooKeeper服务
这个命令三台机器都要执行
查看启动状态/root/file/apache-zookeeper-3.5.5/bin/zkServer.sh start
/root/file/apache-zookeeper-3.5.5/bin/zkServer.sh status
- 第五步:安装包分发并修改myid的值
ZooKeeper的shell操作
- 客户端连接
bin/ckCli.sh 启动客户端
运行zKCli.sh sh 进入命令行工具
输入help,输出zk shell 提示: - shell 操作
创建节点
create [-s] [-e] path data acl
其中,-s或-e分别指节点特性,顺序或临时节点,若不指定,则表示持久节点,acl 用来进行权限控制# 创建顺序节点 create -s /test 123 # 创建临时节点 客户端一旦断开连接 临时节点消失 create -e /test-temp 123 # 创建永久节点 create /test-p 123p
读取节点 与读取相关的命令有ls 和 get 命令,可以列出ZooKeeper指定节点下的多有子节点,只能查看指定节点下的第一级的所有子节点,get命令可以获取ZooKeeper指定节点的数据内容和属性信息 ``` ls path [watch] get path [watch] ls2 path [watch] # data 就是要更新的新内容,version 表示数据版本 set path data [version] # 删除节点 delete path [version] # 递归的删除节点 Rmr path # 列出历史命令 history ```
ZooKeeper的数据模型
ZooKeeper的数据模型,在结构上和标准文件系统非常相似,拥有一个层次的命名空间,都是采用树形层次结构,ZooKeeper树种的每个节点被称为-Znode。和文件系统的目录树一样,ZooKeeper书中的每个节点都可以拥有子节点 但也有不同之处
1. Znode间距文件和目录两种特点 既像文件一样维护着数据 元信息 ACL 时间戳等数据结构 又像目录一样可以作为路径表示的一部分,并可以具有子 Znode。用户对Znode又增 、 删 、改 、 查 等操作,临时节点不能有子节点
2. Znode具有原子性操作,读操作将获取与节点相关的所有数据。写操作也将替换所有的数据。另外 每一个节点都拥有自己的ACL(访问控制列表)这个列表规定来了用户的权限。即限定来了特定用户对目标节点可以执行的操作
3. Znode 存储数据大小有限制,ZooKeeper虽然可以关联一些数据,但并没有 被设计为常规的数据库或者大数据存储,相反的是,它用来管理调度数据。比如分布式用用中的配置文件信息 状态信息 汇集位置等等 这些数据的共同特性就是他们都是很小的数据,通常以kb为大小单位。ZooKeeper 的服务器和客户端都被设计为严格检查并限制每个Znode的数据大小至多1M,常规使用中应该远小于此值
4.Znode通过路径引用,如同Unix中的文件路径 路径必须是绝对的,因此他们必须斜杠字符来开头
5.每个节点称为一个Znode,每个Znode有3部分组成
stat:此为状态新信息 描述Znode的版本 权限等信息
data:与改节点关联的数据
children:改Znode的下一个节点
6. 节点类型
节点类型分为 临时节点和永久节点
临时节点:该节点的生命周期依赖于创建他们的绘画,一旦绘画结束,临时节点将被自动删除,当然可以手动删除,临时节点不允许有自低点
永久节点:该节点的生命周期不依赖于会话,并且只有在客户端显示执行删除操作的时候,才会删除
Znode还有一个序列化的特性 如果创建的时候指定的话该Znode的名字后面会自动追加一个不断增加的序列号,序列号对于此节点的父节点来说是唯一的,这样会记录每个子节点创建的先后顺序
watch机制
一次性触发
时间发生触发监听 ,一个watcher event就会被发送到设置监听的客户端,这种效果是一次性的,后续再次发生同样的时间,不会再次触发
事件封装
ZooKeeper使用WatchedEvent对象来封装服务端事件并传递
WatchedEvent包含了每一个事件的三个基本属性:
通知状态(keeperState),事件类型(EventType)和节点路径(path)
event 异步发送
watcher 的通知事件从服务端发送到客户端是异步的
先注册再触发
ZooKeeper中 的watch机制,必须客户端先去 服务端注册监听,这样事件发送才会触发监听,通知给客户端
网友评论