什么是 Apache ZooKeeper?
ZooKeeper 是一种分布式协调服务,用于管理大量主机。在分布式环境中协调和管理服务是一个复杂的过程。ZooKeeper通过其简单的体系结构和API解决了这个问题。ZooKeeper 允许开发人员专注于核心应用程序逻辑,而无需担心应用程序的分布式特性。
ZooKeeper 框架最初是在“Yahoo!”构建的 以简单而可靠的方式访问他们的应用程序。后来,Apache ZooKeeper 成为 Hadoop、HBase 和其他分布式框架使用的有组织的服务的标准。例如,Apache HBase 使用 ZooKeeper 来跟踪分布式数据的状态。本教程介绍了 ZooKeeper 的基础知识,如何在分布式环境中安装和部署 ZooKeeper 集群,最后以几个使用 Java 编程的示例和示例应用程序结束。
ZooKeeper 的工作原理
如果您有一个跨越 500 台或更多商用服务器的 Hadoop 集群,您将需要在名称、组和同步服务、配置管理等方面对整个集群进行集中管理。其他使用 Hadoop 集群的开源项目需要跨集群服务。嵌入 ZooKeeper 意味着您不必从头开始构建同步服务。与 ZooKeeper 的交互通过 Java™ 或 C 接口时间发生。
对于应用程序,ZooKeeper 通过在 ZooKeeper 服务器上的内存中维护状态类型信息来提供跨节点同步的基础设施。ZooKeeper 服务器保留整个系统状态的副本,并将此信息保存在本地日志文件中。大型 Hadoop 集群由多个 ZooKeeper 服务器支持,主服务器同步顶级服务器。
在 ZooKeeper 中,应用程序可以创建所谓的 znode,它是一个持久存在于 ZooKeeper 服务器内存中的文件。znode 可以由集群中的任何节点更新,集群中的任何节点都可以注册以接收该 znode 的更改通知。
简而言之,应用程序可以通过更新它们在 ZooKeeper znode 中的状态来跨分布式集群同步它们的任务。然后 znode 将特定节点的状态更改通知集群的其余部分。这种集群范围的状态集中服务对于跨大型分布式服务器集的管理和序列化任务至关重要。
在进一步发展之前,重要的是我们了解分布式应用程序的一两件事。因此,让我们从分布式应用程序的快速概览开始讨论。
分布式应用
分布式应用程序可以在给定时间(同时)在网络中的多个系统上运行,通过相互协调以快速有效的方式完成特定任务。通常,由非分布式应用程序(在单个系统中运行)需要数小时才能完成的复杂且耗时的任务可以通过分布式应用程序利用所有相关系统的计算能力在几分钟内完成。
通过将分布式应用程序配置为在更多系统上运行,可以进一步缩短完成任务的时间。运行分布式应用程序的一组系统称为集群,集群中运行的每台机器称为节点。
分布式应用程序有两部分,服务器和客户端应用程序。服务器应用程序实际上是分布式的并且有一个通用的接口,这样客户端就可以连接到集群中的任何服务器并获得相同的结果。客户端应用程序是与分布式应用程序交互的工具。
分布式应用程序的好处
- 可靠性- 单个或几个系统的故障不会使整个系统出现故障。
- 可扩展性- 可以在需要时通过添加更多机器来提高性能,而无需停机即可对应用程序的配置进行微小更改。
- 透明度- 隐藏系统的复杂性,并将自身显示为单个实体/应用程序。
分布式应用程序的挑战
- 竞争条件- 两台或多台机器尝试执行特定任务,实际上在任何给定时间只需要一台机器完成。例如,共享资源在任何给定时间只能由一台机器修改。
- 死锁- 两个或多个操作无限期地等待对方完成。
- 不一致- 数据部分失败。
Apache ZooKeeper 的用途是什么?
Apache ZooKeeper 是集群(节点组)使用的一种服务,用于在它们之间进行协调并通过强大的同步技术维护共享数据。ZooKeeper 本身是一个分布式应用程序,为编写分布式应用程序提供服务。
ZooKeeper 提供的常用服务如下 -
- 命名服务- 通过名称识别集群中的节点。它类似于 DNS,但适用于节点。
- 配置管理-加入节点的系统的最新和最新配置信息。
- 集群管理- 实时加入/离开集群中的节点和节点状态。
- 领导者选举- 选举一个节点作为领导者以进行协调。
- 锁定和同步服务- 在修改数据时锁定数据。此机制可帮助您在连接其他分布式应用程序(如Apache HBase)时进行自动故障恢复。
- 高度可靠的数据注册表- 即使一个或几个节点出现故障,数据的可用性。
分布式应用程序提供了很多好处,但它们也带来了一些复杂且难以破解的挑战。ZooKeeper 框架提供了一个完整的机制来克服所有挑战。使用故障安全同步方法处理竞争条件和死锁。另一个主要缺点是数据的不一致,ZooKeeper 使用atomicity 来解决。
使用ZooKeeper 的好处
以下是使用 ZooKeeper 的好处 -
- 简单的分布式协调流程
- 同步- 服务器进程之间的相互排斥和合作。此过程有助于在 Apache HBase 中进行配置管理。
- 有序消息
- 序列化- 根据特定规则对数据进行编码。确保您的应用程序始终如一地运行。这种方法可以在 MapReduce 中使用来协调队列以执行正在运行的线程。
- 可靠性
- 原子性- 数据传输要么成功要么完全失败,但没有事务是部分的。
在深入了解 ZooKeeper 的工作原理之前,让我们先了解一下 ZooKeeper 的基本概念。我们将在本章中讨论以下主题 -
- 建筑学
- 分层命名空间
- 会议
- 手表
ZooKeeper 的架构
看看下面的图表。它描述了 ZooKeeper 的“客户端-服务器架构”。
作为 ZooKeeper 架构一部分的每个组件都已在下表中进行了解释。
部分 | 描述 |
---|---|
客户 | 客户端是我们分布式应用集群中的节点之一,从服务器访问信息。在特定的时间间隔内,每个客户端都会向服务器发送一条消息,让服务器知道客户端还活着。 类似地,服务器在客户端连接时发送确认。如果连接的服务器没有响应,客户端会自动将消息重定向到另一台服务器。 |
服务器 | 服务器是 ZooKeeper 集合中的节点之一,为客户端提供所有服务。向客户端发出确认以通知服务器处于活动状态。 |
合奏 | ZooKeeper 服务器组。形成集成所需的最小节点数为 3。 |
领导 | 如果任何连接的节点发生故障,则执行自动恢复的服务器节点。在服务启动时选出领导者。 |
追随者 | 遵循领导者指令的服务器节点。 |
分层命名空间
下图描绘了用于内存表示的 ZooKeeper 文件系统的树结构。ZooKeeper 节点称为znode。每个 znode 都由一个名称标识并由一系列路径 (/) 分隔。
- 在图中,首先你有一个用“/”分隔的根znode。在 root 下,您有两个逻辑命名空间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 的数据。
Znodes的类型
Znodes 分为持久性、顺序性和短暂性。
- 持久性 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也会被删除。
Watches
Watches 是客户端获取 ZooKeeper 集合变化通知的一种简单机制。客户端可以在读取特定 znode 时设置监视。Watches 会向已注册的客户端发送通知,以了解任何 znode(客户端在其上注册)的更改。
Znode 更改是对与 znode 关联的数据的修改或 znode 子节点的更改。手表只会触发一次。如果客户端想要再次收到通知,则必须通过另一个读取操作来完成。当连接会话过期时,客户端将与服务器断开连接,并且关联的监视也将被删除。