【分布式微服务云原生】《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 传值调用…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
