图解Raft领导者选举,这里通过五张图来解答Raft选举的全过程;

  Raft集群各个节点之间是通过RPC通讯传递消息的,每个节点都包含一个RPC服务端与客户端,初始时启动RPC服务端、状态设置为Follower、启动选举定时器,每个Raft节点的选举定时器超时时间都在100-500毫秒之间且并不一致;

  Raft节点启动后在一个选举定时器周期内未收到心跳和投票请求,则状态转为候选者candidate状态、term自增、向Raft集群中所有节点发送投票请求并且重置选举定时器;

  Raft节点收到投票后对比当前term、votedFor、日志项信息判断觉得是否接受该投票请求,在此过程中如节点收到其他领导者的附加日志信息PRC请求如该term比自己大则接受改请求转为Follower状态,否则拒绝并保持候选人状态;

  当前由于每次选举超时发起投票请求都会增加term,而term又会导致Raft节点收到影响,所以出现网络分区后term增加到足够大后重新加入Raft集群时会导致集群可用性受到影响;

  为了解决网络分区可能造成的影响这时在正式发起投票请求前引入了一个用于确认是否能成为Leader的PrevoteRPc请求;

参考资料:
http://ramcloud.stanford.edu/raft.pdf

文章首发地址:Solinx
http://www.solinx.co/archives/1209

图解Raft之领导者选举的更多相关文章

  1. MIT 6.824 Lab2A Raft之领导者选举

    实验准备 实验代码:git://g.csail.mit.edu/6.824-golabs-2021/src/raft 如何测试:go test -run 2A -race 相关论文:Raft Exte ...

  2. 浅谈 Raft 分布式一致性协议|图解 Raft

    前言 本篇文章将模拟一个KV数据读写服务,从提供单一节点读写服务,到结合分布式一致性协议(Raft)后,逐步扩展为一个分布式的,满足一致性读写需求的读写服务的过程. 其中将配合引入Raft协议的种种概 ...

  3. 图解Raft之日志复制

    日志复制可以说是Raft集群的核心之一,保证了Raft数据的一致性,下面通过几张图片介绍Raft集群中日志复制的逻辑与流程: 在一个Raft集群中只有Leader节点能够接受客户端的请求,由Leade ...

  4. 解读Raft(二 选举和日志复制)

    Leader election Raft采用心跳机制来触发Leader选举.Leader周期性的发送心跳(如果有正常的RPC的请求情况下可以不发心跳)包保持自己Leader的角色(避免集群中其他节点认 ...

  5. Fabric2.2中的Raft共识模块源码分析

    引言 Hyperledger Fabric是当前比较流行的一种联盟链系统,它隶属于Linux基金会在2015年创建的超级账本项目且是这个项目最重要的一个子项目.目前,与Hyperledger的另外几个 ...

  6. 服务发现之 Etcd VS Consul

    抄自这里 *********************************************************************************************** ...

  7. Redis 哨兵 Sentinel

    Redis Sentinel:redis集群应用,分布式系统.   多个Sentinal进程之间通过 gossip 协议来接收主服务器是否下线的信息,通过 Raft 一致性协议来决定故障转移及转移服务 ...

  8. Raft协议实战之Redis Sentinel的选举Leader源码解析

    这可能是我看过的写的最详细的关于redis 选举的文章了, 原文链接 Raft协议是用来解决分布式系统一致性问题的协议,在很长一段时间,Paxos被认为是解决分布式系统一致性的代名词.但是Paxos难 ...

  9. Raft 实现日志复制同步

    Raft 实现日志复制同步 本篇文章以 John Ousterhout(斯坦福大学教授) 和 Diego Ongaro(斯坦福大学获得博士学位,Raft算法发明人) 在 Youtube 上的讲解视频及 ...

随机推荐

  1. 【软工作业&思考】关于软工的一些概念性理解暨第一次阅读作业

    概述 项目 内容 本次作业所属课程 2019BUAA软件工程 周二班 本次作业要求 第1次个人作业当然,比这个更重要百倍的还是实实在在的思考,这也是标题如此命名的原因 我在本课程的目标 在原有实践经验 ...

  2. Scanner输入数字时个位十位百位千位单独取出。

    Scanner inn = new Scanner(System.in); int i = inn.nextInt(); System.out.println("个位是"+i%10 ...

  3. webpack : 无法将“webpack”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

    全局安装webpack npm install -g webpack 把node_global加入到环境变量

  4. 解决关于win10下eclipse代码格式化不生效问题

    今日,在写代码的时候遇到在eclipse中ctrl+shift+f格式化代码不生效的问题,原本以为是和热键冲突,所以关闭了搜狗输入法的简体和繁体的切换方式,但是发现,还是没有生效,所以,想到修改ecl ...

  5. CSS div内文字显示两行,超出部分省略号显示

    1. 概述 1.1 说明 在项目过程中,有时候需要控制div内文字最多显示两行,超出的使用省略号进行处理.使用识别码/前缀-webkit进行处理可直接得到相应效果. 1.1 -webkit WebKi ...

  6. SpringBoot@GeneratedValue 四种参数

    按照大家学习SpringBoot的经验来看, SpringBoot的@GeneratedValue 是不需要加参数的,但是如果数据库控制主键自增(auto_increment), 不加参数就会报错.( ...

  7. MUI上传图片之选择相册和相机上传

    1.因为项目中有三处地方需要上传,所以html中存在三处地方.身份证正反面为上传一张,发票限制上传9张. <div class="action1"> <!--展示 ...

  8. 插入MongoDB文档:mongo控制台查看插入到MongoDB文档中的内容

    const MongoClient = require('mongodb').MongoClient; const assert = require('assert'); const url = 'm ...

  9. git增加子模块

    要拉取GIT代码时,有时候需要拉取多个GIT模块,一起配合使用: 1.下载主模块: git clone -b master http://username:passwd@git.wondershare ...

  10. PHP获取服务器IP和客户端IP

    <?php echo '前端机IP:'.$_SERVER['REMOTE_ADDR']; echo '<br />'; echo '后端机IP:'.$_SERVER['SERVER_ ...