ZooKeeper 典型应用:命名服务&分布式锁|学习笔记

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,182元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 快速学习 ZooKeeper 典型应用:命名服务&分布式锁

开发者学堂课程【大数据 ZooKeeper 快速入门 ZooKeeper 典型应用:命名服务&分布式锁】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/549/detail/7575


ZooKeeper 典型应用:命名服务&分布式锁


内容介绍

一、命名服务(Naming Service)

二、分布式锁

三、控制时序

 

一、命名服务(Naming Service)

在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。

被命名的实体通常可以是集群中的机器,提供的服务地址,远程对象等等,这些都可以统称为名字(Name)。

其中较为常见的就是一些分布式服务框架中的服务地址列表。

通过调用ZK提供的创建节点的 API,能够很容易创建一个全局唯一的 path,这个path 就可以作为一个名称。

阿里巴巴集团开源的分布式服务框架 Dubbo 中使用 ZooKeeper 来作为其命名服务,维护全局的服务地址列表。

一个服务的提供者发布服务的时候,Dubbo 会把相应的地址注册到 ZooKeeper 中,因为在 ZooKeeper 中路径是全局唯一的。

比如不可能创建一摸一样的节点在两个路径下或者在同一路径下节点不可能重复。

因为全局路径的唯一性,所以导致路径和发布的服务形成一对一的映射,这样通过路径就可以找到发布的服务,就完成了服务的注册,服务使用者通过API就可以获取到路径,从而获取到对应的服务地址,这样就完成了命名服务。

 

二、分布式锁

锁主要体现在比如多个线程,人们同时在获取一个数据,这时如果没有锁的控制,势必会造成紊乱现象。

在分布式状态下也会造成这种情况,比如在分布式应用,人们都想要操作一块数据,如果两个人同时进行,这时候问题就出现了。

分布式锁,这个主要得益于 ZooKeeper 保证了数据的强一致性。

锁服务可以分为两类一个是保持独占,另一个是控制时序。

所谓保持独占,就是所有试图来获取这个锁的客户端,最终只有一个可以成功获得这把锁。

通常的做法是把 zk 上的一个 znode 看作是一把锁,通过

createznode 的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。

比如在集群中有很多的应用,这些应用要同时去操纵一些数据,如果没有所谓的锁控制,都去操作这个文件,势必造成文件紊乱性,如下:

比如应用a对数据做删除操作,应用c修改,应用 b 获取,数据就会出现章数据的发生。

这时用 ZooKeeper 就可以完成分布式锁的功能,在获取之前要求所有应用先去 zk 上指定目录创建节点/aaa

都去创建节点,但只能有一个创建成功,比如应用 b 因为网络关系,连接比较快,连上后先创建了一个 a,这时候其他应用再去创建结点的时候,因为现在节点已经存在,所以就会报错。节点要求:要求是临时节点并且是非序列化。

比如这时,b 应用连接到zk集群创建了节点,这时在路径下就有了一个/aaa 节点,这时其他应用创建节点就会失败,相当于谁创建成功,谁就获得访问数据文件的权限,如下:

image.png

因为应用b获得了目录创建的权限,因此应用b就有权限去获得数据文件的相关操作,操作完成后需要将锁释放,所以操作完成后断开跟 zk 的链接。

一旦断开连接,临时节点就会被删除,其他应用如果需要操作这个文件的话,就去监听这个目录是否存在。

因为可以设置监听目录是否存在,就会造成比如应用a发现节点已经存在了,那么就设置一个监听,当节点删除的时候应用 a 可以获取到监听,之后再去创建。

这样就完成了保持在同一时刻只有一个应用可以获取到目录的创建能力,哪个应用创建成功,就拥有了一把锁,这是一个抽象地表示。

 

三、控制时序

控制时序,就是所有试图来获取这个锁的客户端,最终都是会被安排执行,只是有个全局时序了。做法和上面基本类似,只是这里 /distribute_lock 已经预先存在,客户端在它下面创建临时有序节点(这个可以通过节点的属性控

制:CreateMode.EPHEMERAL_SEQUENTIAL来指定)。

Zk的父节点(/distribute_lock)维持一份sequence,保证子节点创建的时序性,从而也形成了每个客户端的全局时序。

比如从大到小、从小到大,还是在路径下创建节点,开启序列化特性就会出现应用 a 创建第一个编号为00000,下一个应用 c 创建编号为00001,再下一个应用b是00002,要想控制时序就可以根据编号进行排版。

比如谁的编号最小谁优先访问,那么应用 a 先访问,接着是应用c、应用b,通过序列化特性就完成了时序性,在时间上有先后的顺序。

创建节点如果想满足于使用完成后就消除的话,那么就要把节点创建成序列化短站,比如应用 a 访问之后断开连接,那么节点就消除,如果应用 a 想再次访问,再次创建节点,这时就变为了00003,就排在这些节点的后面。

通过这两种方式可以在 ZooKeeper 中实现分布式锁的应用,前提是要把 ZooKeeper 核心,节点类型以及机制搞清楚。

相关文章
|
5月前
|
安全 JavaScript 前端开发
HarmonyOS NEXT~HarmonyOS 语言仓颉:下一代分布式开发语言的技术解析与应用实践
HarmonyOS语言仓颉是华为专为HarmonyOS生态系统设计的新型编程语言,旨在解决分布式环境下的开发挑战。它以“编码创造”为理念,具备分布式原生、高性能与高效率、安全可靠三大核心特性。仓颉语言通过内置分布式能力简化跨设备开发,提供统一的编程模型和开发体验。文章从语言基础、关键特性、开发实践及未来展望四个方面剖析其技术优势,助力开发者掌握这一新兴工具,构建全场景分布式应用。
492 35
|
4月前
|
分布式计算 Java 大数据
Java 大视界 —— 基于 Java 的大数据分布式计算在气象数据处理与天气预报中的应用进展(176)
本文围绕基于 Java 的大数据分布式计算在气象数据处理与天气预报中的应用展开,剖析行业现状与挑战,阐释技术原理,介绍其在数据处理及天气预报中的具体应用,并结合实际案例展示实施效果。
Java 大视界 -- 基于 Java 的大数据分布式存储在视频监控数据管理中的应用优化(170)
本文围绕基于 Java 的大数据分布式存储在视频监控数据管理中的应用展开,分析管理现状与挑战,阐述技术应用,结合案例和代码给出实操方案。
|
10月前
|
存储 SpringCloudAlibaba Java
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论。
【SpringCloud Alibaba系列】一文全面解析Zookeeper安装、常用命令、JavaAPI操作、Watch事件监听、分布式锁、集群搭建、核心理论
|
8月前
|
机器学习/深度学习 存储
DeepSeek进阶开发与应用4:DeepSeek中的分布式训练技术
随着深度学习模型和数据集规模的扩大,单机训练已无法满足需求,分布式训练技术应运而生。DeepSeek框架支持数据并行和模型并行两种模式,通过将计算任务分配到多个节点上并行执行,显著提高训练效率。本文介绍DeepSeek中的分布式训练技术,包括配置与启动方法,帮助用户轻松实现大规模模型训练。数据并行通过`MirroredStrategy`同步梯度,适用于大多数模型;模型并行则通过`ParameterServerStrategy`异步处理大模型。DeepSeek简化了分布式环境配置,支持单机多卡和多机多卡等场景。
|
11月前
|
存储 运维 NoSQL
分布式读写锁的奥义:上古世代 ZooKeeper 的进击
本文作者将介绍女娲对社区 ZooKeeper 在分布式读写锁实践细节上的思考,希望帮助大家理解分布式读写锁背后的原理。
270 11
|
11月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
196 5
|
12月前
|
Dubbo 应用服务中间件 Apache
Dubbo 应用切换 ZooKeeper 注册中心实例,流量无损迁移
如果 Dubbo 应用使用 ZooKeeper 作为注册中心,现在需要切换到新的 ZooKeeper 实例,如何做到流量无损?
135 4
|
12月前
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
|
12月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
786 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。

热门文章

最新文章