转载请注明出处:https://www.cnblogs.com/morningli/p/16745294.html

raft是一种管理复制日志的算法,raft可以分解成三个相对独立的子问题:

  • 选主(Leader election):原有的leader故障后需要选举一个新的leader。
  • 复制(Log replication): leader必须接受client发送的记录(log entries)然后复制到集群中其他节点,并强制要求其他节点的日志和自己保持一致。
  • 安全(Safety):raft安全的关键是状态机安全:如果存在server将一个特定的记录应用到状态机中,不存在另外一个server在相同的日志索引上应用的是不同的命令。

算法组成

状态

  • 所有server上的持久性状态(在回应PRC之前更新到稳定存储(stable storage))

    • currentTerm:已知的最新的任期(term)(初始化为0,单调递增)
    • votedFor:当前任期内接受投票的candidateId(如果没有为null)
    • log[]:记录(log entries);每个记录包含应用到状态机的命令以及leader接收该记录时的任期
  • 所有server上的易变的状态
    • commitIndex:已知已经提交的最高的记录索引(初始化为0,单调递增)
    • lastApplied:已经应用到状态机的最高的记录索引(初始化为0,单调递增)
  • leader上的易变的状态(选举后重新初始化)
    • nextIndex[]:对于每个server,需要发送到这个server的下一条记录的索引(初始化为leader的最新的记录索引+1)
    • matchIndex[]:对于每个server,已知已经复制到这个server的最高的记录索引(初始化为0,单调递增)

AppendEntries RPC(leader调用来复制日志,也会被用作心跳)

  • 参数

    • term:leader的任期
    • leaderId:follower用来重定向客户端
    • prevLogIndex:新记录前一个记录的索引
    • prevLogTerm:prevLogIndex记录的任期
    • entries[]:需要存储的记录(心跳传空,为了提高效率可能会发送多个)
    • leaderCommit:leader的commitIndex
  • 返回
    • term:currentTerm,给leader更新自己的任期
    • success:如果follower包含匹配prevLogIndex和prevLogTerm的记录返回true
  • 接收者实现
    1. term < currentTerm 返回false
    2. prevLogTerm匹配但是找不到匹配prevLogIndex的记录返回false
    3. 如果已经存在的记录与其中一个新记录(index相同但是term不同)冲突,删除存在的这条记录以及后面的所有记录
    4. 添加不存在的新的记录到后面
    5. 如果leaderCommit > commitIndex,设置commitIndex = min(leaderCommit, 最新的记录索引)

RequestVote RPC(被candidate调用来收集选票)

  • 参数

    • term:candidate的任期
    • candidateId:请求投票的candidate
    • lastLogIndex:candidate最新的记录索引
    • lastLogTerm:candidate最新的记录任期
  • 返回
    • term:currentTerm,给candidate更新自己的任期
    • voteGranted:true表示candidate收到投票
  • 接收者实现
    1. term < currentTerm 返回 false
    2. 如果votedFor是null或者candidateId,并且candidate的日志至少和自己一样新,那么就投票给他

server 需遵守的规则

  • 所有server

    • 如果commitIndex > lastApplied:lastApplied自增,将log[lastApplied]应用到状态机中
    • 如果RPC请求或者返回包含term T > currentTerm: 设置currentTerm = T,并切换为follower
  • follower
    • 响应candidate和leader的RPC
    • 如果选举定时器超时没有收到当前leader的AppendEntries RPC或者没有向candidate投票:转换为candidate
  • candidate
    • 在转变成candidate后就立即开始选举过程

      • 自增currentTerm
      • 投票给自己
      • 重置选举定时器
      • 发送RequestVote RPC给所有其他server
    • 如果接收到大多数server的投票:成为leader
    • 如果接收到新leader发出的AppendEntries RPC:成为follower
    • 如果举定时器超时:开始新一轮选举
  • leader
    • 一旦成为领导人:发送第一个AppendEntries RPC(心跳)给每一个server;空闲时间重复发送防止选举定时器超时
    • 如果接收到客户端的命令:添加记录到本地日志后面,在完全应用到状态机后再响应客户端
    • 如果最新的记录索引 >= 某个follower的nextIndex:发送AppendEntries RPC,包含了从nextIndex开始的记录
      • 如果成功:更新follower的nextIndex和matchIndex
      • 如果因为日志不一致导致的失败:自减nextIndex并重试
    • 如果存在N > commitIndex,大多数的matchIndex[i] ≥ N并且log[N].term == currentTerm:设置commitIndex = N

算法不变量

  • Election Safety:每个任期足以多只有一个leader被选举出来
  • Leader Append-Only:leader不会覆盖或者删除自己的日志的记录;他只会在后面添加新的记录
  • Log Matching:如果两个日志包含一个相同索引和任期的记录,那么我们认为这个索引的记录以及之前的记录的内容完全一致
  • Leader Completeness:如果一个记录在一个任期内被提交,那么更高任期的leader的日志都会包含这个记录
  • State Machine Safety:如果一个server应用了一个给定索引的记录到状态机,不存在其他server在相同的索引位置应用不同的记录

参考:

https://github.com/maemual/raft-zh_cn

Raft 共识算法的更多相关文章

  1. raft共识算法

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

  2. Raft共识算法详解

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

  3. 【翻译】Raft 共识算法:集群成员变更

    转载请注明出处:https://www.cnblogs.com/morningli/p/16770129.html 之前都在集群配置是固定的(参与共识算法的server集合)假设下讨论raft.在实践 ...

  4. Hyperledger Fabric无排序组织以Raft共识算法启动多个Orderer服务、多组织共同运行维护Orderer服务

    前言 在Hyperledger Fabric无系统通道启动及通道的创建和删除中,我们已经完成了以无系统通道的方式启动 Hyperledger Fabric 网络,并将链码安装到指定通道.但目前为止,实 ...

  5. docker swarm英文文档学习-12-在集群模式中的Raft共识

    Raft consensus in swarm mode 在集群模式中的Raft共识 当Docker引擎在集群模式下运行时,manager节点实现Raft 共识算法来管理全局集群状态.Docker s ...

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

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

  7. [区块链] 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)

    近几天对区块链中几种常见的共识机制(PBFT,Raft,PoW,PoS,DPoS,Ripple)进行了总结.尽量使用简单易懂语言,篇幅较大,想了解的可以只读每个算法介绍中前边的原理.本篇文章主要参考& ...

  8. 共识算法:PBFT、RAFT

    转自:https://www.cnblogs.com/davidwang456/articles/9001331.html 区块链技术中,共识算法是其中核心的一个组成部分.首先我们来思考一个问题:什么 ...

  9. 区块链共识算法 PBFT(拜占庭容错)、PAXOS、RAFT简述

    共识算法 区块链中最重要的便是共识算法,比特币使用的是POS(Proof of Work,工作量证明),以太币使用的是POS(Proof of Stake,股权证明)使得算理便的不怎么重要了,而今PO ...

随机推荐

  1. 算法竞赛进阶指南 0x50 总论

    目录 AcWing895. 最长上升子序列 方法一 方法二 当询问最长子序列是哪些的时候 896. 最长上升子序列 II 思路 O(NlogN)做法:贪心+二分 代码 AcWing\897. 最长公共 ...

  2. 非root用户安装科学计算包blas、lapack和FFTW

    一.安装FFTW 1.下载安装包 下载地址:http://www.fftw.org/download.html  2.编译安装 tar -zxvf fftw-3.3.10.tar.gz cd fftw ...

  3. Axure RP 8 实现 圆角文本框 圆角带筛选的下拉列表框 可自动显示滚动条

    刚开始用Axure 会发现 Axure 元件库并不是很齐全,很多元件需要自己想办法解决 或者去网上去找.其实个人建议网上有现成的元件可以就下载就不必花时间去折腾.除非你也想练练手,原型这种东西除非高保 ...

  4. uniapp中用canvas实现小球碰撞的小动画

    uniapp 我就不想喷了,踩了很多坑,把代码贡献出来让大家少踩些坑. 实现的功能: 生成n个球在canvas中运动,相互碰撞后会反弹,反弹后的速度计算我研究过了,可以参考代码直接用 防止球出边框 防 ...

  5. Percona XtraBackup 8.0.26使用说明

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 Percona XtraBackup特性说明 Percona Xtrabacku ...

  6. HCIA-Datacom 3.2 实验二:生成树基础实验

    实验介绍 以太网交换网络中为了进行链路备份,提高网络可靠性,通常会使用冗余链路.但是使用冗余链路会在交换网络上产生环路,引发广播风暴以及MAC地址表不稳定等故障现象,从而导致用户通信质量较差,甚至通信 ...

  7. Excel 文本函数(二):CONCATENATE 和 CONCAT

    在 Excel 2016.Excel Mobile 和 Excel 网页版中,CONCATENATE 函数已替换为 CONCAT 函数. CONCATENATE 函数只能拼接单个单元格或文本字符,不能 ...

  8. 【java】学习路径45-多线程-线程生命周期

    线程分为五大状态:新建.就绪.运行.阻塞.死亡. New,Runnable,Running,Blocked,Terminated. 新建状态(New: 创建好一个系统对象,在调用start()之前,线 ...

  9. 通过宏封装实现std::format编译期检查参数数量是否一致

    背景 std::format在传参数量少于格式串所需参数数量时,会抛出异常.而在大部分的应用场景下,参数数量不一致提供编译报错更加合适,可以促进我们更早发现问题并进行改正. 最终效果 // 测试输出接 ...

  10. 二 代理模式【Proxy Pattern】 来自CBF4LIFE 的设计模式

    什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理的人能干活呀. ...