了解 ZooKeeper:关键概念和架构

news2025/1/18 3:51:58

ZooKeeper 是一种分布式协调服务,广泛用于分布式系统中,用于维护配置信息、命名、同步和组服务。它最初由雅虎开发,现在是一个 Apache 项目,已成为许多大型分布式应用程序不可或缺的一部分。本文深入探讨 ZooKeeper 的关键概念和架构,全面了解其功能和重要性。

介绍

随着分布式系统变得越来越复杂,对可靠协调服务的需求也变得至关重要。ZooKeeper 通过为分布式应用程序提供高性能协调服务来满足这一需求。它有助于管理配置信息、跨分布式节点同步任务以及维护组成员身份,从而确保分布式系统能够协同运行。

关键概念

  1. ZooKeeper 集合: ZooKeeper 中的集合由一组服务器(通常是奇数)组成,它们共同管理分布式协调。集合中的每个服务器都维护相同数据的副本,以确保高可用性和可靠性。在典型设置中,如果大多数服务器正常运行,集合就可以继续运行。这称为仲裁。
  2. ZNodes: ZooKeeper 将其数据存储在类似于文件系统的分层命名空间中。此层次结构中的每个节点称为 ZNode。ZNode 是 ZooKeeper 中的基本数据单元,可以是持久的,也可以是临时的。持久 ZNode 会一直存在,直到被明确删除,而临时 ZNode 会在创建它们的会话结束时自动删除。
  3. 会话: 当客户端连接到 ZooKeeper 集合时,会建立一个会话。会话是客户端与集合之间的临时连接,在此期间客户端可以执行各种操作。如果客户端在一定超时时间内断开连接并重新连接,则会重新建立会话。如果客户端在此期限内无法重新连接,则会话被视为已过期。
  4. 监视: ZooKeeper 允许客户端在 ZNode 上设置监视。监视是一种让客户端接收 ZNode 更改通知的机制。发生更改时(例如,创建、删除或修改 ZNode),ZooKeeper 会向设置监视的客户端发送事件通知。此功能对于需要随时了解分布式环境中的更改的应用程序非常方便。
  5. 原子广播协议 (Zab): ZooKeeper 原子广播 (Zab) 协议是 ZooKeeper 可靠性和一致性的核心。Zab 是一种崩溃恢复原子广播协议,可确保集合中的所有服务器都收到相同的状态更改序列。它分为两个阶段运行:领导者选举阶段和广播阶段。在领导者选举期间,一台服务器被选为领导者,然后向追随者广播状态更改。这可确保所有服务器保持一致的状态。

ZooKeeper 架构

ZooKeeper 的架构旨在提供高吞吐量、低延迟和高可用性。它由三个主要组件组成:客户端库、ZooKeeper 服务器和数据存储。

  1. 客户端库: 客户端库是客户端与 ZooKeeper 集合交互的接口。它提供用于创建、删除和管理 ZNode、设置监视和处理会话的 API。客户端库设计为轻量级且高效,可确保客户端应用程序的开销最小。
  2. ZooKeeper 服务器: ZooKeeper 集群由多个服务器(通常为 3、5 或 7 个)组成,它们协同工作以提供可靠的协调服务。这些服务器可分为三种角色:领导者、追随者和观察者。
  • Leader: Leader 负责处理来自客户端的所有写入请求,并与跟随者同步状态更改。它确保状态更改在整个集合中有序且一致。
  • **追随者:**追随者从领导者处接收状态变化并相应地更新其本地状态。它们还处理来自客户端的读取请求,在整个集合中分配读取负载。
  • **观察者:**观察者与追随者类似,但不参与仲裁。他们从领导者那里接收状态变化并更新其本地状态,但不参与领导者选举。观察者可用于在不影响仲裁的情况下扩展读取吞吐量。
  1. 数据存储: ZooKeeper 将数据存储在内存中,并定期将快照存储到磁盘以进行持久保存。内存存储提供快速数据访问,确保读写操作的低延迟。快照机制确保在服务器发生故障时可以恢复数据。此外,ZooKeeper 维护事务日志以记录所有状态更改,从而提供可靠的恢复机制。

用例:分布式锁服务

要了解 ZooKeeper 的影响,请考虑分布式锁服务,这是分布式系统中的常见要求。分布式锁服务可确保在任何给定时间只有一个进程可以持有锁,从而防止出现竞争条件并确保数据一致性。

执行

  1. 创建锁 ZNode: 当客户端想要获取锁时,它会/lock在 ZooKeeper 中创建一个临时 ZNode(例如)。如果 ZNode 创建成功,则该客户端持有该锁。如果 ZNode 已经存在,则意味着另一个客户端持有该锁。

  2. 释放锁: 当持有锁的客户端完成任务时,它会删除 ZNode /lock,释放锁。如果客户端的会话过期或断开连接,则会自动删除临时 ZNode,确保释放锁。

  3. **等待锁:**如果客户端尝试创建/lockZNode 并失败(因为它已经存在),它会对 ZNode 设置监视。当 ZNode 被删除(锁被释放)时,ZooKeeper 会通知客户端,然后客户端会再次尝试获取锁。

示例场景

假设有一个分布式应用程序,其中多个实例需要更新共享资源(例如数据库)。如果没有适当的同步,这些实例可能会尝试同时更新资源,从而导致不一致。通过使用 ZooKeeper 进行分布式锁定,应用程序可确保每次只有一个实例可以更新资源。

  1. 客户端A 通过创建 ZNode 尝试获取锁/lock。如果成功,客户端 A 会更新共享资源,然后删除 ZNode 并释放锁。
  2. 与此同时,客户端B也尝试获取锁,但发现该/lockZNode已经存在。客户端B在该ZNode上设置监视并等待。
  3. 当客户端 A 释放锁(删除 ZNode)时,ZooKeeper 会通知客户端 B。然后客户端 B 尝试创建 ZNode /lock、获取锁并更新共享资源。

此示例演示了 ZooKeeper 的协调服务如何确保数据一致性并防止分布式环境中的竞争条件。

使用 ZooKeeper 的好处

ZooKeeper 提供了多种优势,使其成为分布式协调的首选:

  1. 高可用性: ZooKeeper 采用基于仲裁的方法,确保只要大多数服务器正常运行,服务就可用。这使其对服务器故障具有很强的弹性。

  2. 一致性: ZooKeeper 保证强一致性,确保所有客户端都看到相同的数据视图。这对于维护分布式系统的完整性至关重要。

  3. **可扩展性:**通过在集合中分发读取请求并使用观察者,ZooKeeper 可以处理大量读取操作,使其适用于大规模应用程序。

  4. 简单性: ZooKeeper 简单的 API 和分层命名空间使其易于使用并集成到现有应用程序中。开发人员可以快速实现协调任务,而无需处理分布式系统的复杂性。

挑战与限制

尽管 ZooKeeper 具有诸多优势,但它也存在一些挑战和局限性:

  1. **写入可扩展性:**由于所有写入请求都通过领导者,因此领导者的容量限制了写入吞吐量。在写入密集型应用程序中,这可能会成为瓶颈。

  2. **延迟:**虽然 ZooKeeper 提供低延迟数据访问,但客户端和集合之间的网络延迟可能会影响性能,尤其是在地理分布式部署中。

  3. **配置的复杂性:**正确配置和管理 ZooKeeper 集合需要深入了解其内部结构。配置错误可能会导致性能问题甚至数据丢失。

  4. 单点故障(领导者): ZooKeeper 集合中的领导者是写入操作的单点故障。虽然集合可以在当前领导者发生故障时选出新的领导者,但有一段短暂的时间无法处理写入操作。

结论

ZooKeeper 是一款强大的分布式协调工具,具有高可用性、强一致性和可扩展性。其简单的 API 和强大的架构使其适用于从配置管理到分布式锁定等各种分布式应用程序。通过了解 ZooKeeper 的关键概念和架构,开发人员可以利用其功能构建可靠、高效的分布式系统。

随着分布式系统的发展,对 ZooKeeper 等可靠协调服务的需求只会增长。通过应对挑战和限制并不断改进其架构,ZooKeeper 将在未来几年继续成为分布式系统的基石。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1881369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(四)Appdesigner-文件存在判断及对话框设计

目录 前言 一、文件存在判断 (一)基础知识 (二)实际操作 二、对话框设计 (一)基础知识 1.提示对话框 2.询问对话框 3.文件选择对话框 (二)实际操作 1.提示对话框 2.询问…

考研生活day1--王道课后习题2.2.1、2.2.2、2.2.3

2.2.1 题目描述: 解题思路: 这是最基础的操作,思路大家应该都有,缺少的应该是如何下笔,很多同学都是有思路但是不知道如何下笔,这时候看思路的意义不大,可以直接看答案怎么写,最好…

关于内存和外存文件不同字符集下占用空间大小问题

关于内存和外存不同字符集下文件占用空间大小问题 存储(外存)的文件中的字符: ASCII:每个字符占用1个字节,用来存储英文字符和常用标点符号。ISO-8859-1:每个字符占用1个字节,向下兼容ASCII。G…

【代码随想录】【算法训练营】【第53天】 [739]每日温度 [496]下一个更大元素I [503]下一个更大元素II

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 48,周六,不能再坚持~ 题目详情 [739] 每日温度 题目描述 739 每日温度 解题思路 前提: 思路: 重点: 代码实现 C语言 [496] 下一…

【一篇搞懂】操作系统期末大题:进程同步与互斥 PV操作

文章目录 一、前言🚀🚀🚀二、正文:☀️☀️☀️题型一:利用信号量实现前驱关系题型二:利用信号量实现资源同步与互斥 一、前言🚀🚀🚀 本文简介:这是一篇基于b…

Pycharm常用快捷键整理

1,格式化代码 【ctrlAltL】 写代码的时候会发现有很多黄色的波浪号,这个时候可以点击任意黄色波浪号的代码,然后按下【Ctrl Alt L】进行代码格式化 2,快速往返 ctrll Alt ⬅ ,表示查看上一步调用函数位置&#xff0…

Redis 7.x 系列【9】数据类型之自动排重集合(Set)

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 前言2. 常用命令2.1 SADD2.2 SCARD2.3 SISMEMBER2.4 SREM2.5 SSCAN2.6 SDIFF2.7 SU…

华为OD机试 - 启动多任务排序 - 拓扑排序(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(D卷C卷A卷B卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测…

如何做好一个企业家IP:塑造独特的个人品牌

在当今数字化时代,个人品牌的力量愈发凸显,对于企业家而言,一个强大的IP(Intellectual Property,即知识产权或个人品牌)不仅有助于提升个人影响力,还能为企业的发展注入强大动力。那么&#xff…

BGE M3-Embedding 模型介绍

BGE M3-Embedding来自BAAI和中国科学技术大学,是BAAI开源的模型。相关论文在https://arxiv.org/abs/2402.03216,论文提出了一种新的embedding模型,称为M3-Embedding,它在多语言性(Multi-Linguality)、多功能…

Feign 原理流程图练习-01

目录 作业: 老师给的参考流程图 要求 解答 知识扩展 Feign基础原理 接口定义 代理对象生成 请求调用 请求发送 响应处理 容错与熔断 总结 作业: 老师给的参考流程图 pdf版本 【金山文档 | WPS云文档】 Feign https://kdocs.cn/l/ctbagIyxN348 ​ 要求 结合上面…

[C++][设计模式][状态模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受1.代码一2.代码二 1.动机 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而放生变化 比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同 如何在运行时根据对象的状…

STM32 SWD烧写

最小电路 stm32f103x 内部已经集成了振荡电路,可以省略;rst引脚电路,可以省略,boot0,boot1不需要设置 正常烧录 -------------------------------------------------------------------STM32CubeProgrammer v2.9.0 …

antd Select前端加模糊搜索

背景&#xff1a;前端的小伙伴经常在开发antd Select的时候后端不提供搜索模糊搜索接口&#xff0c;而是全量返回数据&#xff0c;这个时候就需要我们前端自己来写一个模糊搜索了。 效果 代码截图 代码 <SelectshowSearchmode"multiple"options{studioList}filte…

读AI新生:破解人机共存密码笔记17不确定性和概率

1. 前向搜索 1.1. 通过前向搜索&#xff0c;通过考虑各种可能的动作序列的结果&#xff0c;来选择动作&#xff0c;是智能系统的基本能力 1.2. 如果一家卡车运输公司想要优化其100辆卡车在美国的运输&#xff0c;那么该公司可能需要考虑的状态数量将是10^700个 1.3. 几乎所有…

leetcode 第133场双周赛 100333.统计逆序对的数目【计数dp/滚动数组/前缀和优化】

分析&#xff1a; 先考虑如下问题。 求长度为n&#xff0c;逆序对为m的排列数量。 可以考虑dp&#xff0c;dp[i][j]定义为长度为i&#xff0c;逆序对为j的排列数量。 dp[1][0] 1; //枚举排列长度&#xff0c;或者认为枚举当前需要插到长度为i-1的排列中的数字 for(int i 1…

Mini-Contract电子合同在线签署小程序源码

Mini-Contract电子合同在线签署小程序源码&#xff0c;采用的是uniapp Vue3框架搭建&#xff0c;只有前端源码是一个聚合市场上各类电子合同解决方案商的工具&#xff0c;让用户无需一个个对接电子合同厂商&#xff0c;节省时间和精力。该程序提供了简洁的代码和最新的技术栈&a…

C++ | Leetcode C++题解之第208题实现Trie(前缀树)

题目&#xff1a; 题解&#xff1a; class Trie { private:vector<Trie*> children;bool isEnd;Trie* searchPrefix(string prefix) {Trie* node this;for (char ch : prefix) {ch - a;if (node->children[ch] nullptr) {return nullptr;}node node->children[…

现代信息检索笔记(二)

目录 信息检索概述 IR vs数据库: 结构化vs 非结构化数据 结构化数据 非结构化数据 半结构化数据 传统信息检索VS现代信息检索 布尔检索 倒排索引 一个例子 建立词项&#xff08;可以是字、词、短语、一句话&#xff09;-文档的关联矩阵。 关联向量 检索效果的评价 …

【IVI】car_service 命令行工具

【IVI】car_service 命令行工具 1、car_service服务执行2、CarShellCommand命令执行2.1 cmd car_service day-night-mode day设置白天模式2.2 cmd car_service inject-vhal-event vhal信号事件2.2.1 VehiclePropertyIds2.2.2 模拟驾驶事件 2.3 cmd car_service inject-error-ev…