Ch01-Zookeeper 介绍

Ch01-Zookeeper 介绍

April 1, 2018
Apache Zookeeper
zookeeper

Apache ZooKeeper 是由 Apache Hadoop 的子项目发展而来,于 2010 年 11 月正式成为了 Apache 的顶级项目。ZooKeeper 是一个正式源代码的分布式协调服务,由知名互联网公司雅虎创建,是 Google Chubby 的开源实现。

ZooKpeer 是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。

1. 基本信息 #

条目 说明
官网 https://zookeeper.apache.org/
下载地址 https://zookeeper.apache.org/releases.html

2. 架构介绍 #

2.1 相关角色 #

zk-arch

ZooKeeper 集群中包含 Leader、Follower 以及 Observer 三个角色,每个节点只能是其中的某一个角色。

角色 说明
Leader 负责进行投票的发起和决议,更新系统状态,Leader 是由选举产生。
Follower 用于接受客户端请求并向客户端返回结果,在选主过程中参与投票。
Observer 可以接受客户端连接,接受读写请求,写请求转发给 Leader。但 Observer 不参加投票过程,只同步 Leader 的状态,Observer 的目的是为了扩展系统,提高读取速度。

2.2 服务状态 #

ZooKeeper 的每个节点在某个时间段会处于某个指定状态,目前常见的有下述 4 种状态。

状态 说明
Looking 寻找 Leader 状态。当服务器处于该状态时,它会认为集群中没有 Leader,因此需要进入 Leader 选举流程
Following 跟随者状态,表明当前服务器角色是 Follower。Follower 与 Leader 处于数据同步阶段
Leading 领导者状态,表明当前服务器角色是 Leader。前集群中有一个 Leader 为主进程
Observing 观察者状态,表明当前服务器角色是 Observer。

2.3 数据模型 #

Zookeeper 通过一个共享的、树型结构的名字空间来进行相互协调。这个命名空间由若干个 ZNode 组成。

zk-model

ZNode 可以分为持久节点(PERSISTENT)临时节点(EPHEMERAL)

  • 持久节点是指一旦这个 ZNode 被创建了,除非主动进行 ZNode 的移除操作,否则 ZNode 将一直保存在 ZooKeeper 上。
  • 临时节点的生命周期会和客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的临时节点就会被移除。
  • 如果给持久节点和临时节点加上顺序特性,又可以形成持久顺序节点和临时顺序节点。

3. 机制介绍 #

3.1 事务 #

在 ZooKeeper 中,事务是指能够改变 ZooKeeper 服务器状态的操作,我们也称为事务操作和更新操作,一般包括数据节点创建与删除、数据节点内容更新和客户端会话失效操作等。 对于每一个事务请求,ZooKeeper 都会为其分配一个全局唯一的事务 ID,用 ZXID 表示,每一个 ZXID 对应一次更新操作,从这些 ZXID 中可以间接地识别出 ZooKeeper 处理这些更新操作请求的全局顺序。

3.2 状态信息 #

每个数据节点除了存储了数据内容之外,还存储了数据节点本身的一些状态信息。使用 get 命令便可以查看。

状态属性 说明
czxid 即 Created ZXID,表示该数据节点被创建时的事务 ID
mzxid 即 Modified ZXID,表示该节点最后一次被更新时的事务 ID
ctime 即 Created Time,表示节点被创建的时候
mtime 即 Modified Time,表示该节点最后一次被更新的时间
version 数据节点的版本号
cversion 子节点的版本号
aversion 节点的 ACL 版本号
ephemeralOwner 创建该临时节点的会话的 sessionID。如果该节点是持久节点,那么这个属性值为 0。
dataLength 数据内容的长度
numChildren 当前节点的子节点个数
pzxid 表示该节点的子节点列表最后一次被修改时的事务 ID。注意,只有子节点列表变更了才会变更 pzxid,子节点内容变更不会影响 pzxid

3.3 版本机制 #

每个 ZNode 节点都有三种类型的版本信息,对数据的任何操作都会引起版本的变化。不过这里要注意,虽然称为版本,但是叫做次数可能更加符合实际用途,它表示的是 数据内容,子节点,ACL 信息的修改次数。

版本类型 说明
version 当前数据节点数据内容的版本号
cversion 当前数据节点子节点的版本号
aversion 当前数据节点 ACL 变更版本号

3.4 Watcher 机制 #

ZooKeeper 提供了分布式数据的发布/订阅功能,Watcher 机制则完成了分布式通知功能。它允许客户端向服务器端注册一个 Watcher 监听,当服务端的一些指定事件触发了这个 Watcher,那么就会向指定客户端发送一个事件通知,这样就实现了分布式的通知功能。

4. 参考文献 #

Zookeeper 集群如何高可用部署?