Zookeeper基本原理
1.什么是Zookeeper?
Zookeeper是一个开源的分布式协调服务器框架,由Apache软件基金会开发,专为分布式系统设计。它主要用于在分布式环境中管理和协调多个节点之间的配置信息、状态数据和元数据。
Zookeeper采用了观察者模式的设计理念,其核心职责是存储和管理集群中共享的数据,并为各个节点提供一致的数据视图。在Zookeeper中,客户端(如分布式系统的各个节点)可以注册为“观察者”当这些共享数据发送变化时,Zookeeper会及时通知所有已经注册的观察者,从而使她们能够作出相应的反应或调整。
Zookeeper时一个集中化的服务,用于在分布式系统中实现协调、配置管理、分布式锁、集群管理等功能,确保数据的一致性和可靠性。通过使用Zookeeper,分布式系统中的各个组件能够以一种有序,可控的方式协同工作,从而提高系统的整体稳定性和可用性。
2.zookeeper在分布系统中的角色是?
2.1. 统一命名服务
Zookeeper的统一命名服务类似于域名解析系统。如图所示,假设一个客户端(Client1)需要访问百度,它不直接使用某个特定的IP地址(因为一个服务可能对应多个ip地址,而且这些ip地址可能都是动态变化)。相反,Zookeeper可以通过一个逻辑名称(如www.baidu.com)来统一管理这些ip地址,并将她们映射到实际的服务器节点上。

大致流程:
所有的服务(如百度的多个服务器节点)都会在 Zookeeper 上进行注册。这些服务在注册时会在 Zookeeper 的一个特定目录节点(如/service/www.baidu.com)下创建相应的子节点,并将其 IP 地址(如192.168.30.11、192.168.30.12等)作为子节点的数据存储在zookeeper中。Zookeeper会将所有注册的服务信息存储在统一的命名空间中。
当一个客户端(Client1)需要访问百度时,它不会直接请求具体的 IP 地址。相反,客户端先向 Zookeeper 查询 www.baidu.com 的节点信息。
Zookeeper 会将与 www.baidu.com 关联的所有 IP 地址(例如 192.168.30.11、192.168.30.12、192.168.30.13)作为一个列表返回给客户端。客户端从返回的列表中可以选择一个可用的 IP 地址来访问。
客户端使用从 Zookeeper 获取的 IP 地址列表,随机选择一个或按某种策略选择一个合适的 IP 地址,建立实际的连接请求。这允许客户端访问百度的服务而不必关心底层的实际 IP 地址。
如果百度的某个服务器节点发生变化(例如新增或删除某个 IP 地址),Zookeeper 会自动更新它的命名服务节点。客户端每次请求时,都会得到一个最新的可用 IP 地址列表,从而实现负载均衡和高可用性。
2.2.统一配置管理
在分布式系统(如Kafka、HDFS等)中,所有节点通常需要保持相同或兼容的配置,以确保系统的稳定运行。然而,如果需要手动逐一更新每个节点的配置文件,这将非常麻烦且容易出错。为了解决这个问题,我们可用使用Zookeeper的统一配置管理服务。

大致流程:
在分布式集群中,首先你需要将想要同步的配置文件上传到zookeeper的特定节点(如图中/Configuration)。这个节点将作为统一的配置存储位置,保存最新版本的配置文件内容。
集群中的每个服务器(客户端)会连接到Zookeeper,并向该配置节点(如/Configuration)注册一个Watch(监听器)。当客户端注册成功后,Zookeeper会将当前配置节点的状态返回给客户端,以确保客户端获取到最新的配置文件。
所有注册的客户端持续监控Zookeeper中配置节点的变化。一旦配置文件在Zookeeper中被修改,所有监听该节点的客户端都会收到Zookeeper发送的通知。
Zookeeper在检测到配置节点发送变化时,会立即通知所有注册的客户端。客户端接收到通知后,会立刻知道配置文件已发生更改,准备进行更新操作。客户端接收到通知后,会立刻知道配置文件已发生更改,准备进行更新操作。
每个客户端在收到通知后,主动向Zookeeper请求最新的配置数据(Config Data),并下载该数据。客户端将从 Zookeeper 获取的最新配置数据应用到本地。
客户端使用从 Zookeeper 下载的新配置数据,更新本地的配置文件。完成配置更新后,客户端可以选择重新加载或重启服务以使新的配置生效。
通过这种方式,所有客户端都能够保持与 Zookeeper 中配置文件的一致性,从而确保整个分布式集群中的配置文件同步一致。
2.3.统一集群管理
Zookeeper的统一集群管理通过在节点下为每个客户端创建对应的子节点来监控和管理客户端的状态。这使得分布式集群中的客户端可以实时了解其他客户端的状态,确保系统的高可用性和可靠性。Zookeeper 通过统一管理这些节点,简化了分布式集群的管理和维护工作。

大致流程:
每个客户端(Client1,Client2等)在启动时,会向Zookeeper注册自身的信息。Zookeeper注册自身的信息。Zookeeper 会在指定的节点路径下(如/GroupManager)为每个客户端创建一个子节点(如/GroupManager/client1)这些节点表示每个客户端的存在。
每个客户端节点(如 /client1)不仅表示客户端的存在,还可以存储关于客户端的状态信息(如是否在线、负载情况等)。Zookeeper 可以通过这些节点持续监控每个客户端的状态。
一旦客户端注册成功,Zookeeper 将持续监控这些客户端节点的状态。如果某个客户端的状态发生变化,例如下线或失效,Zookeeper 会更新节点信息,并通知其他相关的客户端。
其他客户端(如 Client2)可以通过 Zookeeper 访问这些节点,获取关于目标客户端的最新状态信息。客户端通过读取 Zookeeper 中的这些节点,能够判断目标客户端的当前状态,从而决定是否发起进一步的操作或访问。
当 Zookeeper 监测到某个客户端的状态发生变化时,会通知所有注册的其他客户端,告知其目标客户端状态的变化。客户端在收到通知后,可以立即采取相应措施,例如重新选择一个可用的客户端进行交互。
2.4.服务器动态上下线

大致流程:
当服务器1、服务器2、服务器3启动时,它们会向Zookeeper集群注册信息(如节点数),并在Zookeeper的特殊节点下创建相应的目录节点(临时节点)。这些节点用于记录各个服务器的状态和当前在线情况。
客户端(Client1、Client2)可以从Zookeeper集群中获取当前在线的服务器列表,并通过监听机制监控这些服务器节点的状态。当客户端注册监听器后,Zookeeper会实时更新客户端关于服务器上下线的动态。
当服务器1下线时,Zookeeper会自动删除其在集群中的临时节点(对应服务器1的信息消失)。因为Zookeeper支持分布式的强一致性,因此这个删除操作会立即通知到所有注册监听该节点的客户端。
收到通知的客户端(Client1、Client2)会了解到服务器1已下线,无法再向服务器1发送请求,并可以选择重新分配请求到其他在线的服务器(服务器2或服务器3)。
2.5.软负载均衡

大致流程:
各个服务器在启动时会向Zookeeper注册自己,Zookeeper在/service节点下为每个服务器创建一个子节点,这些子节点存储每台服务器的访问信息。例如,图片中服务器192.168.30.11注册在Zookeeper中,并记录了其访问次数。
当客户端(如Client1)需要访问某个服务时,它首先会查询Zookeeper中的/service节点,获取所有已注册服务器的列表和相关信息(如访问次数、服务器IP等)
Zookeeper并不直接进行硬件级的负载均衡,而是基于软负载均衡策略。Zookeeper可以将各个服务器的负载信息(如访问次数等)提供给客户端。客户端根据这些信息,选择负载较小的服务器进行访问。例如,当客户端发现192.168.30.11和其他服务器的负载较高时,它可以选择负载相对较低的服务器,如192.168.30.13。
Zookeeper在服务节点的上下线或负载变化时会通知客户端,这使得客户端可以动态地调整访问目标服务器,避免过载。
3.集群模式(Leader-Follower模型)
3.1.第一次启动
Zookeeper 集群中的每个服务器都有一个唯一的 myid(节点 ID),用来区分不同的节点。集群中的所有节点按顺序启动,每个节点都参与 Leader 选举。当服务器启动时,会进行一次Leader 选举。这次选举的目的是确定谁将成为集群的 Leader,负责处理所有的写操作和同步管理。选举过程中,节点会根据 myid 等投票规则来进行投票。(在选取中会遵循过半原则:在选举过程中,集群必须有超过半数的节点投票给同一个候选者,才会确认 Leader。因此,当启动到第三台服务器时(如图中的 server3),由于它得到了集群中过半节点的投票(3票中的2票或更多),server3 会成为集群的 Leader。)
当 server4 和 server5 启动时,它们虽然 myid 更大,但由于 Leader 选举已经完成,并且 Zookeeper 只会在 Leader 出现故障时重新触发选举,因此即便 server4 和 server5 启动,它们仍然会作为 Follower 加入集群,不会改变已有的 Leader(即 server3)。
如果 Leader(如 server3)发生故障或者下线,Zookeeper 会触发新的选举。此时,剩余的服务器将参与重新选举,新的 Leader 将根据当时在线的节点重新选出。在这种情况下,后启动的 server4 和 server5 有可能成为新的 Leader,具体取决于选举结果。
每次写操作都会由 Leader 处理,并为其分配一个唯一的事务 ID(zxid)。该 zxid 包含了时间戳和事务计数,用于确保集群内的操作顺序和一致性。所有的 Follower 节点都会遵循 Leader 的指令,确保数据的一致性。
3.2.非第一次启动
Zookeeper 集群仍然是由上面 5 台服务器组成,当前 server3 是 Leader。当 server3(Leader)和 server5 同时挂掉时,集群剩下的 server1、server2 和 server4 将会重新进行 Leader 选举。如下是 server1、server2 和 server4 具体的信息:
| epoch | zxid | sid | |
| server1 | 1 | 8 | 1 |
| server2 | 1 | 8 | 2 |
| server3 | 1 | 7 | 4 |
选举leader规则优先级如下:epoch>zxid>sid。所以server2被选为leader。
相关文章:
Zookeeper基本原理
1.什么是Zookeeper? Zookeeper是一个开源的分布式协调服务器框架,由Apache软件基金会开发,专为分布式系统设计。它主要用于在分布式环境中管理和协调多个节点之间的配置信息、状态数据和元数据。 Zookeeper采用了观察者模式的设计理念,其核心…...
【生日视频制作】西游记孙悟空师徒提笔毛笔书法横幅AE模板修改文字软件生成器教程特效素材【AE模板】
生日视频制作教程西游记孙悟空师徒提笔毛笔书法横幅AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 怎么如何做的【生日视频制作】西游记孙悟空师徒提笔毛笔书法横幅AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤: 下载AE模板 安装AE…...
春日美食汇:基于SpringBoot的订餐平台
2 系统关键技术 2.1JSP技术 JSP(Java脚本页面)是Sun和许多参与建立的公司所提倡的动态web技术。将Java程序添加到传统的web页面HTML文件()。htm,。Html) [1]。 JSP这种能够独立使用的编程语言可以嵌入在html语言里面运行,正因为JSP参照了许多编程语言的特性…...
微信小程序中如何监听元素进入目标元素
Page({onLoad: function(){// 如果目标节点(用选择器 .target-class 指定)进入显示区域以下 100px 时,就会触发回调函数。wx.createIntersectionObserver().relativeToViewport({bottom: 100}).observe(.target-class, (res) > {res.inter…...
华为 HCIP-Datacom H12-821 题库 (6)
有需要题库的可以看主页置顶 V群仅进行学习交流 1.转发表中 FLAG 字段中B 的含义是? A、可用路由 B、静态路由 C、黑洞路由 D、网关路由 答案:C 解析: 可用路由用U 表示,静态路由用 S 表示,黑洞路由用 B 表示&#x…...
常见的pytest二次开发功能
pytest框架的二次开发主要是为了满足特定的测试需求或扩展其功能。以下是一些常见的pytest二次开发的功能及其实例,以及如何进行开发的大致步骤: 常见的pytest二次开发功能 定制化测试报告: 功能描述:pytest默认生成的测试报告可…...
Linux下安装MySQL8.0
一、安装 1.下载安装包 先创建一个mysql目录,在将压缩包下载到此 # 下载tar包 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz等待下载成功 2.解压mysql8.0安装包 tar xvJf mysql-8.0.20-linux-glibc2.12-x86…...
【Python】CSV文件的简单使用
1.读取CSV文件 import csvpath "123.csv"with open(path) as f: # 打开csv文件csvReader csv.reader(f) # 读文件建立Reader对象listReader list(csvReader) # 将数据转换成列表print(listReader)2.写入CSV文件 import csvpath "123.csv"with ope…...
jobs命令
jobs命令是Unix/Linux shell中的一个内置命令,用于显示当前shell中正在运行的作业(job)的状态。作业是指在后台执行的命令或命令序列。 jobs命令的基本用法 显示所有作业的状态 当你在终端中启动一个命令并在其后加上&符号时ÿ…...
《深入浅出WPF》读书笔记.11Template机制(上)
《深入浅出WPF》读书笔记.11Template机制(上) 背景 模板机制用于实现控件数据算法的内容与外观的解耦。 《深入浅出WPF》读书笔记.11Template机制(上) 模板机制 模板分类 数据外衣DataTemplate 常用场景 事件驱动和数据驱动的区别 示例代码 使用DataTemplate实现数据样式…...
C语言程序设计(算法的概念及其表示)
一、算法的概念 一个程序应包括两个方面的内容: 对数据的描述:数据结构 对操作的描述:算法 著名计算机科学家沃思提出一个公式: 数据结构 +算法 =程序 完整的程序设计应该是: 数据结构+算法+程序设计方法+语言工具 广义地说,为解决一个问题而采取的方法和步骤…...
【最新华为OD机试E卷-支持在线评测】猜数字(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)
🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,…...
上海亚商投顾:深成指、创业板指均涨超1%,华为产业链反复活跃
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 大小指数昨日走势分化,沪指全天震荡调整,2800点失而复得,深成指、创业板指…...
【H2O2|全栈】Markdown | Md 笔记到底如何使用?【前端 · HTML前置知识】
Markdown的一些杂谈 目录 Markdown的一些杂谈 前言 准备工作 认识.Md文件 为什么使用Md? 怎么使用Md? 编辑 怎么看别人给我的Md文件? Md文件命令 切换模式 粗体、倾斜、下划线、删除线和荧光标记 分级标题 水平线 引用 无序…...
C++17: 用折叠表达式实现一个IsAllTrue函数
前言 让我们实现一个 IsAllTrue 函数,支持变长参数,可传入多个表达式,必须全部计算为true,该函数才返回true。 本文记录了逐步实现与优化该函数的思维链,用到了以下现代C新特性知识,适合对C进阶知识有一定…...
【IPV6从入门到起飞】2-2 获取你的IPV6(Teredo隧道)
【IPV6从入门到起飞】2-2 获取你的IPV6(Teredo隧道) 1 打工人的忧伤2 Teredo介绍2.1 背景2.2 工作原理 3 Linux 服务器获取IPV63.1 安装3.2 设置开机自启动和启动3.3 开放防火墙 UDP 35443.4 查看IPV6以及ping包测试3.5 修改Teredo服务器3.6 重启服务3.7…...
Linux 安全弹出外接磁盘
命令行操作 首先,需要卸载硬盘上的所有分区,可以使用umount来卸载分区 清空系统缓存,将所有的数据写入磁盘 sync 列出已挂载的文件系统 使用lsblk或者df命令来查找要卸载的分区 lsblk or df -h确保没有文件正在使用 使用lsof 命令来…...
面试准备-6
NIO底层是用Selector、Channel和ByteBuffer来实现的。主线程在循环使用select方法进行阻塞等待,当有acceptable(可连接)、readable(可读)或者writable(可写)事件发生的时候,循环就会…...
context canceled 到底谁在作祟?
一、背景 在工作中,因报警治理标准提高,在报警治理的过程中,有一类context cancel报警渐渐凸显出来。 目前context cancel日志报警大致可以分为两类。 context deadline exceeded 耗时长有明确报错原因 context canceled 耗时短无明确报错…...
windows C++ 虚拟内存的按需调拨
虚拟内存的按需调拨 windows C 虚拟内存的按需调拨 文章目录 虚拟内存的按需调拨虚拟内存的按需调拨 虚拟内存的按需调拨 /*------------------------------------------------------------------------24-SEHAndMemory.cpp演示虚拟内存的按需调拨--------------------------…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
