04.Curator Leader选举
1.Leader Latch
// 构造方法public LeaderLatch(CuratorFramework client, String latchPath)public LeaderLatch(CuratorFramework client, String latchPath, String id)public LeaderLatch(CuratorFramework client, String latchPath, String id, CloseMode closeMode)// 查看当前LeaderLatch实例是否是leaderpublic boolean hasLeadership()// 尝试让当前LeaderLatch实例称为leaderpublic void await() throws InterruptedException, EOFExceptionpublic boolean await(long timeout, TimeUnit unit) throws InterruptedException
public class LeaderLatchExample{private static final int CLIENT_QTY = 10;private static final String PATH = "/examples/leader";public static void main(String[] args) throws Exception{List<CuratorFramework> clients = Lists.newArrayList();List<LeaderLatch> examples = Lists.newArrayList();try{for (int i = 0; i < CLIENT_QTY; ++i){CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", new ExponentialBackoffRetry(1000, 3));clients.add(client);client.start();LeaderLatch example = new LeaderLatch(client, PATH, "Client #" + i);examples.add(example);example.start();}System.out.println("LeaderLatch初始化完成!");Thread.sleep(10 * 1000);// 等待Leader选举完成LeaderLatch currentLeader = null;for (int i = 0; i < CLIENT_QTY; ++i){LeaderLatch example = examples.get(i);if (example.hasLeadership()){currentLeader = example;}}System.out.println("当前leader:" + currentLeader.getId());currentLeader.close();examples.get(0).await(10, TimeUnit.SECONDS);System.out.println("当前leader:" + examples.get(0).getLeader());System.out.println("输入回车退出");new BufferedReader(new InputStreamReader(System.in)).readLine();}catch (Exception e){e.printStackTrace();}finally{for (LeaderLatch exampleClient : examples){System.out.println("当前leader:" + exampleClient.getLeader());try{CloseableUtils.closeQuietly(exampleClient);}catch (Exception e){System.out.println(exampleClient.getId() + " -- " + e.getMessage());}}for (CuratorFramework client : clients){CloseableUtils.closeQuietly(client);}}System.out.println("OK!");}}
LeaderLatch初始化完成!当前leader:Client #1当前leader:Participant{id='Client #8', isLeader=true}输入回车退出当前leader:Participant{id='Client #8', isLeader=true}当前leader:Participant{id='Client #8', isLeader=true}Client #1 -- Already closed or has not been started当前leader:Participant{id='Client #8', isLeader=true}当前leader:Participant{id='Client #8', isLeader=true}当前leader:Participant{id='Client #8', isLeader=true}当前leader:Participant{id='Client #8', isLeader=true}当前leader:Participant{id='Client #8', isLeader=true}当前leader:Participant{id='Client #8', isLeader=true}当前leader:Participant{id='Client #8', isLeader=true}当前leader:Participant{id='Client #9', isLeader=true}OK!

2.Leader Election
- LeaderSelector - 选举Leader的角色。
- LeaderSelectorListener - 选举Leader时的事件监听。
- LeaderSelectorListenerAdapter - 选举Leader时的事件监听,官方提供的适配器,用于用户扩展。
- CancelLeadershipException - 取消Leader权异常
public LeaderSelector(CuratorFramework client, String leaderPath, LeaderSelectorListener listener)public LeaderSelector(CuratorFramework client, String leaderPath, ExecutorService executorService, LeaderSelectorListener listener)public LeaderSelector(CuratorFramework client, String leaderPath, CloseableExecutorService executorService, LeaderSelectorListener listener)
public class ExampleClient extends LeaderSelectorListenerAdapter implements Closeable{private final String name;private final LeaderSelector leaderSelector;private final AtomicInteger leaderCount = new AtomicInteger();public ExampleClient(CuratorFramework client, String path, String name){this.name = name;leaderSelector = new LeaderSelector(client, path, this);leaderSelector.autoRequeue();}public void start() throws IOException{leaderSelector.start();}@Overridepublic void close() throws IOException{leaderSelector.close();}@Overridepublic void takeLeadership(CuratorFramework client) throws Exception{final int waitSeconds = 1;System.out.println(name + " 是当前的leader(" + leaderSelector.hasLeadership() + ") 等待" + waitSeconds + "秒...");System.out.println(name + " 之前成为leader的次数:" + leaderCount.getAndIncrement() + "次");try{Thread.sleep(TimeUnit.SECONDS.toMillis(waitSeconds));}catch (InterruptedException e){System.err.println(name + " 已被中断");Thread.currentThread().interrupt();}finally{System.out.println(name + " 放弃leader\n");}}}
public class LeaderSelectorExample{private static final int CLIENT_QTY = 10;private static final String PATH = "/examples/leader";public static void main(String[] args) throws Exception{List<CuratorFramework> clients = Lists.newArrayList();List<ExampleClient> examples = Lists.newArrayList();try{for (int i = 0; i < CLIENT_QTY; ++i){CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", new ExponentialBackoffRetry(1000, 3));clients.add(client);client.start();ExampleClient example = new ExampleClient(client, PATH, "Client #" + i);examples.add(example);example.start();}System.out.println("输入回车退出:");new BufferedReader(new InputStreamReader(System.in)).readLine();}finally{for (ExampleClient exampleClient : examples){CloseableUtils.closeQuietly(exampleClient);}for (CuratorFramework client : clients){CloseableUtils.closeQuietly(client);}}System.out.println("OK!");}}
输入回车退出:Client #4 是当前的leader(true) 等待1秒...Client #4 之前成为leader的次数:0次Client #4 放弃leaderClient #5 是当前的leader(true) 等待1秒...Client #5 之前成为leader的次数:0次Client #5 已被中断Client #5 放弃leaderOK!
LeaderSelectorListener可以对领导权进行控制,在适当的时候释放领导权,这样每个节点都有可能获得领导权。而LeaderLatch一根筋到死,除非调用close方法,否则它不会释放领导权。-------------------------------------------------------------------------------------------------------------------------------
04.Curator Leader选举的更多相关文章
- Curator leader 选举(一)
要想使用Leader选举功能,需要添加recipes包,可以在maven中添加如下依赖: <dependency> <groupId>org.apache.curator< ...
- 【分布式】Zookeeper的Leader选举
一.前言 前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leader选举,接着就开始深入学习Leader选举. 二.Leader选举 2.1 Leader选举概 ...
- Ceph剖析:Leader选举
作者:吴香伟 发表于 2014/09/11 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 Paxos算法存在活锁问题.从节点中选出Leader,然后将所有对数据 ...
- Zookeeper-Zookeeper leader选举
在上一篇文章中我们大致浏览了zookeeper的启动过程,并且提到在Zookeeper的启动过程中leader选举是非常重要而且最复杂的一个环节.那么什么是leader选举呢?zookeeper为什么 ...
- ZOOKEEPER3.3.3源码分析(四)对LEADER选举过程分析的纠正
很抱歉,之前分析的zookeeper leader选举算法有误,特此更正说明. 那里面最大的错误在于,leader选举其实不是在大多数节点通过就能选举上的,这一点与传统的paxos算法不同,因为如果这 ...
- 第四章 Leader选举算法分析
Leader选举 学习leader选举算法,主要是从选举概述,算法分析与源码分析(后续章节写)三个方面进行. Leader选举概述 服务器启动时期的Leader选举 选举的隐式条件便是ZooKeepe ...
- zookeeper系列之五—Leader选举算法
leader选举算法 zookeeper server内部原理 zookeeper client
- zookeeper进行leader选举
一.如何进行leader选举 创建 /lj/producer和/lj/master/producer外层节点 创建临时顺序节点 判断自己是否是master节点(判断流程:遍历/lj/producer节 ...
- 【Zookeeper】源码分析之Leader选举(二)
一.前言 前面学习了Leader选举的总体框架,接着来学习Zookeeper中默认的选举策略,FastLeaderElection. 二.FastLeaderElection源码分析 2.1 类的继承 ...
随机推荐
- 常用的SQL
--时间计算: select GETDATE() ,GETDATE()) ,GETDATE()) ,GETDATE()) ,GETDATE()) ,GETDATE()) ,GETDATE()) --查 ...
- MySQL EXPLAIN 命令详解
MySQL EXPLAIN 命令详解 MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提 ...
- Java 枚举(enum) 的常见用法和开发规范
JDK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便. 用法一:常量 在JDK1.5 之前,我们定义常量都是: public static final ...
- Atitit. Dwr 抛出异常error解决方案
Atitit. Dwr 抛出异常error解决方案 1. Dwr3的处理机制..setErrorHandler 1 2. remote Mteh try catch 1 3. 林吧,子好java 处 ...
- C++中常函数内部的this指针也是const类型的
代码中碰到一个奇怪的现象,在同样的函数中调用this指针,结果却有一个无法通过编译 // 读取连接信息 void ThirdWizardPage::ReadConnection() { QFile f ...
- DOM节点的三个属性
在文档对象模型 (DOM) 中,每个节点都是一个对象.DOM 节点有三个重要的属性 : 1. nodeName : 节点的名称 2. nodeValue :节点的值 3. nodeType :节点的类 ...
- tiny4412 u-boot 启动参数的设置
参考 http://www.cnblogs.com/chenfulin5/p/5887552.html 制作SD卡 u-boot 编译完之后, 进入 u-boot 目录里面的 sd_fuse cd ~ ...
- js获取textaera对象(object)的值
for(i in pstrWord ){ alert(i); //获得属性 alert(pstrWord[i]); //获得属性值 } 1.js输出object对象方法如下: function wri ...
- asp.net 判断session是否过期
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- Discretized Streams, 离散化的流数据处理
Discretized Streams: An Efficient and Fault-Tolerant Model for Stream Processing on Large Clusters ...