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 类的继承 ...
随机推荐
- 【HDU 2586】LCA模板
在一棵树上 求2个点的最短距离.那么首先利用LCA找到2个点的近期公共祖先 公式:ans = dis(x) + dis(y) - 2 * dis(lca(x,y)) 这里的dis(x)指的上x距离根节 ...
- 每日英语:The First Day On A Job Is Tough Work
Why is the first day on the job often the worst? New employees tend to be greeted with stacks of ben ...
- 如何在Windows下面运行hadoop的MapReduce程序
在Windows下面运行hadoop的MapReduce程序的方法: 1.下载hadoop的安装包,这里使用的是"hadoop-2.6.4.tar.gz": 2.将安装包直接解压到 ...
- malloc,我误解你了
malloc用于动态申请内存,这个学过C语言的都知道.忘记了在哪本书上看到,malloc申请的内存不一定是连续,于是一直记住了.这句话有错吗?没有!但是当时只是记住了这个知识点,而没有深入的思考.直到 ...
- 回文串dp
一个字符串如果从左往右读和从右往左读都一样,那么这个字符串是一个回文串.例如:"abcba","abccba". 蒜头君想通过添加字符把一个非回文字符串变成回文 ...
- dp之01背包hdu3466(带限制的,当你所拥有的钱数大于某个限定值时才可以购买该物品)
题意:买东西,每个东西有三个特征值,p代表价格,q代表你手中钱必须不低于q才能买这个物品,v代表得到的价值. mark:又是变种01背包,每做一个变种的,就是一种提高.. 按照q - p以由大到小的顺 ...
- Vue 状态管理
类flux状态管理的官方实现 由于多个状态分散的跨越在许多组件和交互间的各个角落,大型应用复杂度也经常逐渐增长. 为了解决这个问题,vue提供了vuex:我们有收到elm启发的状态管理库,vuex甚至 ...
- HeadFirst 设计模式 04 工厂模式
除了 new 操作符之外, 还有更多创造对象的方法. 工厂处理创建对象的细节. 这么做的目的是为了抽象, 例如把创建比萨的代码包装进一个类, 当以后实现改变时, 只需修改这个类即可. 利用静态方法定义 ...
- jq 按回车键 登陆
$("body").keydown(function(e) { if (event.which == "13") {//keyCode= ...
- selenium测试环境搭建(一)
selenium测试环境搭建 下载资源 1. selenium-java-2.53.0.zip 下载地址:http://pan.baidu.com/s/1dFDf27Z 2. Firefox Set ...