第四章 Leader选举算法分析
Leader选举
学习leader选举算法,主要是从选举概述,算法分析与源码分析(后续章节写)三个方面进行。
Leader选举概述
服务器启动时期的Leader选举
选举的隐式条件便是ZooKeeper的集群规模至少是2台机器,以3台机器组成的服务器集群为例。在服务器集群初始化阶段,当有一台服务器(myid为1,称为Server1)启动的时候,无法完成Leader选举。第二台机器(myid为2,称其为Server2)也启动后,此时这两台机器已经能够进行互相通信,每台机器都试图找到一个Leader,干是便进入了 Leader选举流程。
1.每个Server会发出一个投票。
初试启动时,Serverl和Server2都选举自己为leader,每次投票包含的最基本的元素包括:所推举的服务器的myid和ZXID,以(myid, ZX1D)的形式来表示。即Serverl的投票为(1, 0), Server2的投票为(2, 0),然后各自将这个投票发给集群中其他所有机器。
2. 接收来自各个服务器的投票。
集群中的每个服务器在接收到投票后,首先会判断该投票的有效性,包括检查是否是本轮投票、是否来自LOOKING状态的服务器。
3. 处理投票。
针对收到的每一张选票,都需要将別人的投票和自己的投票进行PK, PK的规则如下:
a.首先比较ZXID。 ZXID大的选票胜出。
b.当ZXID相同时,myid大的选票胜出。
对于Server1来说,初试投票是(1,0) ,接收到的投票为(2,0)。两者的ZXID都是0,对比两者的myid, Server1接收到的投票中的myid是2,大于自己,于是就会更新自己的投票为(2,0),然后重新将投票发出去。对于Server2来说,不需要更新自己的投票信息,只是再一次向集群中所有机器发出上一次投票信息。
4. 统计投票。
每次投票后,服务器都会统计所有投票,如果一台机器收到超过半数的相同的投票,那么这个投票对应的SID机器即成为Leader。对于Server1和Server2服务器来说,都统计收到(2, 0)这个投票信息两票。
5. 改变服务器状态。
服务器运行期间的Leader选举
当leader所在的机器挂了,整个集群将暂时无法对外提供服务,集群进入新一轮的leader选举。服务器运行期间的Leader选举和启动时期的Leader选举基本过程是一致。假设当前正在运行的ZooKeeper服务器由3台机器组成,分别是Server1、 Server2和Server3,当前的Leader是Server2,在某一个瞬间, Leader挂了。
1.变更状态
Follower将状态变更为LOOKING
2.每个Server发出一个投票
假定Served的ZXID为123 ,而Server3的ZXID为122。在第一轮投票中, Server1和Server3都会投自己,即分别产生投票(1,123)和(3, 122),然后各自将这个投票发给集群中所有机器。
3. 接收来自各个服务器的投票。
4.处理投票
根据选票PK规则,server1的投票胜出。Server3将自己的选票变更为(1,123)重新投出。
5.统计投票
6.改变服务器状态
算法分析
在ZooKeeper中,提供了三种Leader选举的算法,分别是LeaderElection'、UDP版本的FastLeaderElection 和 TCP 版本的 FastLeaderElection,可以通过在配置文件 zoo.cfg中使用electionAlg属性来指定,分别使用数字0~3来表示。0代表LeaderElection,这是一种纯UDP实现的Leader选举算法;1代表UDP版本的FastLeaderElection,并且是非授权模式; 2也代表UDP版本的FastLeaderElection,但使用授权模式;3代表TCP版本的FastLeaderElection。从3.4.0版本开始, ZooKeeper废弃了 0、1和2这三种Leader选举算法,只保留了 TCP版本的FastLeaderElection选举算法。
关于进入Leader选举
当ZooKeeper集群中的一台服务器出现以下两种情况之一时,就会开始进人Leader选举。
a.服务器初始化启动。
b.服务器运行期间无法和Leader保持连接。
当一台机器进人Leader选举流程时,当前集群也可能会处于以下两种状态。
a.集群中本来就已经存在一个Leader。
b.集群中确实不存在Leader。
第一种已经存在Leader的情况通常是集群中的某一台机器启动比较晚,在它启动之前,集群已经可以正常工作,即已经存在了一台Leader服务器。针
对这种情况,当该机器试图去选举Leader的时候,会被告知当前服务器的Leader信息,对于该机器来说,仅仅需要和Leader机器建立起连接,并进行状态同步即可。
关于变更选票
集群中的每台机器发出自己的投票后,也会接收到来自集群中其他机器的投票。每台机器都会根据一定的规则,来处理收到的其他机器的投票,并以此来决定是否需要变更自己的投票。这个规则也成为了整个Leader选举算法的核心所在。
• vote_sid:接收到的投票中所推举Leader服务器的SID。
• vote_zxid:接收到的投票中所推举Leader服务器的ZXID。
• self_sid:当前服务器自己的SID。
• self_zxid:当前服务器自己的ZXID。
每次对干收到的投票的处理,都是一个对(vote_sid, vote_zxid)和(self_sid,self_zxid)对比的过程。
• 规 则 1 : 如 果 vote_zxid大于self_zxid,认可当前收到的投票,并再次将该投票发送出去。
• 规 则 2 : 如 果 vote_zxid小于self_zxid,那么就坚持自己的投票,不做任何变更。
• 规 则 3 : 如 果 vote_zxid等于self_zxid,那么就对比两者的SID。如果vote_sid大于self_sid,那么就认可当前接收到的投票,并再次将该投票发送出去。
• 规 则 4 : 如 果 vote_zxid等于self_zxid, 并 且 vote_sid小于self_sid,那么同样坚持自己的投票,不做变更。
第四章 Leader选举算法分析的更多相关文章
- ZOOKEEPER3.3.3源码分析(四)对LEADER选举过程分析的纠正
很抱歉,之前分析的zookeeper leader选举算法有误,特此更正说明. 那里面最大的错误在于,leader选举其实不是在大多数节点通过就能选举上的,这一点与传统的paxos算法不同,因为如果这 ...
- Zookeeper入门(四)之Leader选举
让我们分析如何在ZooKeeper集合中选举leader节点.考虑一个集群中有N个节点.leader选举的过程如下: 所有节点创建具有相同路径 /app/leader_election/guid_ 的 ...
- 【分布式】Zookeeper的Leader选举
一.前言 前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leader选举,接着就开始深入学习Leader选举. 二.Leader选举 2.1 Leader选举概 ...
- 《从Paxos到ZooKeeper 分布式一致性原理与实践》阅读【Leader选举】
从3.4.0版本开始,zookeeper废弃了0.1.2这3种Leader选举算法,只保留了TCP版本的FastLeaderElection选举算法. 当ZooKeeper集群中的一台服务器出现以下两 ...
- Zookeeper系列(十一)zookeeper的Leader选举详解(核心之一)
作者:leesf 掌控之中,才会成功:掌控之外,注定失败. 出处:http://www.cnblogs.com/leesf456/p/6107600.html尊重原创,奇文共欣赏: 一.前言 前 ...
- 【分布式】Zookeeper的Leader选举-选举过程介绍(经典的Paxos算法解析)
一.前言 前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leader选举,接着就开始深入学习Leader选举. 二.Leader选举 2.1 Leader选举概 ...
- zookeeper集群搭建及Leader选举算法源码解析
第一章.zookeeper概述 一.zookeeper 简介 zookeeper 是一个开源的分布式应用程序协调服务器,是 Hadoop 的重要组件. zooKeeper 是一个分布式的,开放源码的分 ...
- 面试官:Redis集群有哪些方式,Leader选举又是什么原理呢?
哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 作为一名Java程序员,Redi ...
- Zookeeper-Zookeeper leader选举
在上一篇文章中我们大致浏览了zookeeper的启动过程,并且提到在Zookeeper的启动过程中leader选举是非常重要而且最复杂的一个环节.那么什么是leader选举呢?zookeeper为什么 ...
随机推荐
- 4、java中有专门的的函数对数组进行排序
在java.util包中的Arrays提供了众多的排序算法可以应用.
- 电脑控制台灯(c# hook,显示室温,联网校正时间)
突发奇想,于是便写了一个小程序用于控制台灯,这几天功能也在不断的完善中,目前基本已经完成.下面进行功能的简述的代码的分析. 整体设计包含下位机程序和上位机程序.下位机用的c语言,上位机用的 ...
- FC 坦克大战 老巢铁墙
老巢外围铁墙E2A9:AC 80 EFEF80:A5 10 85 45 A5 45 AC D2 E2 用十六进制编辑器打开坦克大战的游戏文件搜索A5 45 F0 25 A5 0B改为AC 80 EF ...
- Esfog_UnityShader教程_逐帧动画
有段日子没出这个系列的新文章了,今天就拿一个比较常见也比较基础的利用改变Shader来改变不断调整UV实现播放逐帧动画的小功能.很久没写了就当练练手了.在新版本的Unity中早就已经集成了Sprite ...
- 实习日记:图像检索算法 LSH 的总结与分析(matlab)
最开始仿真和精度测试,基于 matlab 完成的. Demo_MakeTable.m (生成 Hash 表) %======================================== %** ...
- Android 多点触控与简单手势(一)
现在一般的Android手机都会使用电容触摸屏最少可以支持两点触摸,多的可能是七八个,所以基本上都会支持多点触控, android系统中应用程序可以使用多点触控的事件来完成各种手势和场景需求. And ...
- Libevent库 编译与使用
Libevent官网:http://libevent.org/ windows 7下编译: 编译环境: windows 7 + VS2010 (1)解压libevent到F:\libevent\lib ...
- vagrant系列教程(四):vagrant搭建redis与redis的监控程序redis-stat(转)
上一篇php7环境的搭建 真是火爆,仅仅两天时间,就破了我之前swagger系列的一片文章,看来,大家对搭建环境真是情有独钟. 为了访问量,我今天再来一篇Redis的搭建.当然不能仅仅是redis的搭 ...
- iOS nib file owner
nib文件中的file owner属性,设定后app在运行时加载nib文件的过程中会通过file owner重新建立nib文件中描述的控件与其在file owner中对应的IBOutlet或IBAct ...
- 【226】C# 相关功能实现代码
目录: 1. 实现代码的等待操作 2. 实现文件夹/文件打开操作 3. 建立事件模板,然后调用 4. 用代码在Form中写控件,同时可以编写控件数组 5. 用代码执行事件 1. 实现代码的等待操作 ...