1. zooKeeper 概述

ZooKeeper 概述

ZooKeeper 是一个用于分布式应用的分布式、开源的协调服务。它开放了一套简单的函数,分布式应用可以在此之上为上层服务实现分布式同步、配置维护、组服务、命名等功能。它使用了一个类似于目录树结构的文件系统作为数据模型,易于编程。它运行在java上,而且已经有了Java和C的客户端。

众所周知,协调服务是很难正确实现的。它们很容易出现条件竞争和死锁等错误。ZooKeeper 出现的目的就是解除为分布式应用实现协调服务的痛点。

Zookeeper 现由Apache 开源管理,是 Apache Hadoop 的一个子项目,后面被提升为Apache的顶级项目

《1. zooKeeper 概述》 ZooKeeper service

特性

  • Sequential Consistency(顺序一致性):按照客户端的发送顺序进行更新。
  • Atomicity(原子性):更新或成功或失败,不会有中间态的结果。
  • Single System Image(单一系统镜像):无论客户端或服务器,连接到服务端后都能看到同样的视图。
  • Reliability(可靠性):一旦应用一个更新,它将留存到客户端覆盖本次更新为止。
  • Timeliness(时效性):在一段时间内保证系统的客户端视图是最新的。

watches(监听)

ZooKeeper 支持watches 的概念. 客户端可以在Znodes上设一个watch 。znode 改变时会触发或删除watch。当watch 被触发时,客户端会收到一个“znode已被改变”的包。并且,如果客户端和一个ZooKeeper服务器之间的连接中断时,客户端也会收到一个本地通知。

三角色

  • Leader(领导者) : 负责更新系统状态,进行投票(选举leader)的发起和决议。

  • Follower(跟随者) : 用于接收客户端请求并向客户端返回处理请求的结果,在选举过程中参与投票

  • Observer(观察者) : 可以接收客户端的连接,将写请求转发给Leader系诶的那,但Observer不参加投票过程,只同步Leader的状态。Observer的目的是为了扩展系统,提高读取速度。

数据模型和分层命名空间

ZooKeeper 提供的命名空间非常像标准的文件系统。名字是路径元素通过斜杠(/)分割的序列。 ZooKeeper 命名空间中的每个节点都是一个唯一的路径

《1. zooKeeper 概述》 ZooKeeper 层级命名空间

节点以及临时节点

与标准的文件系统不同,ZooKeeper 命名空间中的每个节点都存有与子节点相关的数据。它就像一个文件系统允许文件变成一个目录。(ZooKeeper 为存储协调数据而设计:状态信息、配置信息、路径信息等,因此每个节点存储的数据通常都很小,量级在B到KB之间。)我们用术语znode 来指ZooKeeper 数据节点。

Znodes 的数据结构中包括:数据变更的版本号、ACL 变更以及时间戳,以便缓存验证和协调更新。每次znode数据改变,版本号递增。例如,每当客户端收到数据,它将同时收到数据的版本。

命名空间中znode存储的数据是被原子性读写的。读操作可以获得Znode相关的全部数据,写操作将覆盖全部数据。每个及诶单有一个权限控制列表( Access Control List ,ACL)来限制什么人可以干什么事。

ZooKeeper 也有临时节点的概念. 这些节点存在时间与会话一致,会话创建时znode生效。当会话结束时Znode被删除。

节点类型

ZooKeeper 有四种节点类型

节点类型说明
PERSISTENT持久化节点
PERSISTENT_SEQUENTIAL持久化自增序列节点,这种节点会根据当前已存在的节点数自增 1(从 0000000000 开始)
EPHEMERAL临时节点, 客户端session超时或断开连接时这类节点就会被自动删除(稍有延时)
EPHEMERAL_SEQUENTIAL临时自增序列节点

节点属性

查看节点属性 stat path 比如:stat /node_1

cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x700000015
cversion = 10
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 4
节点属性说明
cZxid数据节点创建时的事务ID
ctime数据节点创建时的时间
mZxid数据节点最后一次更新时的事务ID
mtime数据节点最后一次更新时的时间
pZxid数据节点的子节点列表最后一次被修改(是子节点列表变更,而不是子节点内容变更)时的事务ID
cversion子节点的版本号
dataVersion数据节点的版本号
aclVersion数据节点的ACL版本号
ephemeralOwner如果节点是临时节点,则表示创建该节点的会话的SessionID;如果节点是持久节点,则该属性值为0
dataLength数据内容的长度
numChildren数据节点当前的子节点个数
点赞