Zookeeper实现分布式选举算法
分布式系统中经常采用Master/Slave架构。(截止到目前为止我还没有碰到过其他架构。。。)这种架构中如果Master发生故障就会导致整个集群停止服务,为了提高系统的高可用性通常采用选举算法来选出Master。这样Master如果出现故障,Slave经过选举算法重新选择Master。通过Zookeeper可以非常容易实现这个功能,关键代码如下:(完整代码见文章最后的GitHub地址)
//申请做 leaderString prefix = "/ticket-";String myVote = zooKeeper.create(root + prefix, new byte[]{}, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);//获取所有参选人List<String> allVote = zooKeeper.getChildren(root, new Watcher() {…………});//寻找最小的id,谁最小谁是leaderString minVotePath = allVote.get(0);String minVote = fixForSorting(prefix, minVotePath);for (String vote : allVote) { String thisVoteId = fixForSorting(prefix, vote); if (thisVoteId.compareTo(minVote) < 0) { minVotePath = vote; minVote = thisVoteId; }}LOGGER.debug("当前leader {}", minVotePath);
选举过程非常简单,分为三步
在zookeeper上新增一个节点作为自己的选票(相当于自己指定自己做leader)。比如例子中我的root节点选择的是/ha,所有的服务器启动后都会在这个节点下新增一个ticket为前缀的新节点。这是一个比较特殊的节点,通过指定
EPHEMERAL_SEQUENTIAL
可以让Zookeeper帮我们给节点新增一串数字。(比如第一台启动的服务器得到的是ticket-0000000002、第二台得到的是ticket-0000000003)获取所有选票,(比如例子中通过getChildren方法获取/ha下面所有的节点)
比较选票,如果自己的选票是最小的,说明自己被选中做leader,(判断是否是leader的规则是id最小)否则就认为自己没有当选,等待节点变化迎接下次选举(通过Watcher对象)。
分析一下这个算法不难发现,如果有3台服务器启动,第一个向zookeeper“报告”的人会被当选为leader;如果它出现故障,第二个向zookeeper“报告”的人会被当选为leader,以此类推。这是一种非常原始的民主选举制度,有一个象征最高权力的“神器”,得到“神器”的就是大部落的酋长;很多人想要参选大酋长,那么谁跑得快最先抢到“神器”谁就是大酋长;如果在后面的“执政”期间酋长因为“太堕落”被干掉了那么第二名自动接管“神器”变成大酋长。把上面的代码执行两次,最先执行的程序会被选择为leader;杀死第一个进程,第二个进程的控制台会输出自己当选为leader的信息。(第二个进程不是立即输出信息,需要等待几秒钟)
Zookeeper Watcher
Watcher是一个接口,它的定义很简单
public interface Watcher { abstract public void process(WatchedEvent event);}
一个典型的Callback,当发生事件的时候(WatchedEvent
)由系统会调用process
方法。以Zookeeper Java Client为例,我们会在两个地方用到Watcher
对象
new ZooKeeper
的时候需要传一个Watcher
对象,在客户端连接到Zookeeper服务器或者断开连接或者Session过期的时候都会调用Watcher对象。这种情况下我们关注WatchedEvent
中的keeperState
成员变量,它是一个枚举类型,可以是:Disconnected
、SyncConnected
、AuthFailed
、ConnectedReadOnly
、Expired
、SaslAuthenticated
等。调用
getChildren
的时候需要传一个Watcher
对象,某个数据节点发送变化的时候服务器会推送消息给客户端,此时Watcher对象就会被调用。这种情况下我们关注eventType
成员变量,它是一个枚举类型,可以是:NodeCreated
、NodeDeleted
、NodeDataChanged
、NodeChildrenChanged
等。
总结下来,一种Watcher
用来监控Zookeeper的连接;一种Watcher
用来监控数据的变化。
注意
Leader和Zookeeper之间是有心跳数据的,时间间隔是sessionTimeout决定的。
EPHEMERAL_SEQUENTIAL
的含义有两个:EPHEMERAL
,表示节点是临时的,当zookeeper和客户端断开连接的时候节点会被阐述;SEQUENTIAL
,zookeeper会在节点最后加上一串数字后缀。所以重新选举的时间是实际上是由sessionTimeout决定的,zookeeper服务器探测到客户端断开后才会删除临时节点,推送变化,此时选举才会进行。
完整代码 https://gist.github.com/fireflyc/51d5467ef48b7f8c4a7747e5ecbd3fd0 (或者点击“原文链接”)
Zookeeper实现分布式选举算法的更多相关文章
- 分布式一致性协议之:Zab(Zookeeper的分布式一致性算法)
Zookeeper使用了一种称为Zab(Zookeeper Atomic Broadcast)的协议作为其一致性复制的核心,据其作者说这是一种新发算法,其特点是充分考虑了Yahoo的具体情况:高吞吐量 ...
- 图解zookeeper FastLeader选举算法
zookeeper当配置为群集模式,在启动或异常情况将被选举为的例子Leader.默认选择算法FastLeaderElection. 不知道zookeeper够考虑这样一个问题:某个服务能够配置为多个 ...
- 图解zookeeper FastLeader选举算法【转】
转自:http://codemacro.com/2014/10/19/zk-fastleaderelection/ zookeeper配置为集群模式时,在启动或异常情况时会选举出一个实例作为Leade ...
- 【分布式】Zookeeper的Leader选举-选举过程介绍(经典的Paxos算法解析)
一.前言 前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leader选举,接着就开始深入学习Leader选举. 二.Leader选举 2.1 Leader选举概 ...
- 【分布式】Zookeeper的Leader选举
一.前言 前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leader选举,接着就开始深入学习Leader选举. 二.Leader选举 2.1 Leader选举概 ...
- zookeeper集群搭建及Leader选举算法源码解析
第一章.zookeeper概述 一.zookeeper 简介 zookeeper 是一个开源的分布式应用程序协调服务器,是 Hadoop 的重要组件. zooKeeper 是一个分布式的,开放源码的分 ...
- Zookeeper选举算法原理
Zookeeper选举算法原理 Leader选举 Leader选举是保证分布式数据一致性的关键所在.当Zookeeper集群中的一台服务器出现以下两种情况之一时,需要进入Leader选举. (1) 服 ...
- zookeeper系列之五—Leader选举算法
leader选举算法 zookeeper server内部原理 zookeeper client
- 【原创】大数据基础之Zookeeper(3)选举算法
提到zookeeper选举算法,就不得不提Paxos算法,因为zookeeper选举算法是Paxos算法的一个变种: Paxos要解决的问题是:在一个分布式网络环境中有众多的参与者,但是每个参与者都不 ...
随机推荐
- testNG小试牛刀
testNG是一个测试框架,其灵感来自JUnit和NUnit的,但引入了一些新的功能,使其功能更强大,使用更方便. testNG是一个开源自动化测试框架:testNG表示下一代. testNG是类似于 ...
- android sqlite支持的数据类型
Sqlite3支持的数据类型 :NULL.INTEGER.REAL.TEXT.BLOB 但实际上,sqlite3也接受如下的数据类型: smallint 16 位元的整数. interge ...
- Android下 ionic view 无法登录
ionic view一个超棒工具,它是测试 ionic 框架搭建项目的app软件. 在它的官网有iphone 和 android 版本的下载地址.但是,这里只有在 google play 里面才有,而 ...
- 1651. Shortest Subchain(bfs)
1651 终于A了 看这题容易想到最短路 看到错的很多 还特意注意了好几处 后来发现 必须按给出的顺序出边 想了想 这不就是BFS 然后就是各种细节 i->i+1ori->j(a[i]== ...
- 关于fft的一点总结
好吧,其实我并没有深入运用fft,只会优化卷积 听说fft经常和生成函数结合在一起………………oi真是迅猛发展,我真是与时代脱节了…… 关于fft的学习推荐直接去看算法导论,写得非常清楚 主要弄懂n次 ...
- LA 3357 (递推 找规律) Pinary
n位不含前导零不含连续1的数共有fib(n)个,fib(n)为斐波那契数列. 所以可以预处理一下fib的前缀和,查找一下第n个数是k位数,然后再递归计算它是第k位数里的多少位. 举个例子,比如说要找第 ...
- powerScript脚本
一.powerScript的语法 1.0变量的命名及使用 powerscript的标识符(变量名称)必须以字母或下划线开头,其它的字符可以是下划线(_).短横线(-).美元符号($).号码符号(#) ...
- poj 2230 Watchcow(欧拉回路)
关键是每条边必须走两遍,重复建边即可,因为确定了必然存在 Euler Circuit ,所以所有判断条件都不需要了. 注意:我是2500ms跑过的,鉴于这道题ac的code奇短,速度奇快,考虑解法应该 ...
- php yii框架使用MongoDb
1.安装 运行 php composer.phar require --prefer-dist yiisoft/yii2-mongodb or add "yiisoft/yii2-mongo ...
- 如何让Vim显示dos下的^M符号
/*********************************************************************** * 如何让Vim显示dos下的^M符号 * 声明: * ...