Zookeeper 简明教程

Zookeeper - Fundamentals

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

  1. Architecture

  2. Hierarchical namespace

  3. Session

  4. Watches

Architecture of ZooKeeper

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

architecture of zookeeper

ZooKeeper 架构的一部分的每个组件在以下表格中都有说明。

Part

Description

Client

客户机,作为分布式应用程序集群中的节点之一,从服务器访问信息。对于特定时间间隔,每个客户端会向服务器发送一条消息来让服务器知道该客户端是活动的。类似地,当客户端连接时,服务器会发送确认。如果连接的服务器没有响应,则客户端会自动将消息重定向到另一台服务器。

Server

服务器,作为 ZooKeeper 集群中的节点之一,向客户端提供所有服务。向客户端发送确认以通知其服务器是活动的。

Ensemble

ZooKeeper 服务器组。要形成集群所需的最小节点数为 3。

Leader

如果任何连接的节点发生故障,则执行自动恢复的服务器节点。领导者在服务启动时被选出。

Follower

遵循领导者指令的服务器节点。

Hierarchical Namespace

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

  1. 在图表中,您首先有一个根 znode ,用“/”分隔。在根下,您有两个逻辑名称空间 configworkers

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

  3. config 命名空间下,每个 znode 可以最多存储 1MB 的数据。这与 UNIX 文件系统类似,但不同之处在于父 znode 也能存储数据。这种结构的主要目的是为了存储同步数据并描述 znode 的元数据。该结构被称为 ZooKeeper Data Model

hierarchical namespace

ZooKeeper 数据模型中的每个 znode 都维护一个 stat 结构。一个状态信息简单地提供了 znode 的 metadata 。它包括版本号、操作控制列表 (ACL)、时间戳和数据长度。

  1. Version number − 每个 znode 有一个版本号,这意味着与 znode 关联的数据每次更改时,其相应的版本号也会增加。当多个 zookeeper 客户端尝试对同一个 znode 执行操作时,使用版本号很重要。

  2. Action Control List (ACL) − ACL 基本上是一种访问 znode 的身份验证机制。它管理所有 znode 的读取和写入操作。

  3. Timestamp − 时间戳表示从 znode 的创建和修改开始经过的时间。它通常以毫秒为单位表示。ZooKeeper 会通过“事务 ID”(zxid)识别对 znode 进行的每次更改。 Zxid 是唯一的,并为每个事务记录时间,这样便于轻松识别从一个请求到另一个请求之间经过的时间。

  4. Data length − znode 中存储的数据总量就是数据长度。您可以最多存储 1MB 的数据。

Types of Znodes

znode 被归类为持久性、顺序性和临时性。

  1. Persistence znode − 持久性 znode 即使创建它的客户端断开连接后仍然存在。默认情况下,所有 znode 都是持久性的,除非另有指定。

  2. Ephemeral znode − 临时 znode 在客户端处于活动状态时是处于活动状态的。当客户端与 ZooKeeper 集群断开连接时,临时 znode 将被自动删除。出于此原因,不允许只有临时 znode 再有子 znode。如果一个临时 znode 被删除,那么下一个合适的节点将填补它的位置。临时 znode 在领导者选举中发挥着重要作用。

  3. Sequential znode − 顺序 znode 可以是持久性的,也可以是临时的。当创建一个新 znode 为顺序 znode 时,ZooKeeper 通过将一个 10 位的序列号附加到原始名称来设置 znode 的路径。例如,如果路径为 /myapp 的 znode 被创建为顺序 znode,ZooKeeper 将把路径更改为 /myapp0000000001 ,并将下一个序列号设置为 0000000002。如果同时创建两个顺序 znode,那么 Zookeeper 永远不会为每个 znode 使用相同的号码。顺序 znode 在锁定和同步中发挥着重要作用。

Sessions

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

客户端在特定时间间隔发送 heartbeats 以保持会话有效。如果 ZooKeeper 集群未从客户端收到心跳时间超过在服务启动时指定的周期(会话超时),它将判定客户端已死亡。

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

Watches

监控器是一种简单的机制,供客户端获得 ZooKeeper 集群中更改的通知。客户端可以在读取特定 znode 时设置监控。监控器向注册的客户端发送有关 znode(客户端上进行注册的 znode)中任何更改的通知。

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