zookeeper

197 阅读6分钟

zookeeper致力于为分布式应用提供一个高性能,高可用,具有严格顺序访问控制能力的分布式协调服务。

zookeeper将全量数据存储在内存中,并直接服务与客户端的所有非事务请求,尤其适合用于以读为主的应用场景。

对于客户端的每一个更新请求,Zookeeper都会分配一个全局唯一的递增编号,这个编号反映了所有事物操作的先后顺序。

Zookeeper的数据模型

Zookeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一颗树,每一个节点称做一个ZNode。每一个Znode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识。

zookeeper节点类型

临时节点 :该节点的生命周期依赖于创建他们的回话。一旦会话(Session)结束,临时节点将会被自动删除,每个临时的ZNode都会绑定到一个客户端回话,但他们对所有的客户端还是可见的。Zookeeper的临时节点不允许拥有子节点

持久化节点:该节点的生命周期不依赖于会话,并且只有在客户点显示执行删除操作的时候,他们才能被删除。

单机安装

# 底层依赖jdk,先安装jdk
# 将安装包上传至/opt/zookeeper
# 解压jar包
tar -xzvf zookeeper-3.4.10.tar.gz
# 创建配置文件
cd /opt/zookeeper/apache-zookeeper-3.5.10-bin/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
修改目录,此路径用于存储zookeeper中数据的内存快照,及事务日志文件
## example sakes.
## dataDir=/opt/zookeeper/zkdata

配置文件

1、tickTime:

通信心跳数,Zookeeper 服务器心跳时间,单位毫秒

ZooKeeper 使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时

间就会发送一个心跳,时间单位为毫秒。

它用于心跳机制,并且设置最小的 session 超时时间为两倍心跳时间.(session 的最小超时时间是 2*tickTime。)

2、initLimit:

这个配置项是用来配置 ZooKeeper 接收 Follower 客户端(这里所说的客户端不是用户链接 Zookeeper 服务

器的客户端,而是 ZooKeeper 服务器集群中连接到 leader 的 Follower 服务器,Follower 在启动过程中,会从 Leader

同步所有最新数据,然后确定自己能够对外服务的起始状态。Leader 允许 Follower 在 initLimit 时间内完成这

个工作)初始化连接是最长能忍受多少个心跳的时间间隔数。

当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端返回的信息,那么

表明这个客户端连接失败。总的时间长度就是 10*2000=20 秒

3、syncLimit:

LF 同步通信时限。集群中 Leader 与 Follower 之间的最大响应时间单位。

在运行过程中,Leader 负责与 ZK 集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活

状态,

假如响应超过 syncLimit * tickTime(假设 syncLimit=5 ,请求和应答时间长度,最长不能超过多少个 tickTime 的时

间长度,总的时间长度就是 5*2000=10 秒。),Leader 认为 Follwer 死掉,从服务器列表中删除 Follwer。

4、dataDir:

数据文件目录+数据持久化路径。

保存内存数据库快照信息的位置,如果没有其他说明,更新的事务日志也保存到数据库。

5、clientPort:

客户端连接端口,监听客户端连接的端口。

集群安装

blog.csdn.net/qq_35568099…

zab协议的全称是Zookeeper Atomic Broadcast (zookeeper原子广播)。zookeeper是通过zab协议来保证分布式事务的最终一致性

主要角色

1.Leader

  它是Zookeeper集群工作的核心,也是事务性请求(写操作)的唯一调度和处理者,它保证集群事务处理的顺序性,同时负责进行投票的发起和决议,以及更新系统状态。

2.Follower

  它负责处理客户端的非事务(读操作)请求,如果接收到客户端发来的事务性请求,则会转发给Leader,让Leader进行处理,同时还负责在Leader选举过程中参与投票。

3.Observer

  它负责观察Zookeeper集群的最新状态的变化,并且将这些状态进行同步。对于非事务性请求可以进行独立处理;对于事务性请求,则会转发给Leader服务器进行处理。它不会参与任何形式的投票,只提供非事务性的服务,通常用于在不影响集群事务处理能力的前提下,提升集群的非事务处理能力(提高集群读的能力,也降低了集群选主的复杂程度)。

命令

./zkServer.sh start 开启服务
./zkServer.sh stop 关闭服务
./zkCli.sh  启动客户端 
quit 退出

shell命令

create [-s] [-e] path data 创建节点(-s 有序节点  -e 临时节点)
set path [version] (当你传入的数据版本号(dataVersion)和当前节点的数据版本号不符合时,zookeeper会拒绝本次修改:)
delete path [version] 当你传入的数据版本号(dataVersion)和当前节点的数据版本号不符合时,zookeeper会拒绝本次修改:
要想删除某个节点及其所有后代节点,可以使用递归删除,命令为 rmr path。
get path 查看节点
stat path 查看节点状态
ls / 查看节点列表
get path [watch] 监听器 (使用get path [watch] 注册的监听器能够在节点内容发生改变的时候,向客户点发出通知。需要注意的是zookeeper的触发器是一次性的(One-time trigger),触发一次后就会立即失效。)
stat path [watch] 使用stat path [watch] 注册的监听器能够在节点抓哪个台发生改变的时候,向客户点发出通知。
ls\ls2 path [watch] 使用 ls path [watch] 或者 ls2 path [watch] 注册的监听器能够监听该节点下所有子节点的增加和删除操作。

节点各个属性

ZooKeeper节点的每一个更改都具唯一的Zxid,如果Zxid1小于Zxid2,则Zxid1的更改发生在Zxid2更改之前。

image.png

客户端用该遵循以下步骤,与zookeeper服务器进行清洗和干净的交互。

  • 连接到zookeeper服务器。zookeeper服务器为客户端分配回话ID。
  • 定期向服务器发送心跳。否则,zookeeper服务器将过期回话ID,客户端需要重新连接。
  • 只要回话ID处于活动状态,就可以获取/设置znode。
  • 所有任务完成后,断开与zookeeper服务器的连接。如果客户端长时间不活动,则zookeeper服务器将自动断开客户端。

zookeeper事件监听机制

zookeeper采用了watcher机制实现数据的发布/订阅功能。该机制在被订阅对象发生变化时会异步通知客户端,因此客户端不必在Watcher注册后轮询阻塞,从而减轻了客户点压力。

image.png

baijiahao.baidu.com/s?id=169838…

www.cnblogs.com/jiaojiner/p… baijiahao.baidu.com/s?id=169838…