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选举和分布式锁的更多相关文章

  1. Curator框架实现ZooKeeper分布式锁

    排他锁(X) 这里主要讲讲分布式锁中的排他锁.排他锁(Exclusive Locks,简称X锁),又称为写锁或独占锁,是一种基本的锁类型.如果事务T1对数据对象O1加上了排他锁,那么在整个加锁期间,只 ...

  2. 使用zookeeper实现分布式master选举(c 接口版本)

    zookeeper,已经被很多人所熟知,主要应用场景有(数据订阅/发布 ,负载均衡, 命名服务, 分布式协调/通知,集群管理,Master选举,分布式锁,分布式队列). C接口的描述  主要参考 Ha ...

  3. ZooKeeper分布式锁浅谈(一)

    一.概述 清明节的时候写了一篇分布式锁概述,里面介绍了分布式锁实现的几种方式,其实那时候我一直沉迷于使用redis的悲观锁和乐观锁来实现分布式锁,直到一个血案的引发才让我重新认识了redis分布式锁的 ...

  4. Curator实现zookeeper分布式锁的基本原理

    一.写在前面 之前写过一篇文章(<拜托,面试请不要再问我Redis分布式锁的实现原理>),给大家说了一下Redisson这个开源框架是如何实现Redis分布式锁原理的,这篇文章再给大家聊一 ...

  5. 终极锁实战:单JVM锁+分布式锁

    目录 1.前言 2.单JVM锁 3.分布式锁 4.总结 =========正文分割线================= 1.前言 锁就像一把钥匙,需要加锁的代码就像一个房间.出现互斥操作的场景:多人同 ...

  6. zookeeper(4)--zookeeper分布式锁原理

    目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency).可用性( ...

  7. zookeeper分布式锁和服务优化配置

    转自:https://www.jianshu.com/p/02eeaee4357f?utm_campaign=maleskine&utm_content=note&utm_medium ...

  8. ZooKeeper场景实践:(6)集群监控和Master选举

    1. 集群机器监控 这通经常使用于那种对集群中机器状态,机器在线率有较高要求的场景,可以高速对集群中机器变化作出响应.这种场景中,往往有一个监控系统,实时检測集群机器是否存活. 利用ZooKeeper ...

  9. ZooKeeper 分布式锁实现

    1 场景描述 在分布式应用, 往往存在多个进程提供同一服务. 这些进程有可能在相同的机器上, 也有可能分布在不同的机器上. 如果这些进程共享了一些资源, 可能就需要分布式锁来锁定对这些资源的访问. 2 ...

随机推荐

  1. vue-loader 调用了cssLoaders方法配置了css加载器属性。

    module: { loaders: [ // 这里也是相应的配置,test就是匹配文件,loader是加载器, { test: /\.vue$/, loader: 'vue' }, { test: ...

  2. PHP分页类分享

    /** * 获取分页的HTML内容 * @param integer $page 当前页 * @param integer $pages 总页数 * @param string $url 跳转url地 ...

  3. Double类型的数向上取整和向下取整

  4. 转:字符集和字符编码(Charset & Encoding)

    转自:http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html ——每个软件开发人员应该无条件掌握的知识! ——Unicode伟大的创 ...

  5. HOJ 1108

    题目链接:HOJ-1108 题意为给定N和M,找出最小的K,使得K个N组成的数能被M整除.比如对于n=2,m=11,则k=2. 思路是抽屉原理,K个N组成的数modM的值最多只有M个. 具体看代码: ...

  6. python之pandas&&DataFrame

    1.Series  Series是一个一维数组 pandas会默认从0开始作为Series的index >>> test = pd.Series(['num0','num1','nu ...

  7. 自家人不认识自家人——考你一道有趣的Javascript小题目

    今天的内容很简单,给大家分享一个有趣的Javascript小题目. 题目很简单,就是填空: var a = ______; var b = a; alert(a==b); // alert " ...

  8. wordpress技术-禁止订阅用户访问后台

    begin主题虽然有个功能,但是只是少了入口,实际上测试还是可以进入后台的,那么怎么彻底解决呢?一时半会没思路,百度了下,果然有人贴出了代码. 把下面代码黏贴到主题的模板函数文件里即可: if ( i ...

  9. javaWeb之写一个最简单的servlet

    1. 创建一个类servletTest2 继承HttpServlet类. public class servletTest2 extends HttpServlet { public servletT ...

  10. 在Ubuntu上安装Arena

    安装JDK 首先安装JDK对吧,下面以jdk-7u67-linux-i586.tar.gz为例 在官网上下载JDK,具体依照你的机器而定. 解压掉 tar -zxvf jdk-7u67-linux-i ...