目标:分布式集群中,选举Leader,保持数据一致性
 
集群中每个节点都有三种状态:
  1. Follower:纯小弟
  2. Candidate:候选人。我原来是小弟,但我现在想当老大
  3. Leader:老大
集群状态:
  1. 有明确的老大(稳定状态)
  2. 没有老大,选举中
有老大的状态:
Follower内有倒计时(150ms~300ms)。Leader定期(例如50ms)给follower发心跳消息(广播告诉小弟:老大还活着,所有人继续当小弟)。小弟收到心跳后,重置倒计时器。
所有节点内,维持一个数据结构(Term2,LeaderA),表示当前是第2任老大,老大是A
 
一旦老大挂了:
此时所有小弟还在倒计时,但是收不到老大的心跳了...
直到某个小弟B自身倒计时结束,他首先意识到“老大挂了,社团不能没有老大,我最早觉醒的,那么就有我来开启新时代(Term+1)吧“(自身状态为Candidate)。
于是,B广播给所有小弟(包括已经凉了的A),“大家来选举第3任老大,老大是B”(发送VFM(VoteForMe)消息)。
其他小弟发现要来到新时代了(Term3>Term2),不管自身倒计时有没有结束,纷纷拥护B作为新老大(返回OK信息,更新自身数据结构:Term3,LeaderB)。
B收到多数人的投票后,就成为名副其实的新一任的老大(状态:Candidate->Leader)
B作为老大,定时给所有小弟发送AppendEntries消息(我已经得到权威认证了)
  
如果两个小弟同时觉醒
例如B、C。设定,集群为5个节点,A、B、C、D、E,此时,A凉了,B、C同时觉醒相当老大,D、E还是小弟状态(倒计时中)
那么,B、C会同时向其他节点(B->ACDE,C->ABDE)发送VFM消息(B的VFM消息:Term3,LeaderB;C的VFM消息是Term3,LeaderC)。
DE收到消息后,会做如下逻辑判断:VFM.Term > this.Term ? OK:不OK。(如果要开启新时代,那么就认新老大。不认旧时代的新老大)
例如,E先收到C的VFM消息,判断了一下this.Term(2)<VFM.Term(3) 成立,于是更新自身状态(Term3,LeaderC),认C为新老大;
之后E又收到了B的VFM消息,判断了一下this.Term(3)<VFM.Term(3) 不成立,于是给B回不同意的消息,我在Term3时代不认B做老大。。
 
此时,集群整体会存在两种情况:
  1. B、C各自收到相等的投票,选举失败状态,例如(B:D同意E反对;C收到:D反对E同意,A凉了)
    1. 那么,B、C各自重新开启一个随机倒计时(Elaction),谁先倒计时完,谁再重新广播VFM请求(例如,C先倒计时结束,则发起新的Vote,Term4,LeaderC)
  2. B、C收到不等的投票,例如(DE选举C,无人选B,A凉了)
    1. 那么,C认为自己是老大,开始对B、D、E广播AppendEntries(我C是老大)。
    2. 虽然B在倒计时等待重新发起Election,但是一旦收到AppendEntries请求,就认为C是老大,自己回到Follower状态
 
参考:

Raft选举算法的更多相关文章

  1. RAFT选举算法-分布式数据库困惑

    在做HIS研发工作的时候一直想完善其数据组件,想做一个分布式的数据库支持系统.但一直以来都不清楚这个选举算法应怎么做,原来有一个叫raft的算法https://www.cnblogs.com/just ...

  2. 分布式系统一致性问题和Raft一致性算法

    一致性问题 一致性算法是用来解决一致性问题的,那么什么是一致性问题呢? 在分布式系统中,一致性问题(consensus problem)是指对于一组服务器,给定一组操作,我们需要一个协议使得最后它们的 ...

  3. [转载] 一致性问题和Raft一致性算法

    原文: http://daizuozhuo.github.io/consensus-algorithm/ raft 协议确实比 paxos 协议好懂太多了. 一致性问题 一致性算法是用来解决一致性问题 ...

  4. raft共识算法

    raft共识算法 分布式一致性问题 如果说,服务器只有一个节点,那么,要保证一致性,没有任何问题,因为所有读写都在一个节点上发生.那如果server端有2个.3个甚至更多节点,要怎么达成一致性呢?下面 ...

  5. 分布式协议学习笔记(一) Raft 选举

    Raft官网 官方可视化动画1 官方可视化动画2 论文中文翻译 论文英文地址 感觉作为paxos的升级精简版 Raft在设计之初就以容易理解为目标 看完资料 脑海里都有了大概的轮廓. 有了这些详细的资 ...

  6. Raft 一致性算法论文译文

    本篇博客为著名的 RAFT 一致性算法论文的中文翻译,论文名为<In search of an Understandable Consensus Algorithm (Extended Vers ...

  7. 一致性问题和Raft一致性算法——一致性问题是无法彻底解决的,可以说一个分布式系统可靠性达到99.99…%,但不能说它达到了100%

    一致性问题 一致性算法是用来解决一致性问题的,那么什么是一致性问题呢? 在分布式系统中,一致性问题(consensus problem)是指对于一组服务器,给定一组操作,我们需要一个协议使得最后它们的 ...

  8. Raft共识算法详解

    Raft共识算法 一.背景 拜占庭将军问题是分布式领域最复杂.最严格的容错模型.但在日常工作中使用的分布式系统面对的问题不会那么复杂,更多的是计算机故障挂掉了,或者网络通信问题而没法传递信息,这种情况 ...

  9. etcd学习(5)-etcd的Raft一致性算法原理

    ETCD的Raft一致性算法原理 前言 Raft原理了解 raft选举 raft中的几种状态 任期 leader选举 日志复制 安全性 leader宕机,新的leader未同步前任committed的 ...

随机推荐

  1. 批量kill掉包含某个关键字的进程

    需要把 linux 下符合某一项条件的所有进程 kill 掉,又不能用 killall 直接杀掉某一进程名称包含的所有运行中进程(我们可能只需要杀掉其中的某一类或运行指定参数命令的进程),这个时候我们 ...

  2. 使用trace文件分析ANR

    2017年02月07日 12:32:45 不死鸟JGC 阅读数 13886更多 分类专栏: Android   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链 ...

  3. 9个PNG透明图片免费下载网站推荐

    9个PNG透明图片免费下载网站推荐 酷站推荐 2017.08.06 13:47 png格式的图片因为去掉了的背景,方便使用在任何颜色的背景,所以对于从事设计师的朋友来说,经常会用到png透明图片.相信 ...

  4. IntelliJ IDEA 安装使用 FindBugs 代码分析详述

    1 下载 2 重启idea 选中文件,右键 附:一些常见的错误信息 Bad practice 代码中的一些坏习惯 Class names should start with an upper case ...

  5. 使用java计算数组方差和标准差

    使用java计算数组方差和标准差 觉得有用的话,欢迎一起讨论相互学习~Follow Me 首先给出方差和标准差的计算公式 代码 public class Cal_sta { double Sum(do ...

  6. matlab学习笔记13_3创建函数句柄

    一起来学matlab-matlab学习笔记13函数 13_3 创建函数句柄 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://ww2.mathworks.cn/help ...

  7. shell基础知识之数组

    数组允许脚本利用索引将数据集合保存为独立的条目.Bash支持普通数组和关联数组,前者 使用整数作为数组索引,后者使用字符串作为数组索引.当数据以数字顺序组织的时候,应该使 用普通数组,例如一组连续的迭 ...

  8. Java 面向接口的编程

    面向接口的编程 什么是面向接口编程呢?我个人的定义是:在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中),而是通过定义一组接口,仅向上层暴露其接口功能 ...

  9. python中实现延时回调普通函数示例代码

    python中实现延时回调普通函数示例代码 这篇文章主要给大家介绍了关于python中实现延时回调普通函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的 ...

  10. simplexml_load_string 转换xml为数组

    php simplexml_load_string 函数可以很简单转换 xml 字符串为 SimpleXMLElement 对象 但是,对象的值不好取,例如: result => SimpleX ...