目标:分布式集群中,选举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. Java设计模式之builder模式

    Java设计模式之builder模式 今天学mybatis的时候,知道了SQLSessionFactory使用的是builder模式来生成的.再次整理一下什么是builder模式以及应用场景. 1. ...

  2. android gradle使用阿里源

    使用阿里源 新建一个init.gradle 文件到$USER_HOME/.gradle/目录下,这们就省的翻墙了. init.gradle 文件内容如下: allprojects { reposito ...

  3. vue项目 既能通过ip访问项目,又可以本地localhost访问

    1.场景问题: 有时候开发过程中,vue项目需要其他同事能访问你本地进行调试,而不是需要重新拉取代码来启动很麻烦 2.解决思路: 一. package.json"dev": &qu ...

  4. 时间管理GTD

    时间管理—重要紧急四象限法则https://www.jianshu.com/p/30b2ab0dc20e<番茄工作法图解>—— 让你的工作高效起来https://www.jianshu.c ...

  5. vs2015 如何更改背景主题颜色

    打开vs2015 步骤:工具--> 选项 -->环境-->常规-->主题设置

  6. C++ std::map 屏蔽排序

    转载:https://blog.csdn.net/sendinn/article/details/96286849 最近在项目中用标准库中的关联性容器map,但知道map默认升序的,但在一个需求时又不 ...

  7. HandlerMethodArgumentResolver的抽象實現AbstractNamedValueMethodArgumentResolver下的子类

    Annotation-based argument resolution 部分2 org.springframework.web.servlet.mvc.method.annotation.Reque ...

  8. Hive的两种操作模式

    Hive的客户端操作 Hive的客户端操作 通过JDBC操作Hive 通过Thrift操作Hive 通过JDBC操作Hive 首先 Hive 启动远程服务 hive --service hiveser ...

  9. (原创)C++ 同步队列

    (原创)C++ 同步队列 同步队列作为一个线程安全的数据共享区,经常用于线程之间数据读取,比如半同步半异步线程池的同步队列. 其实做起来比较简单,要用到list.锁和条件变量,条件变量的作用是在队列满 ...

  10. 研发团队是该制定OKR还是KPI?

    绩效管理和OKR的目标管理,是前行的两条腿,缺谁都会寸步难行.正确的做法是把企业的使命和任务,转化为经营目标,然后再用KPI.OKR等绩效管理工具,分解.执行.考核.. KPI是一套绩效管理的方法.全 ...