Zookeeper 基础



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

  • 架构
  • 分层命名空间
  • 会话
  • Watcher (观察器)

ZooKeeper 架构

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

Architecture of ZooKeeper

下表解释了 ZooKeeper 架构中每个组件。

组成部分 描述
客户端

客户端是分布式应用程序集群中的一个节点,它从服务器访问信息。在特定时间间隔内,每个客户端都会向服务器发送消息,以告知服务器客户端处于活动状态。

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

服务器 服务器是 ZooKeeper 集群中的一个节点,它为客户端提供所有服务。向客户端发送确认消息以告知服务器处于活动状态。
集群 (Ensemble) ZooKeeper 服务器组。形成集群所需的最小节点数为 3。
Leader (领导者) 服务器节点,如果任何连接的节点发生故障,它会执行自动恢复。领导者在服务启动时被选举产生。
Follower (跟随者) 遵循领导者指令的服务器节点。

分层命名空间

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

  • 在上图中,首先有一个根 **znode**,用“/”分隔。在根目录下,有两个逻辑命名空间 **config** 和 **workers**。

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

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

Hierarchical Namespace

ZooKeeper 数据模型中的每个 znode 都维护一个 **stat** 结构。stat 简单地提供 znode 的 **元数据**。它包含 *版本号、访问控制列表 (ACL)、时间戳和数据长度*。

  • **版本号** – 每个 znode 都有一个版本号,这意味着每次与 znode 关联的数据发生更改时,其对应的版本号也会增加。当多个 ZooKeeper 客户端尝试对同一 znode 执行操作时,版本号的使用非常重要。

  • **访问控制列表 (ACL)** – ACL 基本上是访问 znode 的身份验证机制。它控制所有 znode 的读写操作。

  • **时间戳** – 时间戳表示从 znode 创建和修改开始经过的时间。通常以毫秒表示。ZooKeeper 通过“事务 ID”(zxid)识别对 znode 的每次更改。**Zxid** 是唯一的,并为每个事务维护时间,以便您可以轻松识别从一个请求到另一个请求经过的时间。

  • **数据长度** – 存储在 znode 中的数据总量就是数据长度。您可以存储最多 1MB 的数据。

Znode 类型

Znode 分为持久性、顺序性和临时性三种。

  • **持久性 znode** – 即使创建该特定 znode 的客户端断开连接后,持久性 znode 也仍然存在。默认情况下,所有 znode 都是持久性的,除非另有指定。

  • **临时性 znode** – 临时性 znode 在客户端处于活动状态时有效。当客户端与 ZooKeeper 集群断开连接时,临时性 znode 会自动删除。因此,临时性 znode 不允许有子节点。如果临时性 znode 被删除,则下一个合适的节点将填充其位置。临时性 znode 在 Leader 选举中起着重要作用。

  • **顺序性 znode** – 顺序性 znode 可以是持久性的或临时性的。当创建一个新的顺序性 znode 时,ZooKeeper 会通过在其原始名称后面附加一个 10 位序列号来设置 znode 的路径。例如,如果将路径为 **`/myapp`** 的 znode 创建为顺序性 znode,ZooKeeper 将路径更改为 **`/myapp0000000001`** 并将下一个序列号设置为 0000000002。如果同时创建两个顺序性 znode,则 ZooKeeper 绝不会对每个 znode 使用相同的编号。顺序性 znode 在锁和同步中起着重要作用。

会话

会话对于 ZooKeeper 的操作非常重要。会话中的请求以 FIFO 顺序执行。客户端连接到服务器后,将建立会话并为客户端分配一个 **会话 ID**。

客户端在特定时间间隔内发送 **心跳** 以保持会话有效。如果 ZooKeeper 集群在服务启动时指定的时间段(会话超时)内没有收到客户端的心跳,它会判断客户端已死亡。

会话超时通常以毫秒表示。无论出于何种原因,当会话结束时,在此会话期间创建的临时性 znode 也将被删除。

Watcher (观察器)

Watcher (观察器) 是一种简单的机制,客户端可以使用它来获取有关 ZooKeeper 集群更改的通知。客户端在读取特定 znode 时可以设置 Watcher。对于任何 znode(客户端在其上注册)的更改,Watcher 都会向注册的客户端发送通知。

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

广告