Raft 共识算法
转载请注明出处: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
- 接收者实现
- term < currentTerm 返回false
- prevLogTerm匹配但是找不到匹配prevLogIndex的记录返回false
- 如果已经存在的记录与其中一个新记录(index相同但是term不同)冲突,删除存在的这条记录以及后面的所有记录
- 添加不存在的新的记录到后面
- 如果leaderCommit > commitIndex,设置commitIndex = min(leaderCommit, 最新的记录索引)
RequestVote RPC(被candidate调用来收集选票)
- 参数
- term:candidate的任期
- candidateId:请求投票的candidate
- lastLogIndex:candidate最新的记录索引
- lastLogTerm:candidate最新的记录任期
- 返回
- term:currentTerm,给candidate更新自己的任期
- voteGranted:true表示candidate收到投票
- 接收者实现
- term < currentTerm 返回 false
- 如果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
- 如果举定时器超时:开始新一轮选举
- 在转变成candidate后就立即开始选举过程
- 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 共识算法的更多相关文章
- raft共识算法
raft共识算法 分布式一致性问题 如果说,服务器只有一个节点,那么,要保证一致性,没有任何问题,因为所有读写都在一个节点上发生.那如果server端有2个.3个甚至更多节点,要怎么达成一致性呢?下面 ...
- Raft共识算法详解
Raft共识算法 一.背景 拜占庭将军问题是分布式领域最复杂.最严格的容错模型.但在日常工作中使用的分布式系统面对的问题不会那么复杂,更多的是计算机故障挂掉了,或者网络通信问题而没法传递信息,这种情况 ...
- 【翻译】Raft 共识算法:集群成员变更
转载请注明出处:https://www.cnblogs.com/morningli/p/16770129.html 之前都在集群配置是固定的(参与共识算法的server集合)假设下讨论raft.在实践 ...
- Hyperledger Fabric无排序组织以Raft共识算法启动多个Orderer服务、多组织共同运行维护Orderer服务
前言 在Hyperledger Fabric无系统通道启动及通道的创建和删除中,我们已经完成了以无系统通道的方式启动 Hyperledger Fabric 网络,并将链码安装到指定通道.但目前为止,实 ...
- docker swarm英文文档学习-12-在集群模式中的Raft共识
Raft consensus in swarm mode 在集群模式中的Raft共识 当Docker引擎在集群模式下运行时,manager节点实现Raft 共识算法来管理全局集群状态.Docker s ...
- Fabric2.2中的Raft共识模块源码分析
引言 Hyperledger Fabric是当前比较流行的一种联盟链系统,它隶属于Linux基金会在2015年创建的超级账本项目且是这个项目最重要的一个子项目.目前,与Hyperledger的另外几个 ...
- [区块链] 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)
近几天对区块链中几种常见的共识机制(PBFT,Raft,PoW,PoS,DPoS,Ripple)进行了总结.尽量使用简单易懂语言,篇幅较大,想了解的可以只读每个算法介绍中前边的原理.本篇文章主要参考& ...
- 共识算法:PBFT、RAFT
转自:https://www.cnblogs.com/davidwang456/articles/9001331.html 区块链技术中,共识算法是其中核心的一个组成部分.首先我们来思考一个问题:什么 ...
- 区块链共识算法 PBFT(拜占庭容错)、PAXOS、RAFT简述
共识算法 区块链中最重要的便是共识算法,比特币使用的是POS(Proof of Work,工作量证明),以太币使用的是POS(Proof of Stake,股权证明)使得算理便的不怎么重要了,而今PO ...
随机推荐
- 参数化设计(多次调用同一子模块,critical warning,引脚constraint sources)
1.设计定义:4个led灯以不同的频率各自闪烁. 2.设计输入:时钟信号,复位信号,led多位输出. 思路:没有要求流水的效果,所以不需要叠加counter达到某一特定值来位移.只需要让每个灯的闪烁周 ...
- 创建私有CA,我就用openSSL
目录 简介 搭建root CA 生成root CA 使用CRL 使用OSCP 总结 简介 一般情况下我们使用的证书都是由第三方权威机构来颁发的,如果我们有一个新的https网站,我们需要申请一个世界范 ...
- 谷歌邮箱使用python自动化发送邮件出现smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted.的解决
今天学习使用邮箱自动化办公的过程中run时一直出现如下错误;smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password n ...
- Jmeter-记一次自动化造数引发的BeanShell写入excel实例
一.前言 最近工作和生活说忙也忙,说不忙也不忙,但就是已经感觉很长时间没有get新的技术技能了,就是一丢丢的那种也没有,哈哈哈,今天就来讲一下最近get到的小技能吧. 工作中,由于某个需求需要几百条数 ...
- Dos系统操作小技巧汇总(不定时更新)
1.笔者发现有时候自己的程序取名如果太长的话,每次使用gcc编译的时候自己手打的话会非常痛苦,在dos下有一个非常方便的方法,那就是打出相关程序的前几个字母,然后就可以通过tab键来切换相关程序名,非 ...
- vscode problem
1.Inconsistent use of tabs and spaces in indentation 原因:tab和空格键不能同时使用 vs code按住ctrl + p,输入以下内容 >c ...
- Nginx 平滑升级、Nginx的一些基础配置
# Nginx 平滑升级 # 方案一:使用Nginx服务信号进行升级 # 1.将就版本的sbin目录下可执行nginx进行备份(mv nginx nginxold) # 2.将新版本 configur ...
- Latex查表
- JS的简介
JS式JavaScript的简称,它是一门弱语言,它可以实现让网页动起来 JS的构成 核心(ECMAScript) 文档对象模型(DOM)-- Document Object Module 浏览器对 ...
- StarRocks 运维工具 StarGo
注:本文主要内容均来源 StarRocks 官网 https://docs.starrocks.com/zh-cn/main/administration/stargo StarGo 是一个用于管理多 ...