ZooKeeper入门及核心知识点整理

news2025/1/11 12:46:23

什么是Zookeeper

Zookeeper简称zk,先从字面意思上去理解,那就是动物园管理员。其实zk是大数据领域中的一员,为整个分布式环境提供了协调服务,主要可以用于存储一些配置信息,同时也可以基于zk实现集群。它是一个apache的开源分布式中间件。

举一些zk简单的场景:

  • 比如当你使用dubbo的时候,你需要使用zk作为注册中心,当然SpringCloud也可以使用zk来替代eureka作为注册中心。

  • 另外kafka和solr都是基于zk的结合实现了集群,当然netty也可以。如果你对上述的一些技术名字没有听过没有接触过,那么没有关系,我们将来都会涉及到,都会带着大家去学习。

  • 集群或者分布式系统以及大数据中的一些统一的配置管理信息可以都写入zk便于所有服务器节点监听读写,其实也就是协调作用嘛

  • MQ消费者处理完毕也可以通过zk回写通知生产者处理完成,并且告知结果。

工作机制

zk可以说是一种监工模式。zk中把数据保存到节点(节点后面会说),然后可以监听这个节点,如果节点的数据发生变化,则可以发起通知。我们可以通过下面一张图来描述这个过程。

上面就是zk的工作原理,本质上其实也是生产者与消费者的关系,学生就是生产者,而班主任就是消费者,通过这种关系实现了zk的通知机制。

基本结构 

数据模型

ZooKeeper中的数据模型是一种树形结构。

具有一个固定的根节点,我们可以在根节点下创建子节点,并在子节点下继续创建下一级节点。

树中的每一层级用斜杠(/)分隔开,只能用绝对路径(如get /work/task1)的方式查询节点,不能使用相对路径。

为什么 ZooKeeper不能采用相对路径查找节点?

ZooKeeper 在底层实现的时候,使用了一个 hashtable,即 hashtableConcurrentHashMap<String, DataNode> nodes,用节点的完整路径来作为 key 存储节点数据。

节点类型

持久节点:

该数据节点会一直存储在 ZooKeeper 服务器上,即使创建该节点的客户端与服务端的会话关闭了,该节点依然不会被删除。

如果我们想删除持久节点,就要显式调用 delete 函数进行删除操作。

临时节点:

该节点数据不会一直存储在 ZooKeeper 服务器上。

当创建该临时节点的客户端会话因超时或发生异常而关闭时,该节点也相应在 ZooKeeper 服务器上被删除。

可以利用临时节点来做服务器集群内机器运行情况的统计,将集群设置为/servers节点,并为集群下的每台服务器创建一个临时节点/servers/host,当服务器下线时该节点自动被删除,最后统计临时节点个数就可以知道集群中的运行情况。 

有序节点:

节点有序是说在我们创建有序节点的时候,ZooKeeper 服务器会自动使用一个单调递增的数字作为后缀,追加到我们创建节点的后边。

例如一个客户端创建了一个路径为 works/task- 的有序节点,那么 ZooKeeper 将会生成一个序号并追加到该节点的路径后,最后该节点的路径为 works/task-1

节点数据 

 一个二进制数组(byte data[]),用来存储节点的数据、ACL 访问控制信息、子节点数据(因为临时节点不允许有子节点,所以其子节点字段为 null),除此之外每个数据节点还有一个记录自身状态信息的字段 stat。

节点状态 

每个节点都有属于自己的状态信息,执行 stat /zk_test,可以看到节点状态信息。

节点版本

每个数据节点有 3 种类型的版本信息,对数据节点的任何更新操作都会引起版本号的变化。

  • ZooKeeper 的版本信息表示的是对节点数据内容、子节点信息或者是 ACL 信息的修改次数。

 数据存储

内存数据

ZooKeeper的数据模型是存储在内存中的。

  • 源码中,通过 DataTree 类来定义的。

数据日志

数据日志是用来记录 ZooKeeper 服务运行状态的数据文件。

通过这个文件能统计 ZooKeeper 服务的运行情况,更可以在 ZooKeeper 服务发生异常的情况下,根据日志文件记录的内容来进行分析,定位问题产生的原因并找到解决异常错误的方法。

事务日志

在 ZooKeeper 服务运行过程中,会不断地接收和处理来自客户端的事务性会话请求,每次在处理事务性请求的时候,都要记录这些信息到事务日志中。

同时集群中,Leader服务器会向 ZooKeeper 集群中的其他角色服务发送数据同步信息,在接收到数据同步信息后,ZooKeeper 集群中的 Follow 和 Observer 服务器就会进行数据同步。

  • 这两种角色服务器所接收到的信息就是 Leader 服务器的事务日志。

  • 在接收到事务日志后,并在本地服务器上执行。

快照文件

在 ZooKeeper 服务运行的过程中,数据快照每间隔一段时间,就会把 ZooKeeper 内存中的数据存储到磁盘中,快照文件是间隔一段时间后对内存数据的备份。

  • 与内存数据相比,快照文件的数据具有滞后性。

 Watch(监视器)

 ZooKeeper 提供了一种强大的事件监听机制——Watch(监视器),允许客户端订阅特定节点的变化事件。当订阅的事件发生时,ZooKeeper 服务端会向相应的客户端发送通知。Watch 事件监听是 ZooKeeper 实现分布式协调、状态同步等核心功能的关键手段之一。

类型与触发条件 

ZooKeeper 支持两种类型的 Watch 事件:

  1. 数据变更 Watch(Data Watches):当客户端对某个 ZNode 设置数据变更 Watch 后,如果该 ZNode 的数据内容发生任何更改(包括创建、更新、删除),ZooKeeper 会向客户端发送一个通知。注意,数据变更 Watch 是一次性触发器,即触发后需要客户端重新设置才能继续监听后续变化。

  2. 子节点列表变更 Watch(Child Watches):如果客户端对某个 ZNode 设置子节点列表变更 Watch,当该 ZNode 的子节点集发生变化(新增、删除子节点)时,ZooKeeper 会发送通知。同样,子节点列表变更 Watch 也是一次性触发器。

设置 Watch

客户端可以通过以下方式设置 Watch:

  • 使用 ZooKeeper API:在使用 ZooKeeper 客户端库(如 Java 的 org.apache.zookeeper.ZooKeeper 类)编写程序时,可以在相应方法中指定是否设置 Watch。例如,getData() 方法可以设置数据变更 Watch,getChildren() 方法可以设置子节点列表变更 Watch。

  • 使用 ZooKeeper 命令行工具:在 ZooKeeper 命令行客户端(如 zkCli.sh)中,通过在命令中添加 watch 参数来设置 Watch。例如,get path watch 会在获取数据的同时设置数据变更 Watch,ls path watch 会在列出子节点的同时设置子节点列表变更 Watch。

事件通知与处理

当触发 Watch 的事件发生时,ZooKeeper 服务端会通过客户端与服务端之间已建立的连接,向客户端发送一个 Watch 事件通知。通知包含以下信息:

  • 事件类型:指明触发的具体事件类型,如 NodeDataChanged(数据变更)、NodeDeleted(节点删除)、NodeChildrenChanged(子节点列表变更)等。

  • 节点路径:发生事件的 ZNode 的完整路径。

  • 状态码:通常表示事件通知的成功与否,以及可能的错误代码。

客户端在接收到 Watch 事件通知后,通常会调用预定义的回调函数(使用 ZooKeeper API 时)或在命令行中显示通知(使用命令行工具时),以便应用程序及时响应事件并采取相应的行动。

注意事项

  • 一次性触发:Watch 是一次性触发器,这意味着一旦触发事件并发送通知后,该 Watch 就会自动移除。若想继续监听同一事件,客户端需在接收到通知后重新设置 Watch。

  • 异步通知:Watch 事件通知是异步发送的,不保证立即送达。客户端在设置 Watch 后,不应假设事件会立即触发或通知会立即到达。

  • 客户端会话状态:如果客户端会话由于网络问题、超时等原因中断,所有与该会话关联的 Watch 将被移除,客户端需要在重新建立会话后重新设置 Watch。

  • 性能考虑:大规模集群中大量使用 Watch 可能会影响 ZooKeeper 服务端的性能。在设计系统时应合理规划 Watch 的使用,避免过度依赖或滥用。

应用场景

Watch 事件监听广泛应用于分布式系统中的各种场景,如:

  • 配置变更通知:当存储在 ZooKeeper 中的配置数据发生变化时,客户端可以立即得到通知并应用新的配置。

  • 服务发现:客户端监听服务注册节点的子节点列表变化,实时掌握服务实例的上线、下线情况。

  • 分布式锁与同步:客户端通过监听锁节点的状态变化来实现锁的获取与释放,或者通过监听同步点的变化实现分布式流程的协调。

  • 集群管理与监控:监控集群中节点的状态变化,及时发现异常并作出响应。

总之,ZooKeeper 的 Watch 事件监听机制为分布式系统提供了实时、灵活的事件驱动能力,极大地简化了状态同步、协调控制等复杂问题的实现,是 ZooKeeper 作为分布式协调服务的核心特性之一。

 

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

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

相关文章

RabbitMQ的基础概念介绍

MQ的三大特点&#xff1a;削峰、异步、解耦 1.RabblitMQ概念介绍 1.1概念 RabbitMQ是由erlang语言开发&#xff0c;基于AMQP&#xff08;Advanced Message Queue 高级消息队列协议&#xff09;协议实现的消息队列&#xff0c;它是一种应用程序之间的通信方法&#xff0c;消息…

【docker】使用docker-compose的时候如何更新镜像版本

使用docker-compose的时候如何更新镜像版本。之前总是会忘记怎么操作&#xff0c;每次都得百度搜&#xff0c;干脆记录一下。 说明 我有一个memos是用docker-compose部署的&#xff0c;memos更新的挺频繁的&#xff0c;新版本的功能也不错&#xff0c;更新一下没啥问题。 注…

吴恩达机器学习课后作业-03多分类、神经网络前向传播

这里写目录标题 逻辑回归解决多分类问题&#xff08;逻辑回归的“一对多”&#xff08;One-vs-All&#xff09;策略。&#xff09;绘制图像结果 神经网络前向传播数字识别 、 逻辑回归解决多分类问题&#xff08;逻辑回归的“一对多”&#xff08;One-vs-All&#xff09;策略。…

[Algorithm][综合训练][孩子们的游戏][大数加法][拼三角]详细讲解

目录 1.孩子们的游戏1.题目链接2.算法原理详解 && 代码实现 2.大数加法1.题目链接2.算法原理详解 && 代码实现 3.拼三角1.题目链接2.算法原理详解 && 代码实现 1.孩子们的游戏 1.题目链接 孩子们的游戏 2.算法原理详解 && 代码实现 问题抽象…

LongWriter——从长文本语言模型中释放出10,000+字的生成能力

概述 当前的长上下文大型语言模型 (LLM) 可以处理多达 100,000 个词的输入&#xff0c;但它们很难生成超过 2,000 个词的输出。受控实验表明&#xff0c;该模型的有效生成长度本质上受到监督微调(SFT) 期间看到的示例的限制。换句话说&#xff0c;这种输出限制源于现有 SFT 数…

三维模型单体化软件:地理信息与遥感领域的精细化革命

在地理信息与遥感科学日新月异的发展浪潮中&#xff0c;单体化软件作为一股强大的驱动力&#xff0c;正引领着我们迈向空间信息处理与应用的新纪元。本文旨在深度解析单体化软件的核心价值、技术前沿、实践应用及面临的挑战&#xff0c;共同探讨这一技术如何塑造行业的未来。 …

【手撕OJ题】——BM8 链表中倒数最后k个结点

目录 &#x1f552; 题目⌛ 方法① - 直接遍历⌛ 方法② - 快慢指针 &#x1f552; 题目 &#x1f50e; BM8 链表中倒数最后k个结点【难度&#xff1a;简单&#x1f7e2;】 输入一个长度为 n 的链表&#xff0c;设链表中的元素的值为 a i a_i ai​ &#xff0c;返回该链表中倒…

一款MySQL数据库实时增量同步工具,能够监听MySQL二进制日志(Binlog)的变动(附源码)

背景 作为一名CURD的程序员&#xff0c;少不了跟MySQL打交道&#xff0c;在同步数据的时候&#xff0c;MySQL的Binlog显得重中之重&#xff0c;所以处理Binlog的工具尤为重要。 其中阿里巴巴开源的canal 更是耳闻目睹&#xff0c;但是今天小编给大家介绍另外一款MySQL数据库实…

【C++11】常用新语法②(类的新功能 || 可变参数模板 || lambda表达式 || 包装器)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; C 目录 &#x1f308;前言&#x1f525;类的新功能新增默认成员函数强制生成默认函数的关键字default禁止生成默认函数的关键字delete &#x1f525;可变参数模板递归函数方式展开参数包…

论文翻译:Benchmarking Large Language Models in Retrieval-Augmented Generation

https://ojs.aaai.org/index.php/AAAI/article/view/29728 检索增强型生成中的大型语言模型基准测试 文章目录 检索增强型生成中的大型语言模型基准测试摘要1 引言2 相关工作3 检索增强型生成基准RAG所需能力数据构建评估指标 4实验设置噪声鲁棒性结果负面拒绝测试平台结果信息…

算法5:位运算

文章目录 小试牛刀进入正题 没写代码的题&#xff0c;其链接点开都是有代码的。开始前请思考下图&#xff1a; 小试牛刀 位1的个数 class Solution { public:int hammingWeight(int n) {int res 0;while (n) {n & n - 1;res;}return res;} };比特位计数 class Solution…

计算机毕业设计选题推荐-猫眼电影数据可视化分析-Python爬虫-k-means算法

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

进程和文件痕迹排查——LINUX

目录 介绍步骤 介绍 进程&#xff08;Process&#xff09;是计算机中的程序关于某数据集合上的一次运行活动&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;是操作系统结构的基础。 在早期面向进程设计的计算机结构中&#xff0c;进程是程序的基本执行实体&…

fastadmin 安装

环境要求&#xff0c;大家可以参考官方文档的&#xff0c;我这里使用的是phpstudy&#xff0c;很多已经集成了。 注意一点&#xff0c;PHP 版本&#xff1a;PHP 7.4 。 第二步&#xff1a;下载 下载地址&#xff1a;https://www.fastadmin.net/download.html 进入下载地址后…

IDEA:Terminal找不到npm

Terminal的命令失效通过修改cmd.exe的方式还是不生效的话&#xff0c;考虑是windwos11 默认idea不是通过管理员启动的&#xff0c;如下图修改就可以了。

前端vue 3中使用 顶象 vue3 版本

顶象 验证 的插件 不知道大家使用过没有 顶象-业务安全引领者&#xff0c;让数字世界无风险 可以防止 机器人刷接口 等 可以在任何 加密操作中使用 下面我直接 贴代码 解释 <script src"https://cdn.dingxiang-inc.com/ctu-group/captcha-ui/v5/index.js" cro…

第12章 网络 (2)

目录 12.5 网络命名空间 12.6 套接字缓冲区 12.6.1 使用 sk_buff 管理数据 12.6.2 管理套接字缓冲区数据 本专栏文章将有70篇左右&#xff0c;欢迎关注&#xff0c;查看后续文章。 12.5 网络命名空间 一个网卡可能只在某个特定命名空间可见。 struct net&#xff1a; 表…

C语言贪吃蛇之BUG满天飞

C语言贪吃蛇之BUG满天飞 今天无意间翻到了大一用C语言写的贪吃蛇&#xff0c;竟然还标注着BUG满天飞&#xff0c;留存一下做个纪念&#xff0c;可能以后就找不到了 /* 此程序 --> 贪吃蛇3.0 Sur_流沐 当前版本&#xff1a; Bug满天飞 */ #include<stdio.h> #includ…

Linux C、C++编程之线程同步

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com…

qt处理表格,Qtxlsx库文件的安装以及导入

qt想要处理excel表格的&#xff0c;这个过程中避免不了使用Qtxlsx这个库文件。这几天花了几天时间&#xff0c;终于本地调通了。记录一下。 关于Qtxlsx的使用&#xff0c;大致分为2中方法。 方法一&#xff1a;直接下载对应的xlsx文件&#xff0c;然后在.pro文件中 这种方法是…