Zookeeper - 基础知识


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

  • 建筑学
  • 分层命名空间
  • 会议
  • 手表

ZooKeeper的架构

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

ZooKeeper的架构

下表对属于 ZooKeeper 架构的每个组件进行了说明。

部分 描述
客户

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

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

服务器 服务器是 ZooKeeper 整体中的节点之一,为客户端提供所有服务。向客户端发出确认,通知服务器处于活动状态。
合奏 ZooKeeper 服务器组。形成集成所需的最小节点数为 3。
领导者 如果任何连接的节点发生故障,则执行自动恢复的服务器节点。领导者在服务启动时选举产生。
追随者 遵循领导者指令的服务器节点。

分层命名空间

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

  • 在图中,首先有一个用“/”分隔的根znode。在 root 下,您有两个逻辑命名空间configworkers

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

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

分层命名空间

ZooKeeper 数据模型中的每个 znode 都维护一个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 创建为顺序 znode 时,ZooKeeper 通过将 10 位数字的序列号附加到原始名称来设置 znode 的路径。例如,如果将路径为/myapp 的znode创建为顺序 znode,ZooKeeper 会将路径更改为/myapp0000000001并将下一个序列号设置为 0000000002。如果同时创建两个顺序 znode,则 ZooKeeper 永远不会使用相同的编号每个 znode。顺序 znode 在锁定和同步中发挥着重要作用。

会议

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

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

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

手表

监视是一种简单的机制,客户端可以获取有关 ZooKeeper 整体中的更改的通知。客户端可以在读取特定 znode 时设置监视。监视程序会向已注册的客户端发送任何 znode(客户端在其上注册)更改的通知。

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