org.apache.curator:master选举和分布式锁
1. master选举(LeaderSelector)
1)LeaderSelector构造函数
在leaderPath上建立分布式锁:mutex = new InterProcessMutex(client, leaderPath)

2)LeaderSelector.start
当前WorkServer参与master选举


若autoRequeue为ture,则当前WorkServer在未能获取leadership || 获取并释放leadership时,将自动进入下一轮master选举

3)LeaderSelector.doWorkLoop -> takeLeadership
捕获InterruptedException并进行自我中断,若autoRequeue为ture,则忽略一切捕获的异常

获取分布式锁 -> 获取leadership ->释放分布式锁,获取分布式锁失败时将等待


2. 分布式锁(InterProcessMutex)
1)InterProcessMutex和LockInternals构造函数
maxLeases默认为1:只选举一个master
driver默认为StandardInternalsDriver类型


2)获取分布式锁
InterProcessMutex.acquire


LockInternals.attemptLock

StandardLockInternalsDriver.createsTheLock
在zookeeper上建立临时顺序(-e -s)节点,获取该节点在zookeeper上的完整路径(ourPath)

LockInternals.internalLockLoop
(1)basePath下的子节点依字符串自然顺序排序:getSortedChildren
(2)driver.getsTheLock(client, children, sequenceNodeName, maxLeases),其中sequenceNodeName为createsTheLock所创建的临时顺序节点的名称,如lock-0000000001
若sequenceNodeName为children中的首个元素,则说明当前WorkServer为首个成功创建临时顺序节点的WorkServer,当前WorkServer成功获取分布式锁(haveLock = true)
否则,创建watcher监听前置节点的变化 -> 当前WorkServer等待:client.getData().usingWatcher(watcher).forPath(previousSequencePath) -> wait


StandardLockInternalsDriver.getsTheLock
maxLeases为1
sequenceNodeName在children中的位置 < 1:getsTheLock = true,pathToWatch = null
sequenceNodeName在children中的位置 >= 1:getsTheLock = false,pathToWatch = sequenceNodeName前置节点

3)释放分布式锁
InterProcessMutex.release

LockInternals.releaseLock
删除当前WorkServer在zookeeper上创建的临时顺序节点:将触发所有WorkServer中设置LockInternals.watcher


LockInternals.watcher
watcher在LockInternals.internalLockLoop中被设置

唤醒当前WorkServer:每个WorServer代表一个JVM线程,多个WorkServer可能位于不同JVM上,也可能位于不同主机上

org.apache.curator:master选举和分布式锁的更多相关文章
- Curator框架实现ZooKeeper分布式锁
排他锁(X) 这里主要讲讲分布式锁中的排他锁.排他锁(Exclusive Locks,简称X锁),又称为写锁或独占锁,是一种基本的锁类型.如果事务T1对数据对象O1加上了排他锁,那么在整个加锁期间,只 ...
- 使用zookeeper实现分布式master选举(c 接口版本)
zookeeper,已经被很多人所熟知,主要应用场景有(数据订阅/发布 ,负载均衡, 命名服务, 分布式协调/通知,集群管理,Master选举,分布式锁,分布式队列). C接口的描述 主要参考 Ha ...
- ZooKeeper分布式锁浅谈(一)
一.概述 清明节的时候写了一篇分布式锁概述,里面介绍了分布式锁实现的几种方式,其实那时候我一直沉迷于使用redis的悲观锁和乐观锁来实现分布式锁,直到一个血案的引发才让我重新认识了redis分布式锁的 ...
- Curator实现zookeeper分布式锁的基本原理
一.写在前面 之前写过一篇文章(<拜托,面试请不要再问我Redis分布式锁的实现原理>),给大家说了一下Redisson这个开源框架是如何实现Redis分布式锁原理的,这篇文章再给大家聊一 ...
- 终极锁实战:单JVM锁+分布式锁
目录 1.前言 2.单JVM锁 3.分布式锁 4.总结 =========正文分割线================= 1.前言 锁就像一把钥匙,需要加锁的代码就像一个房间.出现互斥操作的场景:多人同 ...
- zookeeper(4)--zookeeper分布式锁原理
目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency).可用性( ...
- zookeeper分布式锁和服务优化配置
转自:https://www.jianshu.com/p/02eeaee4357f?utm_campaign=maleskine&utm_content=note&utm_medium ...
- ZooKeeper场景实践:(6)集群监控和Master选举
1. 集群机器监控 这通经常使用于那种对集群中机器状态,机器在线率有较高要求的场景,可以高速对集群中机器变化作出响应.这种场景中,往往有一个监控系统,实时检測集群机器是否存活. 利用ZooKeeper ...
- ZooKeeper 分布式锁实现
1 场景描述 在分布式应用, 往往存在多个进程提供同一服务. 这些进程有可能在相同的机器上, 也有可能分布在不同的机器上. 如果这些进程共享了一些资源, 可能就需要分布式锁来锁定对这些资源的访问. 2 ...
随机推荐
- L - SOS Gym - 101775L 博弈
题目链接:https://cn.vjudge.net/contest/274151#problem/L 题目大意:给你一个1*n的方格,两个人轮流放字母,每一次可以放"S"或者&q ...
- Solaris 系统命令使用说明
1. 查看进程 -- pgreproot@UA4300D-spa:~# pgrep fmd133095root@UA4300D-spa:~# pgrep -l fmd133095 fmdroot@ ...
- Fedora8 U盘安装
(一)分区 在XP下"我的电脑“管理功能,对硬盘分区,目的是从逻辑分区中拿出20G空间,分成3个盘(必须为逻辑盘): (1)512MB 用作Linux swap分区: (2)200MB ...
- Mysql 中 char 、varchar 、text的区别
首先它们的存储方式和数据的检索方式都不一样.数据的检索效率是:char > varchar > text 空间占用方面,就要具体情况具体分析了. char:存储定长数据很方便,CHAR字段 ...
- C# 随笔 【ToList().Foreach()和Foreach()】
1. 最近在做一个Socket通讯的例子,但是如果使用UTF-8编码传输中文的话取和的会不一样.早上做了测试 . string str = "a我..";看代码中间是一个英文,一个 ...
- 使用情况查询top命令
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法. top - 01:06:48 up 1:22, 1 ...
- beego学习笔记(4):开发文档阅读(5)
controller的逻辑: 我们看下面的代码,就知道怎么传值的: import ( "github.com/astaxie/beego" ) type MainControlle ...
- 服务器fsockopen函数和pfsockopen函数开启及作用
摘要: fsockopen()函数的作用是可以用来打开一个socket连接,另一个函数pfsockopen()也有相似的功能,只不过后者是一个“持续”(persistent)的fsockopen()函 ...
- 【转】EventBus 3.0使用详解
原文:https://www.jianshu.com/p/f9ae5691e1bb 01 前言 当我们进行项目开发的时候,往往是需要应用程序的各组件.组件与后台线程间进行通信,比如在子线程中进行请求数 ...
- Download failed : Oracle JDK 7 is NOT installed,解决oracle jdk7的问题
先了解下概念: jdk(java development kit),就是java的开发工具集,顾名思义就是做开发用的,其中包括javac,也就是java compiler等.jre(java runt ...