1、服务器的三种角色

Raft算法中服务器主要分为三种角色:LeaderFollowerCandidate,并且三种角色相互独立,也就是服务器在同一时间内只可能扮演其中一种角色。

Leader:用于对所有用户的请求进行处理以及日志的复制等等。
Follower:不会主动发送消息,只响应来自LeaderCandidate的请求。
Candidate:用于选举新的Leader。

2、任期介绍

Raft 算法将时间划分成为任意不同长度的任期(term)。任期用连续的数字进行表示。每一个任期的开始都是一次选举(election),一个或多个候选人会试图成为领导人。如果一个候选人赢得了选举,它就会在该任期的剩余时间担任领导人。在某些情况下,选票会被瓜分,有可能没有选出领导人,那么,将会开始另一个任期,并且立刻开始下一次选举。Raft 算法保证在给定的一个任期最多只有一个领导人。

3、网络状态

网络状态分为两种情况:选举阶段,正常运行阶段。备注:网络状态还可能会有成员变化阶段,暂时先不考虑。

每一个任期都是以选举阶段开始。但不一定以正常运行阶段结束。在某些情况下一个完整的任期可能全部为选举阶段。如下图:

4、选举阶段->正常运行阶段

在网络初始化时,网络中所有的服务器都以Follower的角色启动。由于Follower只被动接收消息,所以全网中所有服务器都处于等待状态。同时每一个服务器都在本地维护一个计时器。计时器的作用很简单,就是判断当前阶段(选举阶段或正常运行阶段)是否超时,而当计时器超时后,任期将会加1。

总之,在网络启动后所有服务器等待指定长度的一段时间之后,计时器将会超时。这时候计时器超时的服务器将转换自己的角色为Candidate,从而进入选举阶段。进入选举阶段的Candidate将会做以下几件事:

(1)将自己的任期号加1。
(2)为自己投一票用以选举出新的Leader。
(3)将本地的计时器重置。
(4)发送投票请求到网络中的其他所有的服务器。
(5)等待下一次的计时器超时。

同时,投票选举Leader具有以下几点要求:

(1)每个服务器在一个任期内只能投一票,并且只能投先到者(即投票给自己收到的第一个请求)。如果没有先到者,只能投票选自己了。
(2)请求投票的消息中需要带有请求者所处的当前任期号。
(3)投票者只会投票给任期号大于等于自己当前任期号的服务器。

在选举状态会出现三种结果:

(1)自己成功当选Leader
(2)网络中其他服务器当选Leader
(3)网络中没有服务器当选Leader

当网络中某一个Candidate接收到网络中大多数成员的投票后,即可将自己的身份转换为Leader。在当选Leader后,该服务器将周期性地发送心跳信息(心跳信息包含成功当选Leader的服务器的当前任期号)到网络中其他服务器。在网络中其他的服务器收到心跳信息后检查心跳消息中的任期号是否大于等于自己的任期号。如果满足该条件的话Candidate将会转换为Follower状态,并重置计时器。而如果任期号小于自己的任期号,服务器将拒绝该心跳消息并继续处于Candidate状态。

第三种情况为网络中没有服务器成功当选Leader。这种情况在有很多Follower同时成为Candidate时会发生。因为当角色转换为Candidate后将会将选票投给自己,从而导致选票被分散开来,没有Candidate可以得到网络中大部分节点的选票,从而没有节点可以成为Leader。这种情况下计时器将再次超时,网络状态将从选举阶段进入下一个选举阶段,同时Candidate将会再次执行上面说明的几件事。

Raft算法采用了随机选举超时机制来避免出现这种情况。即当计时器超时后,服务器将随机延迟指定的时间后才进入选举阶段。
由于随机延迟的原因,将降低服务器在同一时间选举超时的情况,可以有效避免选票分散的情况。

5、正常运行阶段->选举阶段

Leader成功选举之后,将周期性发送心跳消息到网络中其他服务器。同时其他服务器将转换自己的角色为Follower,并且每次收到心跳消息后都会重置自己的计时器,防止超时再次进入选举阶段。

如果Leader因为特殊情况崩溃时,网络中的其他服务器将不再接收到心跳消息,在等待指定时间后计时器将会超时,从而再次进入选举阶段。

如果Leader崩溃时间较短,可以在其他服务器计时器超时之间恢复,并发送心跳消息,网络仍然可以恢复为Leader崩溃之前的状态。

如果Leader崩溃时间较长,在网络中已有新的Leader选举产生后恢复,由于旧的Leader任期号将小于新的Leader,在旧的Leader接收到新的Leader发送的心跳消息后则会变为Follower状态。

6、参考

http://www.mybatis.cn/archives/1147.html

Raft算法系列教程1:Leader选举的更多相关文章

  1. Raft算法系列教程2:状态机复制 (State Machine Replication)

    分区容错如何保证? 在分布式系统设计中,需要遵循CAP理论,如果我们要让一个服务具有容错能力,那么最常用最直接的办法就是让一个服务的多个副本同时运行在不同的节点上.但是,当一个服务的多个副本都在运行的 ...

  2. Raft算法系列教程3:日志复制

    1.日志复制的过程 Leader选出后,就开始接收客户端的请求.Leader把请求作为日志条目(Log entries)加入到它的日志中,然后并行的向其他服务器发起 AppendEntries RPC ...

  3. Raft算法系列教程4:日志不一致的解决

    网络不可能一直处于正常情况,因为Leader或者某个Follower有可能会崩溃,从而导致日志不能一直保持一致.因此存在以下三种情况: (1)Follower缺失当前Leader上存在的日志条目.(2 ...

  4. 分布式一致性算法:Raft 算法(论文翻译)

    Raft 算法是可以用来替代 Paxos 算法的分布式一致性算法,而且 raft 算法比 Paxos 算法更易懂且更容易实现.本文对 raft 论文进行翻译,希望能有助于读者更方便地理解 raft 的 ...

  5. 【转】分布式一致性算法:Raft 算法(Raft 论文翻译)

    编者按:这篇文章来自简书的一个位博主Jeffbond,读了好几遍,翻译的质量比较高,原文链接:分布式一致性算法:Raft 算法(Raft 论文翻译),版权一切归原译者. 同时,第6部分的集群成员变更读 ...

  6. 学习Raft算法的笔记

    Raft是一种为了管理日志复制的一致性算法.它提供了和Paxos算法相同的功能和性能,但是它的算法结构和Paxos不同,使得Raft算法更加容易理解并且更容易构建实际的系统.为了提升可理解性,Raft ...

  7. 10分钟弄懂Raft算法

    分布式系统在极大提高可用性.容错性的同时,带来了一致性问题(CAP理论).Raft算法能够解决分布式系统环境下的一致性问题. 我们熟悉的ETCD注册中心就采用了这个算法:你现在看的这篇微信公众号文章, ...

  8. Raft算法原理剖析

    一.复制状态机(replicated state machine) Raft协议可以使得一个集群的服务器组成复制状态机,在详细了解Raft算法之前,我们先来了解一下什么是复制状态机.一个分布式的复制状 ...

  9. 30分钟带你理解 Raft 算法

    为什么需要 Raft? Raft 是什么? Raft 的目标 前置条件:复制状态机 Raft 基础 Leader 选举(选举安全特性) 日志复制(Leader只附加.日志匹配) 安全 学习资料 使用 ...

随机推荐

  1. Macos系统上怎么自动下载任务

    相对于Windows系统来说,好用的Mac下载工具就显得比较少了.Folx作为Mac下载工具中的佼佼者,其自动化下载功能受到很多Mac系统用户的欢迎. 随着高清影视的发展,很多影视资源体动辄就是1-2 ...

  2. 详细了解IDM的“计划任务”功能

    今天我们一起来看看IDM下载器的"计划任务"功能. IDM是什么就不多说了,只需要知道它是一个十分好用的资源下载器就行了,下载速度非常快,搭配一些浏览器扩展程序甚至能加速百度盘的下 ...

  3. Idea中如何导入jar包

    1.首先在idea左上角找到" File ",然后找到 "Project structure" 2.接着选择 " java ",选择后接着会 ...

  4. MySql学习笔记--详细整理--上

    目录 MySql MySql安装 连接数据库 操作数据库 数据库的列类型 数据库的字段属性 创建数据库 修改删除表 数据管理 外键 DML语言 添加 修改 删除 DQL查询数据(重点) 查询 去重 w ...

  5. dubbo起停之服务暴露

    由上一节可知带上dubbo@Service注解的对象,在注册成为bean之后会进一步注册一个ServiceBean,服务暴露便是在这里 public void afterPropertiesSet() ...

  6. 【mq学习整理】mq速览

  7. synchronized底层揭秘

    前言 上篇文章我们从硬件级别探索,对可见性和有序性的认识上升了一个高度,却迟迟没有介绍原子性的解决方案. 今天我们就来聊一聊原子性的解决方案,锁. 引入锁机制,除了可以保证原子性,同时也可以保证可见性 ...

  8. 线性代数中的线性方程组(chapter 1)

    目录 线性代数中的线性方程组 线性方程组 行化简解法和阶梯型矩阵 向量方程 矩阵方程$Ax = b$ 线性代数中的线性方程组 第一章从线性方程组的角度,通过解线性方程组,开始解释数学矩阵,以及和线性代 ...

  9. 网络 华为 ensp 命令

    VLAN 端口有三种模式:access,hybrid,trunk. Access类型端口:只能属于1个VLAN,且该端口不打tag,一般用于连接计算机端口: Trunk类型端口:可以允许多个VLAN通 ...

  10. 少标签数据学习:宾夕法尼亚大学Learning with Few Labeled Data

    目录 Few-shot image classification Three regimes of image classification Problem formulation A flavor ...