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演示虚拟内存的按需调拨--------------------------…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...
