文档章节

zookeeper Leader Elections

robin-yao
 robin-yao
发布于 2015/04/17 22:31
字数 966
阅读 141
收藏 1

     本文主要介绍zookeeper leader选举机制。

     zookeeper中leader主要处理来至客户端的写请求,包括create、setData、delete等改变数据的状态的写请求。在zookeeper集群中,每一个zookeeper Server节点开始的状态都是LOOKING,它必须选择一个新的Leader,或者找到已经存在的Leader。

     如果此时,集群中存在 Leader,其他集群的中节点将通知新进入的Server节点哪个是Leader节点,新节点将连接到Leader上,并且同步Leader的状态,使之一致。

      如果此时集群不存在Leader,都是LOOKING状态,它们将选举出新的Leader。节点通过相互发送消息,选举出Leader。选举出的节点将进入LEADING状态,其他的节点将进入FOLLOWING状态。

    leader选举消息又被叫作leader选举通知。当一个节点进入LOOKING状态时,它将发送给其他每一个节点通知。通知包含它当前的选举(vote),由sid (Server Id) 和 zxid(zookeeper事务id,最新的事务id)组成。比如(1,5)通知代表被server id为1,最新事务id为5的节点放送的。

    当收到一个vote通知,节点将根据如下规则改变自己的vote:

    1设定 voteId 和 voteZxid 代表当前节点受到的vote标识,myZxid和mySid代表receiver自己本身的值。

    2 如果 voteZxid > myZxid 或者 (voteZxid==myZxid and voteId > mySid),receiver将保持当前的vote,也就是赞同当前的选举。

    3否者,receiver将改变自己的vote, 该vote 为(mySid,myZxid),也就是说我不赞同当前收到的vote,我要自己当领         导。

简而言之,就是最近发起的vote将会获胜,谁的zxid大,谁获胜,如果zxid相同,就只能比较节点标示id的大小了(同一辈子,嫡长子继承了,哈哈)。紧接着,如果receiver赞同收到的选举,它将向其他节点发送该通知。一旦有一个节点 收到  来至半数  以上的节点 同样的vote(sid,zxid),该节点就声明LEADER选举出来了。如果LEADER是该节点本身,它将承担起Leader角色的功能。如果不是,它将变为一个Follower,并且连接LEADER,同步leader的状态,然后处理来至客户端的请求。

  通过如下图详解上述过程,假设集群中有三个节点:

         第一步:3个节点都将向其他节点 发送各自的选举vote ;

         第二步:通过我们刚才讲的规则,S2 和 S3的zxid比较小,所以它们的vote都变为(1,6),并且通知其他节点;

         第三步:三个节点 都收到半数以上的对(1,6)选举。所以S1被选为Leader。

并不是所有的选举过程都像上面的过程那么顺利,往往由于网络delay,会造成不同上述的过程。如下:

     第一步:由于S1 到 S2 网络delay,当S2受到S3的vote(3,5),并赞同该(3,5),发出通知,选举S3。

     第二步:S3受到(1,6),但是由于网络delay,它发出的通知到S1比较慢,而此时,S3已经有半数的投票了。所以S3被选为Leader。

    第三步:S1接到S3的投票,S1也有半数以上的投票,S1也被选为Leader。

这样会怎么办呢??  在第二步的时候S3不响应S2提出选自己作为Leader,因为自己vote已经变为(1,6)了,所以S3不会相应S2提出自己作为Leader的要求。所有S2会等待超时,最终S1成为Leader。 

  这只是一种延时的例子,还有很多其他例子,就不一一列举了。

 该文章内容参照:ZooKeeper: Distributed Process Coordination 这本书。

 转发请标注来源:http://my.oschina.net/robinyao/blog/403215

END----------------------------------------------------------------------


 

     

© 著作权归作者所有

共有 人打赏支持
robin-yao
粉丝 155
博文 54
码字总数 61496
作品 0
杭州
详解分布式应用程序协调服务Zookeeper

欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 主从结构:HDFS、Yarn、HBa...

李金泽
03/09
0
0
zookeeper的安装与部署-集群

环境:centos7 、JDK8 一、Zookeeper原理简介 ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。 ...

binhu
2017/11/07
0
0
大数据教程(3.3):zookeeper简介

一、概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功...

em_aaron
07/28
0
0
zookeeper3.3学习笔记4:zookeeper的三种角色

zookeeper的每个节点可以有如下三种角色: 1.leader和follower ZooKeeper需要在所有的服务(可以理解为服务器)中选举出一个Leader,然后让这个Leader来负责管理集群。此时,集群中的其它服务...

涩女郎
2015/06/20
0
0
这可能是把ZooKeeper概念讲的最清楚的一篇文章

我本人曾经使用过 ZooKeeper 作为 Dubbo 的注册中心,另外在搭建 Solr 集群的时候,我使用到了 ZooKeeper 作为 Solr 集群的管理工具。 前几天,总结项目经验的时候,我突然问自己 ZooKeeper ...

51CTO技术栈
09/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

gson1.7.1线程并发导致空指针问题

java.lang.NullPointerExceptionat com.google.gson.FieldAttributes.getAnnotationFromArray(FieldAttributes.java:231)at com.google.gson.FieldAttributes.getAnnotation(FieldAttribut......

东风125
32分钟前
1
0
以太坊RPC接口使用

以太坊RPC接口文档: https://github.com/ethereum/wiki/wiki/JSON-RPC#web3_clientversion 使用方式: 比如我要调用某个合约的balanceOf(address _owner)方法。 因为没有改变合约的状态,所以...

王坤charlie
58分钟前
2
0
C#下的一个好用的日历库(sxtwl_cpp),支持农历转公历,和公历转农历等功能

sxtwl_cpp是寿星天文历的C++版本实现。支持多种语言的绑定 代码首页 懒人包 懒人包使用方法 1、右链工程中的引用-》添加引用-》浏览-》选中dotnet目录下的sxtwl.net.dll 2、生成解决方案-》找...

元谷
59分钟前
1
0
C++基础知识

链接:https://zhuanlan.zhihu.com/p/38399566 本文主要提一下以下三个区别: 引用必须初始化,而指针可以不初始化。 我们在定义一个引用的时候必须为其指定一个初始值,但是指针却不需要。 ...

悲催的古灵武士
今天
1
0
Oracle备份脚本,保留10天数据

@echo off echo 删除10天前的备分文件和日志forfiles /p "D:\oracleback\backfile" /m *.dmp /d -10 /c "cmd /c del @path" forfiles /p "D:\oracleback\backfile" /m *.log /d -10......

lyle_luo
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部