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成员变量,它是一个枚举类型,可以是:DisconnectedSyncConnectedAuthFailedConnectedReadOnlyExpiredSaslAuthenticated等。
  • 调用getChildren的时候需要传一个Watcher对象,某个数据节点发送变化的时候服务器会推送消息给客户端,此时Watcher对象就会被调用。这种情况下我们关注eventType成员变量,它是一个枚举类型,可以是:NodeCreatedNodeDeletedNodeDataChangedNodeChildrenChanged等。

总结下来,一种Watcher用来监控Zookeeper的连接;一种Watcher用来监控数据的变化。

注意

  • Leader和Zookeeper之间是有心跳数据的,时间间隔是sessionTimeout决定的。
  • EPHEMERAL_SEQUENTIAL的含义有两个:EPHEMERAL,表示节点是临时的,当zookeeper和客户端断开连接的时候节点会被阐述;SEQUENTIAL,zookeeper会在节点最后加上一串数字后缀。
  • 所以重新选举的时间是实际上是由sessionTimeout决定的,zookeeper服务器探测到客户端断开后才会删除临时节点,推送变化,此时选举才会进行。

完整代码 https://gist.github.com/fireflyc/51d5467ef48b7f8c4a7747e5ecbd3fd0 (或者点击“原文链接”)

时间: 2024-10-08 12:32:49

Zookeeper实现分布式选举算法的相关文章

分布式选举算法

分布式选举算法-Paxos (2011-03-20 10:12:56) 转载▼ http://blog.sina.com.cn/s/blog_4b6e0fbb0100q9zh.html 标签: 文化 分类: 计算机杂文 (ZZ)分布式选举算法-Paxos 技术日志 2009-12-04 10:42:05 阅读589 评论0   字号:大中小 订阅 在分布式算法领域,有个非常重要的算法叫Paxos, 它的重要性有多高呢,Google的Chubby [1]中提到 all working protoc

分布式-选举算法

分布式-选举算法 2013-06-01 19:48 2540人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载. 本文是<分布式系统原理与范型>读书笔记. 分布式选举,现在大家都知道的是Paxos算法..... 许多分布式算法需要一个进程充当协调者.发起者或者其他某种特殊的角色.通常由哪个进程充当这个较色并不重要,重要的是它们中要有一个进程来充当.我们假设每个进程有一个唯一的编号,同时还假设每个进程知道所有其他进程的编号.但是进程不知道当前哪个进程正在运行,以及

图解zookeeper FastLeader选举算法【转】

转自:http://codemacro.com/2014/10/19/zk-fastleaderelection/ zookeeper配置为集群模式时,在启动或异常情况时会选举出一个实例作为Leader.其默认选举算法为FastLeaderElection. 不知道zookeeper的可以考虑这样一个问题:某个服务可以配置为多个实例共同构成一个集群对外提供服务.其每一个实例本地都存有冗余数据,每一个实例都可以直接对外提供读写服务.在这个集群中为了保证数据的一致性,需要有一个Leader来协调一些

图解zookeeper FastLeader选举算法

zookeeper配置为集群模式时,在启动或异常情况时会选举出一个实例作为Leader.其默认选举算法为FastLeaderElection. 不知道zookeeper的可以考虑这样一个问题:某个服务可以配置为多个实例共同构成一个集群对外提供服务.其每一个实例本地都存有冗余数据,每一个实例都可以直接对外提供读写服务.在这个集群中为了保证数据的一致性,需要有一个Leader来协调一些事务.那么问题来了:如何确定哪一个实例是Leader呢? 问题的难点在于: 没有一个仲裁者来选定Leader 每一个

分布式系统选举算法剖析

1.概述 我们在了解分布式选举算法之前,我们需要这样一种算法产生的背景.在一个分布式系统中,因为各种意外的因素,有的服务器可能会崩溃或变得不可靠,它就不能和其他服务器达成一致状态.因而这样就需要一种Consensus协议,来确保服务器的容错性,也就是说即使系统中有一两个服务器节点Crash,也不会影响其处理过程.为了让容错方式达成一致,我们不可能要求所有的服务器节点100%都达成Consensus状态,只要超过半数的大多数服务器节点Consensus即可,假设有N台服务器节点,(N/2)+1 就

【分布式】Zookeeper的Leader选举

一.前言 前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leader选举,接着就开始深入学习Leader选举. 二.Leader选举 2.1 Leader选举概述 Leader选举是保证分布式数据一致性的关键所在.当Zookeeper集群中的一台服务器出现以下两种情况之一时,需要进入Leader选举. (1) 服务器初始化启动. (2) 服务器运行期间无法和Leader保持连接. 下面就两种情况进行分析讲解. 1. 服务器启动时期的Leader选举 若进行

【分布式】Zookeeper的Leader选举-选举过程介绍

[分布式]Zookeeper的Leader选举-选举过程介绍 选举开始,服务器会各自为自己投票,在投票完成后,会将投票信息发送给集群中的所有服务器(观察者服务器不参与选举). 选票由两部分组成:服务器唯一标识myid和事务编号zxid,即(myid,xzid). zxid越大说明数据越新,在选择算法中的权重越大.myid越大,在选择算法中的权重越大. 比较选票时会先比较zxid,zxid大的获胜,zxid相同时比较myid,myid大的获胜,胜利方选票不变,失败方选票将变成与胜利方一样,并再次将

Zookeeper中的FastLeaderElection选举算法简述

Zookeeper是一个开源的分布式应用协调项目, 当中为了保证各节点的协同工作,Zookeeper在工作时须要有一个Leader. 而Leader是怎样被选举出来的?Zookeep中使用的缺省算法称为FastLeaderElection. Zookeeper的基本前提是多个节点都具备全局其他全部节点的基本信息(IP/port/SID),而SID是节点的唯一编号. 正常工作时"从节点"会从"主节点"(Leader)同步版本号信息,称为zxid. 一旦整个系统重新启动

Paxos分布式一致性算法简介和Apache ZooKeeper的概念映射

Paxos是一个基于消息传递的一致性算法,近几年被广泛应用于分布式计算中,Google的Chubby,Apache的Zookeeper都是基于它的理论来实现的,Paxos还被认为是到目前为止唯一的分布式一致性算法,其它的算法都是Paxos的改进或简化.Paxos只有在一个可信的计算环境中才能成立,这个环境是不会被入侵所破坏的. 由Leslie Lamport发明了Paxos算法,他目前供职于微软研究院.1998年在ACM Transactions on Computer Systems的<The