目标:分布式集群中,选举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. 【技术博客】 关于laravel5.1中文件上传测试的若干尝试

    关于laravel5.1中文件上传测试的若干尝试 作者:ZGJ 版本:v1.0 PM注:本人这两天也正在尝试解决这一问题,如有进展将及时更新这一博客 在我们的软工第二阶段中,我开始着手进行后端控制器的 ...

  2. Cesium中的几种坐标和相互转换【转】

    几个重要的坐标对象:1.世界坐标 Cartesian3:笛卡尔空间直角坐标系 new Cesium.Cartesian3(x, y, z) 可以看作,以椭球中心为原点的空间直角坐标系中的一个点的坐标. ...

  3. SVN更新冲突文件冲突符号的意思

    带黄色感叹号的文件为冲突文件,内容会发生变化并且会存在一些特殊符号: <<<<<<< .mine#Mon Feb 18 20:10:37 CST 2013== ...

  4. 批量实现ssh免密登录

    本节索引 场景分析 ssh免密登录 pssh工具批量管理 SHELL自动化脚本 本篇总结 场景分析 作为一个运维工程师,不是每个人工作的环境都想阿里.腾讯那样,动不动就上亿的PV量,上万台服务器.我们 ...

  5. TrueType字体

    TrueType字形描述技术和TTF文件 TrueType字体技术的研究分析与应用 看起来上面两篇都是翻译的文档. 看微软的原文介绍: TrueType fundamentals 其他文章: 获取Tr ...

  6. IDEA强制清除Maven缓存

    目录 重新导入依赖的常见方式 存在的问题 彻底清除IDEA缓存的方式 重新导入依赖的常见方式 下面图中的刷新按钮,在我的机器上,并不能每次都正确导入pom.xml中写的依赖项,而是导入之前pom.xm ...

  7. OpenShift 4.2 Service Mesh

    1.和社区版Istio的区别 OpenShift 4.2的Service Mesh和upstream的Istio项目的增强,除了产品化之外,借用官方文档,区别在于: Red Hat OpenShift ...

  8. c# HTML5 Blob对象实现媒体播放功能

    后台代码: public ActionResult Video()         {             string filePath = @"D:\download\test.mp ...

  9. 递归下降和LL(1)语法分析

    什么是自顶向下分析法 在语法分析过程中一般有两种语法分析方法,自顶向下和自底向上,递归下降分析和LL(1)都属于是自顶向下的语法分析 自顶向下分析法的过程就像从第一个非终结符作为根节点开始根据产生式进 ...

  10. python中判断对象类型的函数——isinstance

    isinstance是Python中的一个内建函数.是用来判断一个对象的变量类型. isinstance(object, class-or-type-or-tuple) 如果参数object是clas ...