图解Raft之日志复制
日志复制可以说是Raft集群的核心之一,保证了Raft数据的一致性,下面通过几张图片介绍Raft集群中日志复制的逻辑与流程;

在一个Raft集群中只有Leader节点能够接受客户端的请求,由Leader向其他Follower转发所有请求日志,并且有那么两条规则:Leader不删除任何日志、Follower只接收Leader所发送的日志信息;

此图介绍了Raft集群中日志的组成结构,日志由序号与条目组成,每个条目又由任期与指令组成,committed范围内为已提交的日志是指过半节点已经接收并存储的日志;

上图从整个上介绍了Raft集群的日志复制流程,Leader接收到指令后写入到本地日志,在随后的心跳中(AppendEntries)往其他追随者发送该条目,等待收到过半追随者响应后将该条目标志位已提交状态,并发往状态机执行,完成后返回结果给客户端;在后续心跳包(AppendEntries)中通知所有追随者哪些条目为已提交状态,以便追随者更新在自己状态机中执行该指令; 只有Leader能够接受客户端的指令,追随者只能够接收领导者的AppendEntries请求;

在Raft集群中可通过条目索引号、任期号唯一确定一个条目,该条目前序所有条目也是一致的,如上图中索引号为5的条目为已提交状态的条目,则从索引号1到5的所有条目均为已提交的状态;

上图中Leader发送AppendEntries请求时带有其前序索引位置4、前序任期号2,发往Follower1、Follower2;
Follower1由于前序索引与前序任期能匹配本地条目所以将会接受该请求;
Follower2由于前序索引与前序任期未能够匹配所以拒绝该请求;

Raft处理日志不一致的情况是通过强制追随者复制领导者日志来调整日志一致性的,所以当追随者与领导者出现日志不一致时,追随者日志将会被领导者日志覆盖;
要使领导者与追随者保持一致性的状态,需要两者找到一致性的位置,删除追随者该位置之后所有日志条目,发送领导者日志给追随者;
领导者通过在每一个追随者维护了一个 nextIndex,表示下一个需要发送给跟随者的日志条目索引地址,领导者刚获得选举时,初始化所有 nextIndex 值为自己的最后一条日志的index加1;当追随者的日志和领导者不一致,那在下一次的AppendEntries时的一致性检查会失败,被追随者拒绝后,领导者就会减小 nextIndex 值进行重试,nextIndex 会在某位置使领导者和追随者日志达成一致。
当日志达成一致时,追随者会接受该AppendEntries请求,这时追随者冲突的日志条目将全部被领导者的日志所覆盖。一旦AppendEntries成功,那么跟随者的日志就会和领导人保持一致,并且在接下来的任期里一直继续保持。
参考资料:
http://ramcloud.stanford.edu/raft.pdf
文章首发地址:Solinx
http://www.solinx.co/archives/1221
图解Raft之日志复制的更多相关文章
- Raft 实现日志复制同步
Raft 实现日志复制同步 本篇文章以 John Ousterhout(斯坦福大学教授) 和 Diego Ongaro(斯坦福大学获得博士学位,Raft算法发明人) 在 Youtube 上的讲解视频及 ...
- MIT 6.824 Llab2B Raft之日志复制
书接上文Raft Part A | MIT 6.824 Lab2A Leader Election. 实验准备 实验代码:git://g.csail.mit.edu/6.824-golabs-2021 ...
- 解读Raft(二 选举和日志复制)
Leader election Raft采用心跳机制来触发Leader选举.Leader周期性的发送心跳(如果有正常的RPC的请求情况下可以不发心跳)包保持自己Leader的角色(避免集群中其他节点认 ...
- 基于 raft 协议的 RocketMQ DLedger 多副本日志复制设计原理
目录 1.RocketMQ DLedger 多副本日志复制流程图 1.1 RocketMQ DLedger 日志转发(append) 请求流程图 1.2 RocketMQ DLedger 日志仲裁流程 ...
- Etcd中Raft日志复制的实现
Raft state of log commitIndex : A log entry is committed once the leader that created the entry has ...
- Raft算法系列教程3:日志复制
1.日志复制的过程 Leader选出后,就开始接收客户端的请求.Leader把请求作为日志条目(Log entries)加入到它的日志中,然后并行的向其他服务器发起 AppendEntries RPC ...
- Paxos 实现日志复制同步
Paxos 实现日志复制同步 本篇文章以 John Ousterhout(斯坦福大学教授) 和 Diego Ongaro(斯坦福大学获得博士学位,Raft算法发明人) 在 Youtube 上的讲解视频 ...
- Paxos 实现日志复制同步(Multi-Paxos)
Paxos 实现日志复制同步 这篇文章以一种易于理解的方式来解释 Multi-Paxos 的机制. Multi-Paxos 的是为了创建日志复制 一种实现方式是用一组基础 Paxos 实例,每条记录都 ...
- 图解Raft之领导者选举
图解Raft领导者选举,这里通过五张图来解答Raft选举的全过程: Raft集群各个节点之间是通过RPC通讯传递消息的,每个节点都包含一个RPC服务端与客户端,初始时启动RPC服务端.状态设置为Fol ...
随机推荐
- mysql定时器设置开机默认自启动
1).查询mysql安装位置:show variables like "%char%"; 2).查询定时器是否开启: -查询定时器状态:show VARIABLES LIKE '% ...
- Python3:输出当前目录所有文件的第二种方式-walk()函数
上一篇,我们讲了用递归的方式输入所有文件路径,其实os还提供了一个好用的方法-walk() 简单看一下: 中文大意就是: 返回的是一个三元tupple(dirpath, dirnames, filen ...
- java学习笔记11-static关键字
如果在类中使用static关键字创建方法,这种方法称为类方法,可以在这个类中直接引用.而不是用static创建的方法.这种方法称为对象方法(实例方法),需要创建对象后才能使用. package les ...
- GIt -- fatal: refusing to merge unrelated histories 问题处理
今晚碰到这个问题-- fatal: refusing to merge unrelated histories 想了一下,为什么就这样了? 因为我是先本地创建了仓库,并添加了文件,然后再到github ...
- CleanWebpackPlugin 低版本失效
解决这个问题只需要 升级至2.0.1版本就行 不需要传参
- 初识C语言(三)
C语言中的运算符 C语言中的运算就是对数据进行操作.处理的过程.运算符就是指定该运算的处理方式. C语言中的运算符: 算术运算符 赋值运算符 关系运算符 逻辑运算符 三目运算符 算数运算符 C语言中的 ...
- 【转载】如何直观的理解 O(logn) 时间复杂度的神奇之处
转自 https://blog.csdn.net/u012814856/article/details/83010082 一.引言最近在极客时间上订阅了<数据结构与算法>的课程,其中王争老 ...
- js属性对象的propertyIsEnumerable方法
定义 每个对象都有一个propertyIsEnumerable()方法.此方法返回一个布尔值,表明指定的属性是否是可枚举. This method can determine whether the ...
- Cookie和Session的原理和异同
Cookie和Session的原理和异同 原理: cookie: 1.创建Cookie 当用户第一次浏览某个使用Cookie的网站时,该网站的服务器就进行如下工作: ①该用户生成一个唯一的识别码(Co ...
- 从分布式一致性到共识机制(二)Raft算法
春秋五霸说开 春秋五霸,是指东周春秋时期相继称霸主的五个诸侯,“霸”,意为霸主,即是诸侯之领袖.典型的比如齐桓公,晋文公,春秋时期诸侯国的称霸,与今天要讨论的Raft算法很像. 一.更加直观的Raft ...