第四章 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,那么同样坚持自己的投票,不做变更。

时间: 2024-10-25 20:31:07

第四章 Leader选举算法分析的相关文章

ZOOKEEPER3.3.3源码分析(四)对LEADER选举过程分析的纠正

很抱歉,之前分析的zookeeper leader选举算法有误,特此更正说明. 那里面最大的错误在于,leader选举其实不是在大多数节点通过就能选举上的,这一点与传统的paxos算法不同,因为如果这样的话,就会出现数据丢失的情况.比如某台服务器其实有最多的数据量,按照规则而言应该是leader,但是由于启动晚了,最后只能把leader让给其它的服务器.这里面存在明显的时序问题,也就是说leader服务器启动的早晚会影响整个过程. 实际上并不是这样,leader选举算法只有在收到所有参与服务器的

【分布式】Zookeeper的Leader选举

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

《数据结构与算法分析:C语言描述》复习——第四章“树”——AVL树

2014.06.15 16:22 简介: AVL树是一种高度平衡的二叉搜索树,其命名源自于联合发明算法的三位科学家的名字的首字母.此处“平衡”的定义是:任意节点的左右子树的高度相差不超过1.有了这个平衡的性质,使得AVL树的高度H总是接近log(N),因此各种增删改查的操作的复杂度能够保证在对数级别.没有bad case是AVL树与普通的二叉搜索树的最大区别.为了实现平衡性质,我们需要记录每个节点的高度(或者平衡因子)来检测不平衡的情况.为了修正高度不平衡,需要用到“旋转”的方法,分为单旋转和双

CentOS环境利用mariadb(mysql)数据库使用golang实现分布式系统的Leader选举

一.准备工作 1.下载安装vmware,步骤省略. 2.下载CentOS系统ios包:http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1611.iso 3.下载安装Xshell5,步骤省略. 4.下载安装git,步骤省略. 5.mariadb用于golang的api:https://github.com/go-sql-driver/mysql 6.vmware中依次点击"创建新的虚拟机&q

05.Curator Leader选举

在分布式计算中,leader election是很重要的一个功能,这个选举过程是这样子的:指派一个进程作为组织者,将任务分发给各节点.在任务开始前,哪个节点都不知道谁是leader或者coordinator.当选举算法开始执行后,每个节点最终会得到一个唯一的节点作为任务leader.除此之外,选举还经常会发生在leader意外宕机的情况下,新的leader要被选举出来. Curator有两种选举recipe,你可以根据你的需求选择合适的. 1.Leader Latch 1.LeaderLatch

第五部分 架构篇 第十四章 MongoDB Replica Sets 架构(自动故障转移/读写分离实践)

说明:该篇内容部分来自红丸编写的MongoDB实战文章. 1.简介 MongoDB支持在多个机器中通过异步复制达到故障转移和实现冗余,多机器中同一时刻只有一台是用于写操作,正是由于这个情况,为了MongoDB提供了数据一致性的保障,担当primary角色的服务能把读操作分发给Slave(详情请看前两篇关于Replica Set成员组成和理解). MongoDB高可用分为两种: Master-Slave主从复制:只需要在某一个服务启动时加上-master参数,而另外一个服务加上-slave与-so

跟着实例学习ZooKeeper的用法: Leader选举

http://colobu.com/2014/12/12/zookeeper-recipes-by-example-1/ ZooKeeper官方给出了使用zookeeper的几种用途. Leader Election Barriers Queues Locks Two-phased Commit 其它应用如Name Service, Configuration, Group Membership 在实际使用ZooKeeper开发中,我们最常用的是Apache Curator. 它由Netflix

zookeeper curator学习(配合spring boot模拟leader选举)

基础知识:http://www.cnblogs.com/LiZhiW/p/4930486.html 项目路径:https://gitee.com/zhangjunqing/spring-boot  查找下面四个项目就可以了 zookeeper版本为zookeeper-3.4.9(需要查找合适的curator版本) 三个spring bootweb项目: 官方案例leader: 思路:新建三个spring boot web项目,在这三个web项目中定义一个过滤器来在初始化时抢夺leader权限,如

Zookeeper详解-工作流和leader选举(三)

一.工作流 一旦ZooKeeper集合启动,它将等待客户端连接.客户端将连接到ZooKeeper集合中的一个节点.它可以是leader或follower节点.一旦客户端被连接,节点将向特定客户端分配会话ID并向该客户端发送确认.如果客户端没有收到确认,它将尝试连接ZooKeeper集合中的另一个节点. 一旦连接到节点,客户端将以有规律的间隔向节点发送心跳,以确保连接不会丢失. 如果客户端想要读取特定的znode,它将会向具有znode路径的节点发送读取请求,并且节点通过从其自己的数据库获取来返回