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 类的继承 ...
随机推荐
- CentOS 6 下升级安装Mysql 5.5 完整步骤
使用系统CentOS 6.2本来已经系统自带安装了mysql 5.1,但是奈何5.1不支持utf8mb4字符集(详见:http://blog.csdn.net/shootyou/article/det ...
- 使用ClipboardManager碰到Can't create handler inside thread that has not called Looper.prepare()
直接放上我的代码.希望能给碰到相同问题的朋友提供帮助 Runnable runnable = new Runnable() { public void run() { ClipboardManager ...
- Linux下磁盘管理命令df与du
Linux下磁盘管理命令df与du 对磁盘进行查看和控制的两个linux命令,df和du. 一.du命令 首先看一下du的help说明: [root@misdwh opt]# du --help ...
- MySQL是如何做到安全登陆
首先Mysql的密码权限存储在mysql.user表中.我们不关注鉴权的部分,我们只关心身份认证,识别身份,后面的权限控制是很简单的事情.在mysql.user表中有个authentication_s ...
- Ubuntu 15.04 开启远程桌面
1.安装Xrdp Windows远程桌面使用的是RDP协议,所以ubuntu上就要先安装Xrdp,终端命令行输入安装: sudo apt-get install xrdp vnc4server xba ...
- lo4j 日志级别
日志记录器(Logger)的行为是分等级的.如下表所示: 分为OFF.FATAL.ERROR.WARN.INFO.DEBUG.TRACE.ALL或者您定义的级别.Log4j建议只使用四个级别,优先级从 ...
- ibatis中integer类型
假如java代码中设置的返回类型是integer类型,ibatis实际上返回的是BigDecimal,也就是说 ibatis转换成integer默认是bigdecimal类型的
- [Linux]read/write和fread/fwrite有什么区别
转自:http://blog.csdn.net/xiaofei0859/article/details/51145051 二者都是对文件进行操作,那么二者有什么区别,用的时候该如何选择呢? 1. 区别 ...
- Spider Studio 新版本 (码年吉祥版) - 浏览器视图 / 脚本库上线!
各位哥哥姐姐弟弟妹妹小伙伴们春节好! 2014年对于我们程序员很重要, 因为今年是 "码" 年! SS在此重要之年到来之际热力推出两大重要功能恭贺新春: 1. 浏览器视图 以前SS ...
- asp.net 简单分页打印
<html> <head> <title>看看</title> <meta http-equiv="Content-Type" ...