【分布式微服务云原生】《ZooKeeper 深度探秘:分布式协调的强大利器》
**《ZooKeeper 深度探秘:分布式协调的强大利器》 **
摘要:本文将深入详解 ZooKeeper,涵盖其工作原理、实现分布式锁的方法、应用场景、负载均衡的实现以及不同角色的作用等内容。读者将全面了解 ZooKeeper 的强大功能和价值,为构建高可靠、高性能的分布式系统提供有力支持。
关键词:ZooKeeper、分布式锁、负载均衡、ZAB 协议、角色构成
一、ZooKeeper 简介
-
ZooKeeper 是什么
ZooKeeper 是一个开源的分布式协调服务,由 Apache 软件基金会提供。它为分布式应用提供一致性服务,广泛的功能包括配置管理、分布式锁、集群管理等。 -
设计目标
ZooKeeper 的设计目标是提供高可用的、高性能的、可靠的存储服务,以支持分布式应用的一致性协调。
二、ZooKeeper 的工作原理和算法
- 数据模型
ZooKeeper 使用一个层次化的命名空间,类似于文件系统,每个节点称为 znode。znode 可以存储数据,并且可以有子节点。
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;import java.io.IOException;
import java.util.concurrent.CountDownLatch;public class ZooKeeperExample {private static final String CONNECTION_STRING = "localhost:2181";private static final int SESSION_TIMEOUT = 5000;public static void main(String[] args) throws IOException, InterruptedException, KeeperException {CountDownLatch latch = new CountDownLatch(1);ZooKeeper zk = new ZooKeeper(CONNECTION_STRING, SESSION_TIMEOUT, new Watcher() {@Overridepublic void process(WatchedEvent event) {if (event.getState() == Event.KeeperState.SyncConnected) {latch.countDown();}}});latch.await();// 可以在这里进行对 znode 的操作zk.close();}
}
- 节点类型
ZooKeeper 有四种类型的 znode:
节点类型 | 描述 |
---|---|
PERSISTENT | 持久节点,客户端断开连接后仍然存在。 |
EPHEMERAL | 临时节点,客户端会话结束时被删除。 |
PERSISTENT_SEQUENTIAL | 持久顺序节点,创建时自动生成序列号。 |
EPHEMERAL_SEQUENTIAL | 临时顺序节点,客户端会话结束时被删除,并包含序列号。 |
-
Watcher 机制
ZooKeeper 允许客户端在 znode 上注册 Watcher,当 znode 发生变化时,如数据变更或子节点变化,ZooKeeper 会通知所有注册了 Watcher 的客户端。 -
ACL 权限控制
ZooKeeper 提供了访问控制,类似于 UNIX 文件系统的权限控制。 -
Leader 选举
ZooKeeper 集群中的节点分为领导者(Leader)和跟随者(Follower)。Leader 负责处理客户端请求,Follower 则接收客户端请求并转发给 Leader。Leader 选举是 ZooKeeper 运行的基础。 -
ZAB 协议
ZooKeeper 使用 ZAB(ZooKeeper Atomic Broadcast)协议来保证数据的一致性。ZAB 有两种模式:恢复模式和广播模式。- 恢复模式:这个阶段发生在服务启动或当前领导者崩溃后。目的是选举出一个新的领导者,并确保所有服务器与新的领导者的数据状态同步。在恢复模式下,集群不能处理客户端的事务请求,直到选出新的领导者并且集群状态同步完成。
- 广播模式:这个阶段在领导者被选举出来,并且大多数服务器与领导者完成状态同步后开始。领导者开始接收并广播来自客户端的事务请求到所有服务器。所有非领导者服务器接收并处理这些事务,然后将结果返回给领导者。领导者确保所有事务按照顺序被处理,并保持集群中的数据一致性。
-
事务 ID(ZXID)
ZooKeeper 使用递增的事务 ID 来标识操作,确保操作的顺序性和一致性。
三、ZooKeeper 的应用场景
-
配置管理
作为配置中心,统一管理集群中所有节点的配置信息,支持动态更新和实时通知。 -
服务注册与发现
作为服务注册中心,服务提供者注册服务地址,服务消费者查询并调用服务。 -
负载均衡
通过 ZooKeeper 的临时顺序节点实现客户端的负载均衡。- 服务注册:每个服务提供者在启动时,会在 ZooKeeper 上的指定节点下创建一个临时顺序节点。
- 节点特性:临时节点如果服务提供者实例崩溃或与 ZooKeeper 失去连接,ZooKeeper 会自动删除该节点;顺序节点每个节点会被分配一个唯一的序列号,保证节点创建的全局顺序性。
- 服务列表获取:客户端通过查询指定节点来获取所有子节点,这些子节点代表了当前可用的服务提供者。
- 负载均衡策略:常见的策略包括轮询、随机、最少连接等。
- 服务选择:客户端根据选择的策略,通过子节点的序列号来确定具体连接到哪个服务提供者。
- 服务调用:客户端与选定的服务提供者建立连接并调用服务。
- 动态更新:当有新的服务提供者加入或现有服务提供者下线时,ZooKeeper 的 Watcher 机制可以通知客户端服务列表的变化。
- 容错处理:如果客户端正在使用的服务提供者突然下线,由于 ZooKeeper 会删除对应的临时节点,客户端可以通过 Watcher 获得通知,并重新选择其他服务提供者。
-
集群管理
监控集群中机器的状态,实现机器上下线感知。 -
Master 选举
在多个服务实例中选举出一个 Master 节点来处理特定任务。 -
分布式锁
利用 ZooKeeper 的临时节点和顺序节点实现分布式锁,保证资源的互斥访问。- 创建临时顺序节点:当一个客户端需要获取分布式锁时,它会向 ZooKeeper 的指定路径创建一个临时顺序节点。ZooKeeper 会为这个节点分配一个全局唯一的序列号。
- 获取子节点列表:客户端获取该路径下所有子节点的列表,并检查自己创建的节点是否是所有临时顺序节点中序号最小的一个。
- 判断是否获取锁:如果是,客户端成功获取锁,可以执行相应的业务逻辑;如果不是,客户端需要找到比自己序号小 1 的节点,并在该节点上注册一个 Watcher,用于监听节点的变化。
- 等待锁释放:如果客户端没有获取到锁,它会等待 Watcher 触发。当前面的节点被删除时,Watcher 会被触发,客户端会收到通知。
- 重试获取锁:一旦 Watcher 被触发,客户端需要重新执行步骤 2 和步骤 3,以判断自己是否能够获取锁。
- 执行业务逻辑:当客户端成功获取锁后,它就可以执行需要互斥访问的业务逻辑。
- 释放锁:业务逻辑执行完成后,客户端需要主动删除自己创建的临时顺序节点,以释放锁。
-
分布式队列
使用 ZooKeeper 的顺序节点来实现按顺序处理的队列。
四、ZooKeeper 的角色构成
- 领导者(Leader)
- 负责进行投票的发起和决议,更新系统状态。
- 处理所有事务请求,并将事务日志分发给跟随者(Follower)。
- 负责集群中数据的更新和同步。
- 跟随者(Follower)
- 接受客户端请求,如果是读请求则可以自己处理,如果是写请求则要转发给领导者。在选主过程中参与投票。
- 接收来自领导者的事务日志并更新到自己的状态中。
- 观察者(Observer)
- 可以接受客户端连接,处理读请求,并将写请求转发给领导者,但观察者不参与投票过程。
- 只同步领导者的状态,不参与选举过程。
- 目的是扩展系统,提高读取速度,不增加选举时的延迟。
- 客户端(Client)
- 请求发起方,可以连接到集群中的任何角色(领导者或跟随者),发送读写请求。
五、Observer 观察者的作用
-
不参与投票
Observer 不参与 ZooKeeper 的写操作的投票过程。在 ZooKeeper 中,写操作需要通过一个称为“ZAB”(ZooKeeper Atomic Broadcast)协议的一致性协议来确保所有服务器的数据一致性。Observer 不参与这个协议的投票过程,因此不会影响写操作的决策。 -
只读服务
Observer 主要用于提供只读服务。它们可以接收客户端的读取请求,并返回数据。由于 Observer 不参与写操作,它们可以减轻主服务器(Leader)和从服务器(Follower)的负载,提高读取操作的性能。 -
扩展读能力
在分布式系统中,读取操作通常比写入操作要频繁得多。通过添加 Observer 节点,ZooKeeper 可以扩展其读取能力,从而提高系统的整体吞吐量。 -
不影响写性能
由于 Observer 不参与写操作的投票,它们不会影响 ZooKeeper 写操作的性能。这意味着即使 Observer 节点很多,也不会降低 ZooKeeper 处理写请求的能力。 -
适用于读多写少的场景
Observer 特别适用于那些读取操作远多于写入操作的场景。例如,在配置管理系统中,配置信息可能很少改变,但是会被大量服务频繁读取。 -
提高可用性
Observer 节点可以分布在不同的服务器或数据中心,这有助于提高 ZooKeeper 服务的可用性和容错能力。 -
简化部署
在某些情况下,Observer 可以简化 ZooKeeper 集群的部署和管理,因为它们不需要参与写操作的一致性协议,因此在配置和同步方面可能更加简单。
内容 | 详情 |
---|---|
ZooKeeper 简介 | 开源分布式协调服务,提供一致性服务,设计目标是高可用、高性能、可靠存储服务 |
工作原理和算法 | 数据模型为层次化命名空间,有四种节点类型,Watcher 机制、ACL 权限控制、Leader 选举、ZAB 协议、事务 ID |
应用场景 | 配置管理、服务注册与发现、负载均衡、集群管理、Master 选举、分布式锁、分布式队列 |
角色构成 | 领导者、跟随者、观察者、客户端,各有不同职责 |
Observer 作用 | 不参与投票、提供只读服务、扩展读能力、不影响写性能、适用于读多写少场景、提高可用性、简化部署 |
嘿,亲爱的读者们!相信你们在阅读完这篇文章后,对 ZooKeeper 有了更深入的了解。如果你们有任何独特的见解、经验或者问题,欢迎在评论区分享哦!让我们一起交流学习,共同进步,把 ZooKeeper 运用得更加得心应手!😎
以下是文章内容的横向 Mermaid 思维导图:
相关文章:
【分布式微服务云原生】《ZooKeeper 深度探秘:分布式协调的强大利器》
**《ZooKeeper 深度探秘:分布式协调的强大利器》 ** 摘要:本文将深入详解 ZooKeeper,涵盖其工作原理、实现分布式锁的方法、应用场景、负载均衡的实现以及不同角色的作用等内容。读者将全面了解 ZooKeeper 的强大功能和价值,为构…...

打造高性能在线电子表格:WebGL 渲染引擎 Kola2d 自研之路
导读:本文主要阐述了 Docs 在线表格为打造极致渲染性能所做的关键优化和过程思考,作为首个在在线电子表格领域自研基于WebGL渲染引擎的「吃螃蟹」者,整个过程面临诸多不确定性与挑战,Kola2d 的整体设计在此期间也经历了几轮推倒重…...

深入理解WPF中的命令机制
Windows Presentation Foundation(WPF)是微软推出的一种用于构建桌面客户端应用程序的技术。它被认为是现代Windows应用程序的基础,具有强大的图形和媒体处理能力。在WPF中,“命令”是一个重要的概念,它为应用程序开发…...

基础算法(6)——模拟
1. 替换所有的问号 题目描述: 算法思路: 从前往后遍历整个字符串,找到问号之后,尝试用 a ~ z 的每一个字符替换即可 注意点:需考虑数组开头和结尾是问号的边界情况 代码实现: class Solution {public …...

2025年广西高考报名流程图解(手机端)
广西 2025 年高考报名时间已经确定啦,从 2024 年 10 月 21 日开始,到 10 月 31 日 17:30 结束 💻【报名路径】 有电脑端和手机端两种选择哦。 电脑端:登录 “广西招生考试院” 网站(https://www.gxeea.cn࿰…...
十、结构型(外观模式)
外观模式(Facade Pattern) 概念 外观模式(Facade Pattern)是一种结构型设计模式,旨在为复杂子系统提供一个简化的统一接口。通过外观模式,客户端可以与子系统交互,而无需了解子系统的内部复杂性…...
10.12Python数学基础-矩阵(上)
矩阵 1.矩阵定义 1.1 矩阵的定义 矩阵是由一组数按照矩形排列而成的数表。矩阵通常用大写字母表示,例如 AA、BB 等。矩阵中的每个数称为矩阵的元素或元。 一个 mn的矩阵 AA 可以表示为: A ( a 1 n a 12 … a 1 n a 21 a 22 … a 2 n ⋮ a m 1 a m 2…...

重学SpringBoot3-安装Spring Boot CLI
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-安装Spring Boot CLI 1. 什么是 Spring Boot CLI?2. Spring Boot CLI 的安装2.1. 通过 SDKMAN! 安装2.2. 通过 Homebrew 安装(适…...

代码复现(五):GCPANet
文章目录 net.py1.class Bottleneck:残差块2.class ResNet:特征提取3.class SRM:SR模块4.class FAM:FIA模块5.class CA:GCF模块6.class SA:HA模块7.class GCPANet:网络架构 train.pytest.py 论文…...

联邦学习实验复现—MNISIT IID实验 pytorch
联邦学习论文复现🚀 在精度的联邦学习的论文之后打算进一步开展写一个联邦学习的基础代码,用于开展之后的相关研究,首先就是复现一下论文中最基础也是最经典的MNIST IID(独立同分布划分) 数据集。然后由于这个联邦学习的论文是谷歌发的&#…...

2015年-2017年 计算机技术专业 程序设计题(算法题)实战_c语言程序设计数据结构程序设计分析
文章目录 20151.C语言算法设计部分2.数据结构算法设计部分 20161.C语言算法设计部分2.数据结构算法设计部分 2017年1. C语言算法设计部分2.数据结构算法设计部分 2015 1.C语言算法设计部分 int total(int n) {if(n1) return 1;return total(n-1)n1; } //主函数测试代码已省略…...

个人用计算理论导引笔记(待补充)
文章目录 一、正则语言预备知识确定性有穷自动机(DFA)设计DFA正则运算 非确定性有穷自动机(NFA,含有 ε \varepsilon ε,下一个状态可以有若干种选择(包括0种))正则表达式定义计算优…...

2024年诺贝尔物理学奖揭晓:AI背后的“造梦者”是谁?
想象一下,你早上醒来,智能音箱为你播放天气和新闻,中午你用手机刷视频,精准的推荐内容简直和你心有灵犀,晚上回家,自动驾驶汽车安全地把你送回家。这一切看似理所当然,背后却有一双无形的手推动…...

2024年AI 制作PPT新宠儿,3款神器集锦,让你的演示与众不同
咱们今儿聊聊最近超火的AI做PPT的工具。这年头,谁不想省事儿,少熬夜加班,多享受享受生活啊?所以,AI开始帮咱们搞定做PPT这种费时的活儿,我自然得好好研究研究。今天,我就给大家详细说说三款很火…...

CLion和Qt 联合开发环境配置教程(Windows和Linux版)
需要安装的工具CLion 和Qt CLion下载链接 :https://www.jetbrains.com.cn/clion/ 这个软件属于直接默认安装就行,很简单,不多做介绍了 Qt:https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/ window 直接点exe Linux 先c…...
Qt记录使用QtAwesome
Qt记录使用QtAwesome 基本使用 基本使用 pro文件添加 CONFIG fontAwesomeFree include(QtAwesome/QtAwesome.pri) //实例化QtAwesome fa::QtAwesome* awesome new fa::QtAwesome(this); awesome->initFontAwesome();//设置外置适应 图标ICON的颜色color QVariantMap opt…...
ES6新增promise(异步编程新解决方案)如何封装ajax?
1.什么是异步? 异步是指从程序在运行过程中可以先执行其他操作。 2.什么是promise? Promise 是 ES6 引入的异步编程的新解决方案。语法上 Promise 是一个构造函数,用来封装异步 操作并可以获取其成功或失败的结果; 3.promise成功…...

Kubernetes--深入理解Service与CoreDNS
文章目录 Service功能Service 的常见使用场景 Service的模式iptablesIPVS Service类型ClusterIPNodePortLoadBalancerExternalName Service的工作机制EndpointEndpoint 与 Service 的关系Endpoint 的工作原理命令操作 CoreDNSCoreDNS 的配置CoreDNS 的典型插件Corefile 示例Cor…...

AI大模型:开启智能革命新纪元
1.AI大模型技术:智能革命的新引擎 自2022年11月30日OpenAI推出ChatGPT以来,这一大型语言模型(LLM)迅速走红,标志着AI领域进入了一个新的发展阶段,即AI大模型时代。 这一时代预示着AI正朝着通用人工智能&am…...

快速上手C语言【下】(非常详细!!!)
目录 1. 指针 1.1 指针是什么 1.2 指针类型 1.2.1 指针-整数 1.2.2 指针解引用 1.3 const修饰 1.4 字符指针 1.5 指针-指针 1.6 二级指针 2. 数组 2.1 定义和初始化 2.2 下标引用操作符[ ] 2.3 二维数组 2.4 终极测试 3. 函数 3.1 声明和定义 3.2 传值调用…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...