Java ZooKeeper分布式锁实现图解
什么是分布式锁
1、在我们进行单机应用开发,涉及并发同步的时候,我们往往采用synchronized或者Lock的方式来解决多线程间的代码同步问题,这时多线程的运行都是在同一个JVM之下,没有任何问题。
2、但当我们的应用是分布式集群工作的情况下,属于多JVM下的工作环境(多台机器),跨JVM之间已经无法通过多线程的锁解决同步问题。那么就需要一种更加高级的锁机制,来处理种跨机器的进程之间的数据同步问题——这就是分布式锁。(多节点从分布式组件中获取锁)
例如以下实例:
各种抢票软件客户端通过zookeeper获取锁,最终只有一个客户端可以获得锁并且先与12306服务器进行数据通信,最终和12306数据库服务器通行。通信完毕之后释放锁,其他客户端获取锁之后执行同样的操作。(显然前提是这几个客户端都通过负载均衡后均与节点集群中同一个服务器进行通信)
3、其他分布式锁
zookeeper分布式锁原理
核心思想:当客户端要获取锁,则创建节点,使用完锁,则删除该节点。
1、客户端获取锁时,在lock节点下创建临时顺序节点。
2、然后获取lock下面的所有子节点,客户端获取到所有的子节点之后,如果发现自己创建的子节点序号最小,那么就认为该客户端获取到了锁。使用完锁后,将该节点删除。
注意:
创建临时节点的原因:
如果某个已经获取锁了的节点发生宕机,如果是持久化节点,那么锁就无法释放。如果是临时节点,在发生宕机后,连接断开会自动释放锁。
创建顺序节点的原因:
将节点按顺序编号,客户端通过节点编号判断自己是否是序号最小的节点,并且获得锁。
3、如果发现自己创建的节点并非lock所有子节点中最小的,说明自己还没有获取到锁,此时客户端需要找到比自己小的那个节点,同时对其注册事件监听器,监听删除事件。
4、如果发现比自己小的那个节点被删除,则客户端的 Watcher会收到相应通知,此时再次判断自己创建的节点是否是lock子节点中序号最小的,如果是则获取到了锁, 如果不是则重复以上步骤继续获取到比自己小的一个节点并注册监听。
到此这篇关于Java ZooKeeper分布式锁实现图解的文章就介绍到这了,更多相关Java ZooKeeper内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
java使用zookeeper实现的分布式锁示例
使用zookeeper实现的分布式锁 分布式锁,实现了Lock接口 复制代码 代码如下: package com.concurrent; import java.io.IOException;import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.concurrent.CountDownLatch;import java.util.concurrent.TimeU
-
浅谈Java(SpringBoot)基于zookeeper的分布式锁实现
通过zookeeper实现分布式锁 1.创建zookeeper的client 首先通过CuratorFrameworkFactory创建一个连接zookeeper的连接CuratorFramework client public class CuratorFactoryBean implements FactoryBean<CuratorFramework>, InitializingBean, DisposableBean { private static final Logger LOGG
-
java连接zookeeper的3种方式小结
目录 java连接zookeeper3种方式 1.使用zookeeper原始api 2.使用ZkClient客户端连接,这种连接比较简单 3.使用curator连接 Java集成zookeeper笔记 一.引入zookeeper-3.4.5.jar(原生zk包) 二.手写ZookeeperBase.java java连接zookeeper3种方式 1.使用zookeeper原始api public class Demo { private static String ip = "192.168.
-
解决java连接zookeeper很慢的问题
目录 java连接zookeeper很慢 记一次惨痛的zookeeper连接教训 java连接zookeeper很慢 最近在学习zookeeper,但是在连接zookeeper服务端时很慢,每次都超过18s 在头条尝试搜索了一下这个问题,找到了答案 原因是在服务器端集群时,设置的host是使用hostname,而不是ip,且客户端没有配置hostname和ip的映射导致的问题, 在客户端加上第一张图中的ip映射关系即可,或者把服务端的server中的hostname换成ip即可 记一次惨痛的zo
-
java Zookeeper简述
目录 Zookeeper 角色 Leader Follower Observer Zookeeper 工作原理(原子广播) Znode 四种形式的目录节点 ZooKeeper 安装和使用 常用命令 总结 Zookeeper 是一个分布式协调服务,可用于服务发现,分布式锁,分布式领导选举,配置管理等.Zookeeper 提供了一个类似于 Linux 文件系统的树形结构(可认为是轻量级的内存文件系统,但只适合存少量信息,完全不适合存储大量文件或者大文件),同时提供了对于每个节点的监控通知机制. Zo
-
ZooKeeper官方文档之Java案例解读
目录 需求理解 举例类比 Executor和DataMonitor 内部类和接口 Executor: DataMonitor: 继承关系 Executor: DataMonitor: 引用关系 Executor: DataMonitor: 图解 文档原文连接:http://zookeeper.apache.org/doc/current/javaExample.html#sc_completeSourceCode 翻译连接:https://www.jb51.net/article/236127.
-
ZooKeeper官方文档之Java客户端开发案例翻译
目录 一个简单的监听客户端 需求 程序设计 Executor类 DataMonitor类 完整代码清单 官网原文标题<ZooKeeper Java Example> 官网原文地址:http://zookeeper.apache.org/doc/current/javaExample.html#sc_completeSourceCode 针对本篇翻译文章,我还有一篇对应的笔记<ZooKeeper官方Java例子解读>,如果对官网文档理解有困难,可以结合我的笔记理解. 一个简单的监听客
-
java连接zookeeper实现zookeeper教程
目录 java连接zookeeper实现zookeeper Java服务端连接Zookeeper,进行节点信息的获取,管理-整理成一个基本工具 添加依赖: <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.3.6</version> </dependency> 具体
-
Java ZooKeeper分布式锁实现图解
什么是分布式锁 1.在我们进行单机应用开发,涉及并发同步的时候,我们往往采用synchronized或者Lock的方式来解决多线程间的代码同步问题,这时多线程的运行都是在同一个JVM之下,没有任何问题. 2.但当我们的应用是分布式集群工作的情况下,属于多JVM下的工作环境(多台机器),跨JVM之间已经无法通过多线程的锁解决同步问题.那么就需要一种更加高级的锁机制,来处理种跨机器的进程之间的数据同步问题--这就是分布式锁.(多节点从分布式组件中获取锁) 例如以下实例: 各种抢票软件客户端通过zoo
-
分析ZooKeeper分布式锁的实现
目录 一.分布式锁方案比较 二.ZooKeeper实现分布式锁 2.1.方案一 2.2.方案二 一.分布式锁方案比较 方案 实现思路 优点 缺点 利用 MySQL 的实现方案 利用数据库自身提供的锁机制实现,要求数据库支持行级锁 实现简单 性能差,无法适应高并发场景:容易出现死锁的情况:无法优雅的实现阻塞式锁 利用 Redis 的实现方案 使用 Setnx 和 lua 脚本机制实现,保证对缓存操作序列的原子性 性能好 实现相对复杂,有可能出现死锁:无法优雅的实现阻塞式锁 利用 ZooKeeper
-
C# 实现Zookeeper分布式锁的参考示例
目录 分布式锁 Zookeeper分布式锁原理 C#实现Zookeeper分布式锁 分布式锁 互联网初期,我们系统一般都是单点部署,也就是在一台服务器完成系统的部署,后期随着用户量的增加,服务器的压力也越来越大,响应速度越来越慢,甚至出现服务器崩溃的情况. 为解决服务器压力太大,响应慢的特点,分布式系统部署出现了. 简单的说,就是我们将系统资源部署到多台服务器中,然后使用一台服务器做入口代理,根据一些决策将接收到的请求转发到资源服务器,这也就是我们常说的 反向代理(一般就是使用nginx) 虽然
-
InterProcessMutex实现zookeeper分布式锁原理
原理简介: zookeeper实现分布式锁的原理就是多个节点同时在一个指定的节点下面创建临时会话顺序节点,谁创建的节点序号最小,谁就获得了锁,并且其他节点就会监听序号比自己小的节点,一旦序号比自己小的节点被删除了,其他节点就会得到相应的事件,然后查看自己是否为序号最小的节点,如果是,则获取锁. zookeeper节点图分析 InterProcessMutex实现的锁机制是公平且互斥的,公平的方式是按照每个请求的顺序进行排队的. InterProcessMutex实现的InterProcessLo
-
Java Redis分布式锁的正确实现方式详解
前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁. 可靠性 首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件: 互斥性.在任意时刻,只有一个客户端能持有锁. 不会发生死锁.即使有一个客户端在
-
ZooKeeper 实现分布式锁的方法示例
ZooKeeper 是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅.负载均衡.分布式协调/通知.集群管理.Master 选举.分布式锁等功能. 节点 在介绍 ZooKeeper 分布式锁前需要先了解一下 ZooKeeper 中节点(Znode),ZooKeeper 的数据存储数据模型是一棵树(Znode Tree),由斜杠(/)的进行分割的路径,就是一个 Znode(如 /locks/my_lock).每个 Znode 上都会保存自己的数
-
基于Zookeeper实现分布式锁详解
目录 1.什么是Zookeeper? 2.Zookeeper节点类型 3.Zookeeper环境搭建 4.Zookeeper基本使用 5.Zookeeper应用场景 6.Zookeeper分布式锁 7.公平式Zookeeper分布式锁 8.zookeeper和Redis锁对比? 1.什么是Zookeeper? Zookeeper是一个分布式的,开源的分布式应用程序协调服务,是Hadoop和hbase的重要组件. 引用官网的图例: 特征: zookeeper的数据机构是一种节点树的数据结构,zNo
-
ZooKeeper入门教程三分布式锁实现及完整运行源码
目录 1.0版本 2.0版本 LockSample类 构造方法 获取锁实现 createLock() attemptLock() 释放锁实现 TicketSeller类 sell() sellTicketWithLock() 测试入口 测试方法 代码清单如下: 1.LockSample 2.TicketSeller ZooKeeper入门教程一简介与核心概念 ZooKeeper入门教程二在单机和集群环境下的安装搭建及使用 1.0版本 首先我们先介绍一个简单的zookeeper实现分布式锁的思路:
-
深入浅出探索Java分布式锁原理
目录 什么是分布式锁?它能干什么? 分布式锁实现方案 基于数据库的分布式锁实现方案 实现原理 方案分析 基于Redis的分布式锁实现方案 基于sentnx命令的实现原理 方案分析 基于Redisson实现 RedLock 方案分析 基于Zookeeper的分布式锁实现方案 实现原理 方案分析 分布式锁方案到底选哪个? 总结 什么是分布式锁?它能干什么? 相信大家对于Java提供的synchronized关键字以及Lock锁都不陌生,在实际的项目中大家都使用过.如下图所示,在同一个JVM进程中,T
-
Spring Boot整合Zookeeper实现分布式锁的场景分析
目录 一.Java当中关于锁的概念 1.1.什么是锁 1.2.锁的使用场景 1.3.什么是分布式锁 1.4.分布式锁的使用场景 二.zk实现分布式锁 2.1.zk中锁的种类: 2.2.zk如何上读锁 2.3.zk如何上写锁 2.4.⽺群效应 三.springboot整合分布式锁 温馨提示:本篇文章要求掌握zk的数据结构,以及临时序号节点! zk实现分布式锁完全是依靠zk节点类型当中的临时序号节点来实现的 一.Java当中关于锁的概念 1.1.什么是锁 锁是用来控制多个线程访问共享资源的方式,一般
随机推荐
- 有关mysql中ROW_COUNT()的小例子
- java中文传值乱码问题的解决方法
- 用javascript连接access数据库的方法
- Yii核心组件AssetManager原理分析
- Linux下手动编译安装PHP扩展的例子分享
- Python 正则表达式的高级用法
- Android打造炫酷进度条效果
- Android中使用BitmapShader类来制作各种图片的圆角
- 浅析js中substring和substr的方法
- a标签置灰不可点击的实现方法
- 深入PHP nl2br()格式化输出的详解
- Python入门_浅谈数据结构的4种基本类型
- mysql 5.7.11 安装配置教程
- BootStrap中jQuery插件Carousel实现轮播广告效果
- 探讨C语言的那些小秘密之断言
- three.js中3D视野的缩放实现代码
- linux系统下创建lvm挂载到指定目录的操作步骤
- 对Python中一维向量和一维向量转置相乘的方法详解
- Java如何找出数组中重复的数字
- Vue登录注册并保持登录状态的方法