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,最近…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
