Raft协议

Raft协议基于日志实现了一致性

实现备份的是机制:复制状态机Replicated State Machine,如果两个相同的、确定性的状态机从同一状态开始,以相同顺序输入相同的日志,则两个状态机最终也会保持一致

Raft了实现Consensus Module

Consensus Module作为一致性模块对外服务,负责接收客户端的消息,响应请求,并追加到本地日志,一致性模块保证每个机器上的log的一致性

请求到来时,带上(term,commitindex)和append log 去要求Follower追加消息,Follower会先判断(term,index)是否和当前最大的消息相同,如果相同就会追加,否则会拒绝

一致性模块负责复制消息到其他服务器节点,本地日志commit成功后立即应用到状态机

CNew用于服务器增加或者减少节点的情况

Leader:处理与客户端交互,处理消息

Follower:选民,转发请求到leader

Candidate:候选人,可以参选成为leader,不是所有Follower都能成为Candidate,只有数据较完整的才可以。如果Candidate发现自己的term落后了就会退回到Follower

RequestVote:选举期间的RPC消息

AppendEntries:leader选出后向Follow复制日志的RPC消息,心跳也是AppendEntries,不过日志内容为空

raft协议原理

  • Election Safty:每个任期只有一个leader
  • Leader Append-Only:leader仅新增日志,不能重写或删除日志条目
  • Log Match:如果两个日志的term和index相同,则两个状态机的完全相同
  • Leader Completeness:如果一条日志被Commit过,那么大于该日期条目的term的所有节点,都应该有该条目
  • State Machine Safty:如果某个server将日志交由状态机处理了,那么所有server交由状态机执行的日志条目数量完全相同

Election Safty

  • 竞选leader时,Candidate获取过半的票数,就能成为leader

    如果出现大家都投票给自己或两台机器各获得一般的票数,则随机Sleep重新选举
  • 先到先得
  • Follower遵循规则:选举term比自己大 -> index 比自己大,否则不会选举该Candidate
  • 随机超时,更快选出leader
  • 如果给candidate投票了,需要持久化记录投给谁了;否则如果follower重启,可能导致前后投票不相同

Log Match

leader向follower复制日志时,会带上当前最新的(该日志前)term和index,follower接收到请求后,会先比对自身最新的日志的term和index,匹配时才会追加,否则拒绝,这时leader会往前找term 和index,尝试和follower匹配成功,然后从该位置开始复制日志到follower

Leader completeness

不能提交之前任务内的日志作为Commit 点

选主

如果一个Follower在一定时间没有收到Leader的心跳,则开始重新选主

Follower把自己的状态变更为Candidate,并递增本地term,并持久化,向其他机器拉票,并给自己投票,开始等待,直到

  • candidate赢得选主,获得多数派的选票
  • 其他机器成为leader,心跳发现term大于等于本机term,自动变为Follower
  • 超时未能选主成功
  • 确保包含所有commit日志的主机才能成为candidate

    选举时candidate至少要和多数派主机通信,当发现candidate比本机的term,logindex还小时,follower就会拒绝投票

如何判断commit与否

leader发现log已经被多数派的主机写盘了,就认为commited

CNew,集群拓扑变化

将Cnew发送出去,如果Follower发现自己已经不在拓扑结构中,则退出

  • 生成logEntry Cold U Cnew
  • 推送给Follower
  • 过半则Commit
  • 生成CNew Log Entry,推送到所有Follower
  • Follower更新Cnew配置,了解自己在集群中的位置,如果新配置中已无当前节点,则自动退出
  • Leader收到多数派确认后,回复客户端执行命令成功

No op Entry

leader在选举刚结束后,可能有一些Entry是已经提交的,有一些是还未提交的,因此需要提交一个No op Entry来确保和Follower达到一致了,同时,也为了防止客户端来了新请求后不能及时到达

疑问

到底是如果commit的,Raft是如果保证状态机一致性的

情况1:

client - > leader -> Log AppendEntries - > 多数派确认 ->已经commited -> 返回client:成功

由于已经到多数机器上,即使重新选主,也一定会带有最新的log

但是这种情况呢

情况2:

client - > leader -> Log AppendEntries - > 未获取多数派确认 ->不算作Commited -> 返回client:失败重试

返回给client失败了,此时若leader断开网络,可能出现部分确认的实例被选中为leader?岂不是实际成功了

Raft维护的以下属性是否可以解释此问题:

  1. 如果在不同的日志文件内有2个条目有相同的index和term, 它们保存着相同的命令;
  2. 如果在不同的日志文件内有2个条目有相同的index和term,那么之前的所有条目都是相同的;
  3. 只有被多数派follower确认了才会认为Commit了

依据上述特性,出现情况2时,不满足特性3,client会收到执行失败的响应,此时应该做的是不断重试,直到成功,也就是说raft协议允许情况3,也要求client如果想要强一致性,就得不断的重试

raft保证了已提交日志的一致性

follower发现自己已提交的term和logindex 比leader还大怎么办?

leader退化成follower

leader何时告诉follower log已提交了?

在下一个心跳告诉所有follower更新Commited项目

Raft约束日志是连续commit的,leader维护最大已经commit的日志id,并将这个信息附加到AppendEntries告知follower,follower了解到之后即可将本机已有的且已经commit的日志应用到本地的状态机。

参考文章

http://thinkinjava.cn/2019/01/12/2019/2019-01-12-lu-raft-kv/

https://raft.github.io/

https://blog.csdn.net/weixin_39843367/article/details/82498536

https://blog.csdn.net/baijiwei/article/details/78760308

https://www.jdon.com/artichect/raft.html

http://ifeve.com/解读raft(二-选举和日志复制)/

Raft协议备注的更多相关文章

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

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

  2. MIT-6.824 Raft协议

    摘要 raft是一种比paxos容易理解的一致性算法,实现起来比paxos简单许多.本文前部分描述算法的细节,后部分尝试探讨下该算法的原理. 算法描述 raft算法之所以简单的原因之一是它将问题分解成 ...

  3. Raft协议学习笔记

    目录 目录 1 1. 前言 1 2. 名词 1 3. 什么是分布式一致性? 3 4. Raft选举 3 4.1. 什么是Leader选举? 3 4.2. 选举的实现 4 4.3. Term和Lease ...

  4. [搜狐科技]由浅入深理解Raft协议

    由浅入深理解Raft协议 2017-10-16 12:12操作系统/设计 0 - Raft协议和Paxos的因缘 读过Raft论文<In Search of an Understandable ...

  5. Paxos、ZAB、RAFT协议

    这三个都是分布式一致性协议,ZAB基于Paxos修改后用于ZOOKEEPER协议,RAFT协议出现在ZAB协议之后,与ZAB差不多,也有很大区别. 1. Paxos 分布式节点分为3种角色, Prop ...

  6. Paxos算法与Zookeeper分析,zab (zk)raft协议(etcd) 8. 与Galera及MySQL Group replication的比较

    mit 分布式论文集 https://github.com/feixiao/Distributed-Systems wiki上描述的几种都明白了就出师了 raft 和 zab 是类似的,都是1.先选举 ...

  7. RocketMQ 多副本前置篇:初探raft协议

    目录 1.Leader选举 1.1 一轮投票中,只有一个节点发起投票的情况 1.2 一轮投票中,超过一个节点发起投票的情况 1.3 思考如何实现Raft选主 2.日志复制 Raft协议是分布式领域解决 ...

  8. 基于 raft 协议的 RocketMQ DLedger 多副本日志复制设计原理

    目录 1.RocketMQ DLedger 多副本日志复制流程图 1.1 RocketMQ DLedger 日志转发(append) 请求流程图 1.2 RocketMQ DLedger 日志仲裁流程 ...

  9. raft协议-分布式环境下的数据一致性问题

    阅读了一个有意思的ppt,是Standford大学发表的raft协议 网址:http://thesecretlivesofdata.com/raft/ 下面自己总结下咯: 1.raft是一个实现了解决 ...

随机推荐

  1. Processing 高效控制管理图形方法(二)

    之前在CSDN上发表过: https://blog.csdn.net/fddxsyf123/article/details/70992924

  2. OSI和TCP/IP参考模型

    分层思想: 分层模型是一种开发网络协议的设计方法. 把节点之间的通讯这个复杂的问题,分成了若干个简单的小问题逐一解决. 把网络相邻节点之间通过接口进行通信,下层为上层提供服务.当网络发生故障,很容易确 ...

  3. 吴恩达Machine Learning学习笔记(一)

    机器学习的定义 A computer program is said to learn from experience E with respect to some class of tasks T ...

  4. 079 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 04 实例化对象

    079 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 04 实例化对象 本文知识点:实例化对象 说明:因为时间紧张,本人写博客过程中只是对知 ...

  5. mysql插入数据报 (Incorrect string value: '\xB6\xFE' for column 'name' at row 1)

    这是我的表结构 mysql> describe students; +--------+---------------------+------+-----+---------+-------- ...

  6. const放在函数前后的区别

    转载:const放在函数前后的区别 一.const修饰指针 int b = 500; 1.const int * a = & b; 2.int const * a = & b; 3.i ...

  7. Flink深入浅出: 应用部署与原理图解(v1.11)

    往期推荐: Flink深入浅出:内存模型 Flink深入浅出:JDBC Source从理论到实战 Flink深入浅出:Sql Gateway源码分析 Flink深入浅出:JDBC Connector源 ...

  8. CodeForces 79D 【Password】,洛谷P3943 【星空】

    其实我做的是洛谷的P3943,但是听说fstqwq窃题...... 题目描述: 小 C 拿来了一长串星型小灯泡,假装是星星,递给小 F,想让小 F 开心一点.不过,有 着强迫症的小 F 发现,这串一共 ...

  9. .NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记

    目录 什么是软件架构 软件架构的基本思路 单体向分布式演进.云原生.技术中台 1.1 什么是软件架构 1.1.1 什么是架构? Software architecture = {Elements, F ...

  10. Java结构体系