Zookeeper - 工作原理

在深入了解 ZooKeeper 的工作原理之前,让我们先了解一下 ZooKeeper 的基本概念。 我们将在本章中讨论以下主题 −

  • 架构
  • 分层命名空间
  • 会话
  • 监控

ZooKeeper 的架构

请看下图。 它描述了 ZooKeeper 的"客户端-服务器架构"。

ZooKeeper 的体系结构

作为 ZooKeeper 体系结构一部分的每个组件都已在下表中进行了解释说明。

部分 描述
Client

客户端,我们分布式应用程序集群中的节点之一,从服务器访问信息。 在特定的时间间隔内,每个客户端都会向服务器发送一条消息,让服务器知道客户端还活着。

同样,当客户端连接时,服务器会发送确认。 如果连接的服务器没有响应,客户端会自动将消息重定向到另一个服务器。

Server 服务端,是 ZooKeeper 集合中的节点之一,为客户端提供所有服务。 向客户端确认以通知服务器处于活动状态。
Ensemble ZooKeeper 服务器组。 组成一个集合所需的最小节点数为 3。
Leader 如果任何连接的节点失败,则执行自动恢复的服务器节点。 Leaders 是在服务启动时选出的。
Follower 遵循 leader 指令的服务器节点。

分层命名空间

下图描述了用于内存表示的 ZooKeeper 文件系统的树形结构。 ZooKeeper 节点称为 znode。 每个 znode 都由一个名称标识,并由一系列路径 (/) 分隔。

  • 在图中,首先您有一个以"/"分隔的根 znode。 在根目录下,您有两个逻辑命名空间 configworkers

  • config 命名空间用于集中配置管理,workers 命名空间用于命名。

  • config 命名空间下,每个 znode 最多可以存储 1MB 的数据。 这类似于 UNIX 文件系统,只是父 znode 也可以存储数据。 这个结构的主要目的是存储同步数据和描述znode的元数据。 这种结构称为 ZooKeeper 数据模型

分层命名空间

ZooKeeper 数据模型中的每个 znode 都维护一个 stat 结构。 stat 只是提供 znode 的 元数据。 它由版本号、动作控制列表(ACL)、时间戳和数据长度组成。

  • 版本号 − 每个 znode 都有一个版本号,这意味着每次与 znode 关联的数据发生变化时,其对应的版本号也会增加。 当多个 Zookeeper 客户端尝试在同一个 znode 上执行操作时,版本号的使用很重要。

  • 操作控制列表 (ACL) − ACL 基本上是一种用于访问 znode 的身份验证机制。 它管理所有 znode 读写操作。

  • 时间戳 − 时间戳表示从 znode 创建和修改经过的时间。 它通常以毫秒为单位。 ZooKeeper 从"事务 ID"(zxid)中识别对 znode 的每一次更改。 Zxid 是唯一的,并为每个事务维护时间,以便您可以轻松识别从一个请求到另一个请求所用的时间。

  • 数据长度 − 一个znode中存储的数据总量就是数据长度。 您最多可以存储 1MB 的数据。

Znode 的类型

Znodes 分为持久性、顺序性和临时性。

  • 持久节点 − 即使在创建该特定 znode 的客户端断开连接后,持久性 znode 仍然是活动的。 默认情况下,除非另有说明,否则所有 znode 都是持久的。

  • 临时节点 − 临时 znode 一直处于活动状态,直到客户端处于活动状态。 当客户端与 ZooKeeper 集合断开连接时,临时 znode 会自动删除。 出于这个原因,只有短暂的 znode 不允许再有孩子。 如果一个临时 znode 被删除,那么下一个合适的节点将填补它的位置。 临时znodes在Leader选举中扮演着重要的角色。

  • 顺序节点 − 顺序 znode 可以是持久的或短暂的。 当一个新的 znode 作为顺序 znode 创建时,ZooKeeper 通过将 10 位序列号附加到原始名称来设置 znode 的路径。 例如,如果将路径为 /myapp 的 znode 创建为顺序 znode,ZooKeeper 会将路径更改为 /myapp0000000001 并将下一个序列号设置为 0000000002。如果两个 顺序 znode 是同时创建的,然后 ZooKeeper 永远不会为每个 znode 使用相同的编号。 顺序 znode 在锁定和同步中起着重要作用。


Sessions 会话

会话对于 ZooKeeper 的运行非常重要。 会话中的请求按 FIFO 顺序执行。 一旦客户端连接到服务器,会话将被建立,并且 session id 被分配给客户端。

客户端以特定的时间间隔发送 heartbeats 以保持会话有效。 如果 ZooKeeper 集合在服务启动时指定的时间段(会话超时)内没有收到来自客户端的心跳,则它决定客户端死亡。

会话超时通常以毫秒表示。 当会话因任何原因结束时,在该会话期间创建的临时 znode 也会被删除。


Watches 监视

Watches 是客户端获取有关 ZooKeeper 集合中更改的通知的简单机制。 客户端可以在读取特定 znode 时设置监视。 对于任何 znode(客户端注册的)更改,Watches 向已注册的客户端发送通知。

Znode 更改是与 znode 关联的数据的修改或 znode 子节点的更改。 监视只触发一次。 如果客户端再次需要通知,则必须通过另一个读取操作来完成。 当连接会话过期时,客户端将与服务器断开连接,并且关联的监视也将被删除。