目标:分布式集群中,选举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. zabbix 自动发现 监控 硬盘读写 disk io

    直接 上配置: 1.配置文件 cat userparameter_harddisk.conf #discovery hard diskUserParameter=custom.vfs.discover ...

  2. Vue/小程序/小程序云+Node+Mongo开发微信授权、支付和分享

    大家好,我是河畔一角,今天给大家介绍我的第三门实战课程:基于微信开发的H5.小程序和小程序云的授权.支付和分享专项课程. 一.这一次为什么会选择微信支付和分享的课题呢? 金庸的小说中曾提到:有人的地方 ...

  3. Java finally未被执行的情况

    一种是先执行了用于终止程序的System.exit()方法,或进程被关闭 还有一种情况是,当前线程一直在执行,在一些业务逻辑里面跳不出来,看上去就像finally一直未被执行 线程被终止的时候也会执行 ...

  4. Eclipse离线安装svn插件

    Eclipse离线安装svn插件 1,下载插件 百度网盘:链接: https://pan.baidu.com/s/1lP7J2_7bdj1Tp4YdnrdllQ 提取码: v3nq 2,在eclips ...

  5. 015 vue的项目

    一:搭建项目 1.框架 在原有的基础上 src: 2.index.html <!DOCTYPE html> <html lang="en"> <hea ...

  6. HTML+CSS实现鼠标点上去动画效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Python3基础 import...as 给导入的模块起别名

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  8. Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题

    转: Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题 在实际PL/SQL编程中,我们要对动态取出来的一组数据,进行For循环处理,其基本程序逻辑为: ...

  9. xpath和contains模糊匹配

    xpath可以以标签定位,也可以@任意属性: 如:以input标签定位:driver.find_element_by_xpath("//input[@id='kw']") 如:@t ...

  10. IDEA @override处标红

    报错问题如下 这个是没有导入父类,无法重写父类的方法 创建项目的时候没有使用jdk1.6以上的版本.将版本更正就好了