ZooKeeper如何完成分布式锁?
* 面试答案为LZ所写,如需转载请注明出处,谢谢。
1.最基本的思路:
将<local_ip>:<task_id>存在某个路径节点里。
刚开始并没有这个节点,当有executor执行操作时,都会询问这个节点。
如果不存在,则创建这个临时节点,并将<local_ip>:<task_id>写进去。
如果存在,则比对<local_ip>:<task_id>是否与这个临时节点中的数据<local_ip>:<task_id>一致,若一致,则允许运行,若不一致,则阻塞。
总结一下,如何识别唯一的一个executor? 通过<local_ip>:<task_id>来识别。那如何进行每个executor之间的互斥?那就是通过写入临时节点上的数据的方式来允许执行。
也就是说,某个指定临时节点上的数据<local_ip>:<task_id>是允许哪个executor运行的唯一标志。
2.方法
核心的三个方法为connect、lock、unlock方法。
1)connect方法
思路:
STEP1:进行ZK连接,如连接不上则重试
STEP2:检查是否存在该临时节点,如不存在则创建,以<local_ip>:<task_id>为数据内容。
public void connect() {
try {
// STEP1:进行ZK连接,如连接不上则重试
zk = new ZooKeeper("node1:2181,node3:2181", 3000, new Watcher() {
// 监控zk状态
@Override
public void process(WatchedEvent event) {
// System.out.println("event:" + event.getType());
}
});
// 连接重试
while (zk.getState() != ZooKeeper.States.CONNECTED) {
Thread.sleep(1000);
}
// STEP2: STEP2:检查是否存在该临时节点,如不存在则创建,以<local_ip>:<task_id>为数据内容。
// <ip>:<taskID> 格式作为识别格式
InetAddress ip = InetAddress.getLocalHost();
lockData = ip.getHostAddress() + ":" + context.getThisTaskId();
// 如果没有节点
if (zk.exists(zk_path, false) == null) {
zk.create(zk_path, lockData.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
}
} catch (Exception e) {
this.unlock();
e.printStackTrace();
}
}
2).lock方法
思路:
STEP1:获得节点数据,如果节点不存在,则使用connect()方法重新连接创建节点。
STEP2:比对节点数据与本地的<local_ip>:<task_id>,如果一致,则返回方法,继续执行业务内容。如果不一致,则阻塞,每隔一段时间检查一次。
public void lock() {
// 互斥逻辑
String nodeData;
try {
nodeData = new String(zk.getData(zk_path, false, null));
while (!lockData.equals(nodeData) || nodeData==null) {
// 若节点不存在,重新连接
if(nodeData == null){
connect();
}else{
Thread.sleep(10);
}
}
} catch (Exception e) {
}
}
3).unlock方法
思路:
因为这个临时节点是依赖连接存在的,所以unlock方法直接断开连接就可以释放临时节点。
public void unlock() {
try {
zk.close();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
ZooKeeper如何完成分布式锁?的更多相关文章
- 如何用Zookeeper来实现分布式锁?
什么是Zookeeper临时顺序节点? 例如 : / 动物 植物 猫 仓鼠 荷花 松树 Zookeeper的数据存储结构就像一棵树,这棵树由节点组成,这种节点叫做Zonde.# Znode分为四种类型 ...
- 基于zookeeper实现的分布式锁
基于zookeeper实现的分布式锁 2011-01-27 • 技术 • 7 条评论 • jiacheo •14,941 阅读 A distributed lock base on zookeeper ...
- java使用zookeeper实现的分布式锁示例
java使用zookeeper实现的分布式锁示例 作者: 字体:[增加 减小] 类型:转载 时间:2014-05-07我要评论 这篇文章主要介绍了java使用zookeeper实现的分布式锁示例,需要 ...
- ZooKeeper 笔记(6) 分布式锁
目前分布式锁,比较成熟.主流的方案有基于redis及基于zookeeper的二种方案. 大体来讲,基于redis的分布式锁核心指令为SETNX,即如果目标key存在,写入缓存失败返回0,反之如果目标k ...
- 基于Zookeeper实现多进程分布式锁
一.zookeeper简介及基本操作 Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化.当对目录节点监控状态打开时,一旦目录节点的状态发生变化,Watc ...
- 利用ZooKeeper简单实现分布式锁
1.分布式锁的由来: 在程序开发过程中不得不考虑的就是并发问题.在java中对于同一个jvm而言,jdk已经提供了lock和同步等.但是在分布式情况下,往往存在多个进程对一些资源产生竞争关系,而这些进 ...
- 基于zookeeper简单实现分布式锁
https://blog.csdn.net/desilting/article/details/41280869 这里利用zookeeper的EPHEMERAL_SEQUENTIAL类型节点及watc ...
- 基于zookeeper实现高性能分布式锁
实现原理:利用zookeeper的持久性节点和Watcher机制 具体步骤: 1.创建持久性节点 zkLock 2.在此父节点下创建子节点列表,name按顺序定义 3.Java程序获取该节点下的所有顺 ...
- zookeeper实现的分布式锁
在分布式系统中,多个jvm对共享资源进行操作时候,要加上锁,这就是分布式锁 利用zookeeper的临时节点的特性,可以实现分布式锁 public class ZookeeperDistrbuteLo ...
- Zookeeper怎么实现分布式锁?
对访问资源 R1 的过程加锁,在操作 O1 结束对资源 R1 访问前,其他操作不允许访问资源 R1.以上算是对独占锁的简单定义了,那么这段定义在 Zookeeper 的"类 Unix/Lin ...
随机推荐
- Python:re中的group方法简介
原文地址:http://www.cnblogs.com/kaituorensheng/archive/2012/08/20/2648209.html. 正则表达式中,group()用来提出分组截获的字 ...
- windows10 右键 manage 没反应
发现自己的windows10右键 This PC,然后点manage没反应..... 想到直接找到对应的可执行文件,但是苦于不知道可执行文件的名. 经过在网上搜索,可执行文件是:C:\Windows\ ...
- SRD_PreloaderCore
预加载 Preloader CoreVersion 1.10SumRndmDde This plugin requires the Game Upgrade plugin:http://sumrndm ...
- gvim keil 快捷跳转至出现错误(警告)行
开发环境 win7系统中:用keil 对工程进行编译链接,用gvim编辑查看源文件. 实现效果 一键跳转到出现警告或者错误的源码. 实现原理 gvim 调用外部shell脚本,对keil编译生成的lo ...
- mysql授权grant
本文实例,运行于 MySQL 5.0 及以上版本. MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删 ...
- vb配置下位机CAN寄存器小结
2011-12-14 18:44:32 效果图 1,完成设计(由于没有eeprom等存储设备,所以每次上电后需要通过串口配置某些寄存器).在设计中,列出技术评估难度,并进行尝试,参看<我的设计& ...
- mySQL简单操作(二)
1.like子句 [where clause like '%com'] '%' '_' 2.正则 3.union操作符 用于连接多个select语句,[distinct]删除重复数据 select c ...
- iOS进阶之正则表达式
最近一直在弄正则表达式,于是在这里整理一下,便于日后查阅. 1.常用符号 ^:字符串的开始 $:字符串的结束 *:表示零个或若干个 ?:表示零个或一个 +:表示一个或若干个 | :表示 或 操作 . ...
- How to Make a Computer Operating System
How to Make a Computer Operating System 如何制作一个操作系统(翻译版) 原文地址:Github:How to Make a Computer Operating ...
- html5 浏览文件
var fileInput = document.getElementById('test-image-file'), info = document.getElementById('test-fil ...