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 应用场景深度解析
✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 目录 引言 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中,变量和常量有一些基本的概念和用法,但需要注意的是,Python本身并没有内置的“常量”类型。然而,程序员通常会遵循一种约定,即使用全部大写的变量名来表示常量。 一、变量 在Python中,变量是一…...

豆包文科成绩超了一本线,为什么理科不行?
卡奥斯智能交互引擎是卡奥斯基于海尔近40年工业生产经验积累和卡奥斯7年工业互联网平台建设的最佳实践,基于大语言模型和RAG技术,集合海量工业领域生态资源方优质产品和知识服务,旨在通过智能搜索、连续交互,实时生成个性化的内容…...
Java多线程编程实践中的常见问题与解决方案
Java多线程编程实践中的常见问题与解决方案 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! **1. **引言 Java多线程编程是现代软件开发中不可或缺的一部分&a…...

WebStorm配置路径别名(jsconfig.json)
项目是 ViteVueTs 新建一个 jsconfig.json文件 {"compilerOptions": {"baseUrl": ".","paths": {"/*": ["./src/*"]}},"exclude": ["node_modules", "dist"] }然后在 vite.confi…...

[吃瓜教程]南瓜书第4章决策树
1.决策树的算法原理 从逻辑角度,条件判断语句的组合;从几何角度,根据某种准则划分特征空间; 是一种分治的思想,其最终目的是将样本约分约纯,而划分的核心是在条件的选择或者说是**特征空间的划分标准 ** …...
Redis 面试题完整指南:深度解析基础、进阶与高级功能
基础知识 1. 什么是Redis? Redis(Remote Dictionary Server)是一个开源的、基于内存的数据结构存储系统,既可以用作数据库、缓存,也可以用作消息中间件。它支持多种数据结构,如字符串、哈希、列表、集合、…...
spring 枚举、策略模式、InitializingBean初使化组合使用示例
实现一个简单的文本处理系统。 在这个系统中,我们将定义不同类型的文本处理策略,比如大小写转换、添加前缀后缀等,并使用工厂模式来管理这些策略。 1 定义一个枚举来标识不同的文本处理类型 public enum TextProcessTypeEnum {UPPER_CASE,LO…...

嵌入式学习——硬件(IIC、ADC)——day56
1. IIC 1.1 定义(同步串行半双工通信总线) IIC(Inter-Integrated Circuit)又称I2C,是是IICBus简称,所以中文应该叫集成电路总线。是飞利浦公司在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)
打开终端(在Unix或macOS上)或命令提示符/Anaconda Prompt(在Windows上)。 创建一个名为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的窗口了解哪些,都有什么区别,有哪几种?如何定义? Flink窗口函数,时间语义相关的问题 介绍下Flink的watermark(水位线),watermark需要实现哪个实现类,在何处定义?有什么作用? 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更新数据,不用put!4、delete删除数据 总结 在supabase中获取API地址和key 首先登录dashboard后台,首页- 右…...

微信小程序毕业设计-英语互助系统项目开发实战(附源码+论文)
大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…...

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第49课-机器人自动跳舞
【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第49课-机器人自动跳舞 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎…...
【LLM教程-llama】如何Fine Tuning大语言模型?
今天给大家带来了一篇超级详细的教程,手把手教你如何对大语言模型进行微调(Fine Tuning)!(代码和详细解释放在后文) 目录 大语言模型进行微调(Fine Tuning)需要哪些步骤? 大语言模型进行微调(Fine Tuning)训练过程及代码 大语言…...

PHP 比 Java 的开发效率高在哪?
在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「JAVA的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!做了几年PHP,最近…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...