当前位置: 首页 > news >正文

ZooKeeper 应用场景深度解析

 
✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 
                                               🎈🎈作者主页: 喔的嘛呀🎈🎈

目录

引言

1. 分布式配置管理

2. 分布式锁

3. 分布式队列

4. 分布式协调

5. 分布式协同

6、数据发布与订阅

7、命名服务

8、集群管理

结论


引言

ZooKeeper 是一个分布式协调服务,被广泛应用于构建高可用、可靠性强的分布式系统。它提供了一组简单而强大的原语,用于解决分布式系统中常见的协调和同步问题。在本文中,我们将深入探讨 ZooKeeper 的多个应用场景,为读者呈现 ZooKeeper 在实际项目中的卓越价值。

1. 分布式配置管理

在分布式系统中,配置的一致性和动态更新是系统稳定性的基石。ZooKeeper 可用于实现分布式配置管理,将系统配置信息集中存储在 ZooKeeper 的节点上。通过以下代码示例,展示了 ZooKeeper 如何实现分布式配置管理:

// 创建 ZooKeeper 客户端
ZooKeeper zk = new ZooKeeper("localhost:2181", 5000, null);// 创建配置节点
String configPath = "/distributed-config";
if (zk.exists(configPath, false) == null) {zk.create(configPath, "initialConfig".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}// 获取配置
byte[] configData = zk.getData(configPath, false, null);
String config = new String(configData);
System.out.println("Current configuration: " + config);// 更新配置
zk.setData(configPath, "newConfig".getBytes(), -1);
System.out.println("Configuration updated.");// 关闭 ZooKeeper 客户端
zk.close();

这个示例不仅展示了如何创建配置节点、获取当前配置,还演示了如何动态更新配置,确保系统在运行时能够实时调整配置。

2. 分布式锁

在分布式环境下,资源的互斥访问是一项关键挑战。ZooKeeper 提供了临时有序节点的特性,可以基于此实现分布式锁。以下是一个简单的 Java 实现:

// 创建 ZooKeeper 客户端
ZooKeeper zk = new ZooKeeper("localhost:2181", 5000, null);// 创建锁节点
String lockPath = "/distributed-lock";
String lockNode = zk.create(lockPath + "/lock-", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);// 获取锁节点列表
List<String> children = zk.getChildren(lockPath, false);// 判断是否获得锁
Collections.sort(children);
if (lockNode.equals(lockPath + "/" + children.get(0))) {System.out.println("Lock acquired.");// 执行业务逻辑
} else {System.out.println("Waiting for the lock.");// 等待锁释放
}// 释放锁
zk.delete(lockNode, -1);
System.out.println("Lock released.");// 关闭 ZooKeeper 客户端
zk.close();

这个示例演示了如何基于 ZooKeeper 实现分布式锁,确保在分布式环境中资源的有序访问,避免竞态条件。

3. 分布式队列

ZooKeeper 可以用于实现分布式队列,通过有序节点的特性实现队列的有序访问。以下是一个简单的队列实现示例:

// 创建 ZooKeeper 客户端
ZooKeeper zk = new ZooKeeper("localhost:2181", 5000, null);// 创建队列节点
String queuePath = "/distributed-queue";
String queueNode = zk.create(queuePath + "/node-", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);// 获取队列节点列表
List<String> queueNodes = zk.getChildren(queuePath, false);// 模拟入队操作
System.out.println("Enqueue: " + queueNode);// 模拟出队操作
Collections.sort(queueNodes);
String firstNode = queueNodes.get(0);
System.out.println("Dequeue: " + queuePath + "/" + firstNode);// 关闭 ZooKeeper 客户端
zk.close();

这个例子展示了如何使用 ZooKeeper 创建分布式队列,确保队列中的元素按照有序方式进行操作。

4. 分布式协调

ZooKeeper 还可用于一般的分布式协调任务,如领导者选举、集群成员管理等。以下是一个简单的领导者选举示例:

// 创建 ZooKeeper 客户端
ZooKeeper zk = new ZooKeeper("localhost:2181", 5000, null);// 创建选举节点
String electionPath = "/leader-election";
String electionNode = zk.create(electionPath + "/node-", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);// 获取选举节点列表
List<String> electionNodes = zk.getChildren(electionPath, false);// 判断是否成为领导者
Collections.sort(electionNodes);
if (electionNode.equals(electionPath + "/" + electionNodes.get(0))) {System.out.println("Leader elected.");// 执行领导者逻辑
} else {System.out.println("Waiting for leader election.");// 等待新的领导者产生
}// 关闭 ZooKeeper 客户端
zk.close();

这个示例展示了如何使用 ZooKeeper 实现领导者选举,确保系统中只有一个节点担任领导者职责,维护系统的稳定性。

5. 分布式协同

除了以上场景,ZooKeeper 还被广泛应用于分布式协同任务,例如分布式计算、任务调度等。其强大的同步原语使得多个节点能够协同工作,保证系统的一致性和可靠性。

6、数据发布与订阅


发布与订阅即所谓的配置管理,顾名思义就是将数据发布到ZooKeeper节点上,供订阅者动态获取
数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,地址列表等就非常适合使
用。数据发布/订阅的一个常见的场景是配置中心,发布者把数据发布到 ZooKeeper 的一个或一系列的节点上,供订阅者进行数据订阅,达到动态获取数据的目的。

配置信息一般有几个特点:
1. 数据量小的KV
2. 数据内容在运行时会发生动态变化
3. 集群机器共享,配置一致
ZooKeeper 采用的是推拉结合的方式。
1. 推: 服务端会推给注册了监控节点的客户端 Wathcer 事件通知
2. 拉: 客户端获得通知后,然后主动到服务端拉取最新的数据

7、命名服务

作为分布式命名服务,命名服务是指通过指定的名字来获取资源或者服务的地址,利用ZooKeeper
创建一个全局的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或
者一个远程的对象等等。

1、在分布式环境下,经常需要对应用/服务进行统一命名,便于识别不同服务。类似于域名与IP之间对应关系,IP不容易记住,而域名容易记住。通过名称来获取资源或服务的地址,提供者等信息。
2、按照层次结构组织服务/应用名称。可将服务名称以及地址信息写到ZooKeeper上,客户端通过ZooKeeper获取可用服务列表类。

8、集群管理

所谓集群管理就是:是否有机器退出和加入、选举master。
集群管理主要指集群监控和集群控制两个方面。前者侧重于集群运行时的状态的收集,后者则是对
集群进行操作与控制。开发和运维中,面对集群,经常有如下需求:
1. 希望知道集群中究竟有多少机器在工作
2. 对集群中的每台机器的运行时状态进行数据收集
3. 对集群中机器进行上下线的操作

1、分布式环境中,实时掌握每个节点的状态是必要的,可根据节点实时状态做出一些调整。
2、可交由ZooKeeper实现。可将节点信息写入ZooKeeper上的一个Znode。监听这个Znode可获取它的实时状态变化。
3、典型应用
Hbase中Master状态监控与选举。利用ZooKeeper的强一致性,能够保证在分布式高并发情况下节点创建的全局唯一性,即:同时有多个客户端请求创建 /currentMaster 节点,最终一定只有一个客户端请求能够创建成功

结论

本文详细解析了 ZooKeeper 在分布式系统中的多个应用场景,包括分布式配置管理、分布式锁、分布式队列、分布式协调以及分布式协同。通过图解和代码示例,读者可以深入了解 ZooKeeper 的灵活性和实用性,为构建高可用、稳定的分布式系统提供了有力支持。希望本文对读者理解和应用 ZooKeeper 时有所帮助。

相关文章:

ZooKeeper 应用场景深度解析

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 1.…...

动手学深度学习(Pytorch版)代码实践 -计算机视觉-41目标检测数据集

41目标检测数据集 import os import pandas as pd import torch import torchvision import matplotlib.pylab as plt from d2l import torch as d2l# 数据集下载链接 # http://d2l-data.s3-accelerate.amazonaws.com/banana-detection.zip# 读取数据集 #save def read_data_b…...

2.2章节python的变量和常量

在Python中&#xff0c;变量和常量有一些基本的概念和用法&#xff0c;但需要注意的是&#xff0c;Python本身并没有内置的“常量”类型。然而&#xff0c;程序员通常会遵循一种约定&#xff0c;即使用全部大写的变量名来表示常量。 一、变量 在Python中&#xff0c;变量是一…...

豆包文科成绩超了一本线,为什么理科不行?

卡奥斯智能交互引擎是卡奥斯基于海尔近40年工业生产经验积累和卡奥斯7年工业互联网平台建设的最佳实践&#xff0c;基于大语言模型和RAG技术&#xff0c;集合海量工业领域生态资源方优质产品和知识服务&#xff0c;旨在通过智能搜索、连续交互&#xff0c;实时生成个性化的内容…...

Java多线程编程实践中的常见问题与解决方案

Java多线程编程实践中的常见问题与解决方案 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; **1. **引言 Java多线程编程是现代软件开发中不可或缺的一部分&a…...

WebStorm配置路径别名(jsconfig.json)

项目是 ViteVueTs 新建一个 jsconfig.json文件 {"compilerOptions": {"baseUrl": ".","paths": {"/*": ["./src/*"]}},"exclude": ["node_modules", "dist"] }然后在 vite.confi…...

[吃瓜教程]南瓜书第4章决策树

1.决策树的算法原理 从逻辑角度&#xff0c;条件判断语句的组合&#xff1b;从几何角度&#xff0c;根据某种准则划分特征空间&#xff1b; 是一种分治的思想&#xff0c;其最终目的是将样本约分约纯&#xff0c;而划分的核心是在条件的选择或者说是**特征空间的划分标准 ** …...

Redis 面试题完整指南:深度解析基础、进阶与高级功能

基础知识 1. 什么是Redis&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、基于内存的数据结构存储系统&#xff0c;既可以用作数据库、缓存&#xff0c;也可以用作消息中间件。它支持多种数据结构&#xff0c;如字符串、哈希、列表、集合、…...

spring 枚举、策略模式、InitializingBean初使化组合使用示例

实现一个简单的文本处理系统。 在这个系统中&#xff0c;我们将定义不同类型的文本处理策略&#xff0c;比如大小写转换、添加前缀后缀等&#xff0c;并使用工厂模式来管理这些策略。 1 定义一个枚举来标识不同的文本处理类型 public enum TextProcessTypeEnum {UPPER_CASE,LO…...

嵌入式学习——硬件(IIC、ADC)——day56

1. IIC 1.1 定义&#xff08;同步串行半双工通信总线&#xff09; IIC&#xff08;Inter-Integrated Circuit&#xff09;又称I2C&#xff0c;是是IICBus简称&#xff0c;所以中文应该叫集成电路总线。是飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备…...

vCenter VXR01405C ALARM Certificate is about to expire

vCenter VXR01405C ALARM Certificate is about to expire 需要更新证书 步骤如下 ===vCenter=== root@vc [ ~ ]# for i in $(/usr/lib/vmware-vmafd/bin/vecs-cli store list); do echo STORE $i; sudo /usr/lib/vmware-vmafd/b STORE MACHINE_SSL_CERT Alias : __MACHINE…...

安装和微调大模型(基于LLaMA-Factory)

打开终端&#xff08;在Unix或macOS上&#xff09;或命令提示符/Anaconda Prompt&#xff08;在Windows上&#xff09;。 创建一个名为lora的虚拟环境并指定Python版本为3.9。 https://github.com/echonoshy/cgft-llm/blob/master/llama-factory/README.mdGitHub - hiyouga/…...

使用docker搭建squid和ss5

docker run -d --name squid-container -e TZAsia/Shanghai -p 自定义端口并记得开放:3128 ubuntu/squid docker exec -it squid-container /bin/bash apt update && apt install vim # 修改 http_port 3128 为 http_port 0.0.0.0:3128 # 修改 http_access deny all 为…...

大数据面试题之Flink(1)

目录 Flink架构 Flink的窗口了解哪些&#xff0c;都有什么区别&#xff0c;有哪几种?如何定义? Flink窗口函数&#xff0c;时间语义相关的问题 介绍下Flink的watermark(水位线)&#xff0c;watermark需要实现哪个实现类&#xff0c;在何处定义?有什么作用? Flink的…...

策略模式、工厂模式和模板模式的应用

1、策略模式、工厂模式解决if else Cal package com.example.dyc.cal;import org.springframework.beans.factory.InitializingBean;public interface Cal extends InitializingBean {public Integer cal(Integer a, Integer b); }Cal工厂 package com.example.dyc.cal;impo…...

在postman中调试supabase的API接口

文章目录 在supabase中获取API地址和key知道它的restfull风格在postman中进行的设置1、get请求调试2、post新增用户调试3、使用patch更新数据&#xff0c;不用put&#xff01;4、delete删除数据 总结 在supabase中获取API地址和key 首先登录dashboard后台&#xff0c;首页- 右…...

微信小程序毕业设计-英语互助系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…...

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第49课-机器人自动跳舞

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第49课-机器人自动跳舞 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎…...

【LLM教程-llama】如何Fine Tuning大语言模型?

今天给大家带来了一篇超级详细的教程,手把手教你如何对大语言模型进行微调(Fine Tuning)&#xff01;&#xff08;代码和详细解释放在后文&#xff09; 目录 大语言模型进行微调(Fine Tuning)需要哪些步骤&#xff1f; 大语言模型进行微调(Fine Tuning)训练过程及代码 大语言…...

PHP 比 Java 的开发效率高在哪?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「JAVA的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;做了几年PHP&#xff0c;最近…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...