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-7 charpter one
一.system locale 的介绍: 系统的区域设置被保存在/etc/locale.conf 这个文件中,systemd在启动的时候会去读取它:所有用户和程序的区域设置都继承自它, 当然用户&am ...
- MySQL Subquery
Summary: in this tutorial, we will show you how to use the MySQL subquery to write complex queries a ...
- union共用体的对齐
union DATE { char a; ]; double b; }; DATE max; cout<< sizeof(max) << endl; 这个问题很好回答,并且我把 ...
- Qt 插件综合编程-基于插件的OpenStreetMap瓦片查看器client(1)-墨卡托投影与坐标控制
(相关的代码能够从https://github.com/goldenhawking/mercator.qtviewer.git直接克隆) 我们如今是准备做一个C/S架构的地图显示控件.就必定牵扯到坐标 ...
- CSS3边框圆角知识
<div class="item" data-brief="整圆"> <div class="border-radius" ...
- eclipse配置xml的自动提示
如mybatis的mapper配置文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...
- HttpURLConnection的使用
import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; ...
- 三篇很好的讲解keppalived的博客
VRRP协议介绍 参考资料: RFC 3768 1. 前言 VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,最新协议在RFC3768中定 ...
- [Kernel]理解System call系统调用
转自:http://os.51cto.com/art/200512/13510.htm 现在,您或许正在查看设备驱动程序,并感到奇怪:“函数 foo_read() 是如何被调用的?”或者可能疑惑: “ ...
- Linux网络编程wait()和waitpid()的讲解
本文讲的是关于wait和waitpid两者的区别与联系.为避免僵尸进程的产生,无论我们什么时候创建子进程时,主进程都需要等待子进程返回,以便对子进程进行清理.为此,我们在服务器程序中添加SIGCHLD ...