Curator leader 选举(一)
要想使用Leader选举功能,需要添加recipes包,可以在maven中添加如下依赖:
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.9.0</version>
</dependency>
当然了,由于recipes需要使用framework,所以你肯定还要添加如下依赖:
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.9.0</version>
</dependency>
最后,为了简化测试也为了便于学习,可以添加test依赖:
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-test</artifactId>
<version>2.9.0</version>
</dependency>
LeaderLatch使用流程
recipes包里面提供了Leader选举实现,Spark中的master选举使用的就是reciples包里面的LeaderLatch,使用他们可以极大的简化代码,使你将注意力更多的放在核心业务逻辑上。Leader选举的实现在org.apache.curator.framework.recipes.leader包中,这个包提供了两组Leader选举:
1.LeaderLatch,LeaderLatchListener
2.LeaderSelector,LeaderSelectorListener,LeaderSelectorListenerAdapter
这两组类都可以实现Leader选举,spark 使用的是第一种。再这篇文章里,只介绍第一种。
第一组使用起来非常简单,使用思路大致如下:假设你有3个节点,姑且叫做node0,node1,node2。你需要为每一个node创建一个CuratorFramework,LeaderLatch,LeaderLatchListener,如下:
node0:
1.CuratorFramework client=CuratorFrameworkFactory.newClient(.....);client.start();
2.new LeaderLatch(client,path)->addListener(LeaderLatchListener )->start()
node1:
1.CuratorFramework client=CuratorFrameworkFactory.newClient(.....);client.start();
2.new LeaderLatch(client,path)->addListener(LeaderLatchListener )->start()
node2:
1.CuratorFramework client=CuratorFrameworkFactory.newClient(.....);client.start();
2.new LeaderLatch(client,path)->addListener(LeaderLatchListener )->start()
你首先要创建CuratorFramework,然后并启动它,一个CuratorFramework就是一个ZooKeeper客户端。然后创建LeaderLatch,并制定刚才创建的CuratorFramework和一个leaderPath,leaderPath是一个ZooKeepe路径,node0,node1,node2中的leaderPath必须一致。创建好LeaderLatch之后,需要为他注册一个LeaderLatchListener回掉,如果某个node成为leader,那么会调用这个node的LeaderLatchListener的isLeader(),因此你可以在这里写自己的业务逻辑。最后,调用LeaderLatch的start(),这个LeaderLatch将参加选举了。
可以参考如下代码:
import java.util.ArrayList;
import java.util.List; import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.leader.LeaderLatch;
import org.apache.curator.framework.recipes.leader.LeaderLatchListener;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.test.TestingServer;
import org.apache.curator.utils.CloseableUtils; public class LeaderDemo {
public static void main(String[]args) throws Exception{
List<LeaderLatch>leaders=new ArrayList<LeaderLatch>();
List<CuratorFramework>clients=new ArrayList<CuratorFramework>(); TestingServer server=new TestingServer(); try{
for(int i=0;i<10;i++){
CuratorFramework client=CuratorFrameworkFactory.newClient(server.getConnectString(),new ExponentialBackoffRetry(20000,3));
clients.add(client); LeaderLatch leader=new LeaderLatch(client,"/francis/leader");
leader.addListener(new LeaderLatchListener(){ @Override
public void isLeader() {
// TODO Auto-generated method stub
System.out.println("I am Leader");
} @Override
public void notLeader() {
// TODO Auto-generated method stub
System.out.println("I am not Leader");
}}); leaders.add(leader); client.start();
leader.start();
} Thread.sleep(Integer.MAX_VALUE);
}finally{ for(CuratorFramework client:clients){
CloseableUtils.closeQuietly(client);
} for(LeaderLatch leader:leaders){
CloseableUtils.closeQuietly(leader);
} CloseableUtils.closeQuietly(server);
} Thread.sleep(Integer.MAX_VALUE);
} }
LeaderLatch和LeaderLatchListener方法介绍
LeaderLatch提供了如下方法:
start()/close():启动/停止LeaderLatch
addListener(LeaderLatchListener)/removeListener(LeaderLatchListener):添加/移除LeaderLatchListener
hasLeadership():如果LeaderLatch是Leader,那么返回true,否则false。
getLeader():
await:等待Leaderlatch成为Leader。
LeaderLatchListener提供了如下方法:
isLeader():当LeaderLatch的hasLeaderShip()从false到true后,就会调用isLeader(),表明这个LeaderLatch成为leader了。
notLeader():当LeaderLatch的hahLeaderShip从true到false后,就会调用notLeader(),表明这个LeaderLatch不再是leader了。
LeaderLatch在Master-Slave中的应用
在一个典型的master-slave场景下。你可以在isLeader中做如下处理:
1.每一个master类都有一个state属性,初始值为standby.
2.在isLeader中,从持久话引擎中读取要恢复的数据到一个临时的内存缓存中
3.将这个master的state修改为recovering
4.通知所有worker将其内部的master修改为当前master。
5.将临时内存缓存中的数据恢复到master内部。
6.将master状态修改为alive,然后这个master就可以对外服务了。
注意第5步,由于将持久话引擎中的数据添加到了master内部的内存中,所以需要确保之多恢复一次语义。
Curator leader 选举(一)的更多相关文章
- 04.Curator Leader选举
在分布式计算中,leader election是很重要的一个功能,这个选举过程是这样子的:指派一个进程作为组织者,将任务分发给各节点.在任务开始前,哪个节点都不知道谁是leader或者coor ...
- 【分布式】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 类的继承 ...
随机推荐
- virut详细分析
Virut分析 0x00.综合描述 virut样本的执行过程大体可以分为六步:第一步,解密数据代码,并调用解密后的代码:第二步,通过互斥体判断系统环境,解密病毒代码并执行:第三步,创建内存映射文件,执 ...
- 菜鸟笔记:java变量命名及峰驼式命名法
如同酒店会给每个房间起个性化的名字一样,程序中的变量也需要用合理的名字进行管理---变量名! 需要注意,给酒店房间起名字时可以是数字,如"802",也可以是有趣的名字,如" ...
- 卸载linux Mint自带jdk并安装最新jdk
查看安装的软件包sudo dpkg --list | grep -i jdk 删除jdksudo apt-get purge openjdk* 删除其他的包sudo apt-get purge ice ...
- MySQL详解--锁
http://blog.csdn.net/xifeijian/article/details/20313977 2014-03-06 23:45 66484人阅读 评论(17) 收藏 举报 分类: ...
- 写一个js向左滑动删除 交互特效的插件——Html5 touchmove
需求描述 需要实现类似QQ中对联系人的操作:向左滑动,滑出删除按钮.滑动超过一半时松开则自动滑到底,不到一半时松开则返回原处. 纯js实现 使用了h5的touchmove等事件,以及用js动态改变cs ...
- delphi tidhttp 超时设置无效的解决方法
现在delphi都发布到xe8了,tidhttp还有缺陷,那就是超时设置在没有网络或者连不上服务器的时候是无效的,不管你设置为多少都要10-20秒.connectTimeout和readTimeout ...
- Git的用法
Git的用法 Git 的也可以理解为版本控制器.版本控制器(维基的解释):维护工程蓝图的标准作法,能追踪工程蓝图从诞生一直到定案的过程.此外,版本控制也是一种软件工程技巧,借此能在软件开发的过程中,确 ...
- Mongodb 基础(Z)
Mongodb的客户端支持 作为一款非常成熟NoSQL数据库,Mongdb对各种编程语言的支持已经非常完善了,目前已经支持各大主流编程语言包括:1,mongo shell 2,Python 3,Jav ...
- AJXA 入门 前端界面操作(例题)
AJXA 处理界面 与之前的 嵌入 PHP 相比 不用 频繁的 刷新界面 mysql 链接数据库封装类 <?php class DBDA { public $host="lo ...
- 一键启动NameNode和DataNode--shell脚本
使用shell脚本,一键启动hadoop中的NameNode和DataNode.分为普通版和装逼版.装逼版较普通版多了很多判断和信息提示,当然主要还是为了我联系shell脚本而写的. 如果想实现复用, ...