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实例是否是leader
public boolean hasLeadership()
// 尝试让当前LeaderLatch实例称为leader
public void await() throws InterruptedException, EOFException
public 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();
}
@Override
public void close() throws IOException
{
leaderSelector.close();
}
@Override
public 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 放弃leader
Client #5 是当前的leader(true) 等待1秒...
Client #5 之前成为leader的次数:0次
Client #5 已被中断
Client #5 放弃leader
OK!
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:除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询
执行sql语句: select * from ( select * from tab where ID>20 order by userID desc ) as a order by date ...
- linux学习规划
- $scope绑定事件之$on方法和$emit,$broadcast
function DemoCtrl($scope){ $scope.count = 0; $scope.$on('myevent',function(){ $scope.count++; }) } 视 ...
- CCCallFunc CCCallFuncN CCCallFuncND的区别和使用
CCCallFunc CCCallFuncN CCCallFuncND都用来创建带有回调函数的动作,区别主要在于回调函数是否带有参数 CCCallFunc是执行对应的回调函数,其中回调函数不可带参数. ...
- Struts2初学 struts.xml详解 一
一.简介 Struts 2是一个MVC框架,以WebWork设计思想为核心,吸收了Struts 1的部分优点 二.详解 首先让我们看一下一个简单的struts.xml文件的结构 < ...
- Django Rest Framework(分页、视图、路由、渲染器)
一.分页 试问如果当数据量特别大的时候,你是怎么解决分页的? 方式a.记录当前访问页数的数据id 方式b.最多显示120页等 方式c.只显示上一页,下一页,不让选择页码,对页码进行加密 1.基于lim ...
- FreeRTOS 临界段和开关中断
以下转载自安富莱电子: http://forum.armfly.com/forum.php 临界段代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行不被中断 ...
- android4.0.3源码之USB wifi移植心得
http://blog.csdn.net/eastmoon502136/article/details/7850157 http://forum.cubietech.com/forum.php?mod ...
- Redis JAVA客户端 Jedis常用方法
Jedis 是 Redis 官方首选的 Java 客户端开发包 (redis的java版本的客户端实现) #MAVEN配置 <dependency> <groupId>redi ...
- hive表支持中文设置
默认创建表时说明中带有中文字段时会显示如下乱码信息: 解决方案: 在hive的元数据库中执行以下SQL语句,然后重新创建刚才的表即可 . ) character set utf8; ) charact ...