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. RabbitMQ Server安装及显示管理界面Installing on Windows

    接上一篇文章,继续讲解 文件很小, 1.下载路径:http://www.rabbitmq.com/download.html 2.运行rabbitmq-server-3.6.5.exe,选择要安装的目 ...

  2. 刷题[NPUCTF2020]ezlogin

    xpath注入 xpath注入这篇文章有关于xpath很详细的解答,包括原理等,详细了解请见此篇. 我个人再稍微讲一讲: 首先它的网站目录下会有一个xml文件,大概格式是这样: <?xml ve ...

  3. pytest封神之路第零步 快速入门

    背景:本文是在系列第五篇发表后的补充篇章,第一篇介绍了tep,可能对不熟悉pytest的朋友不够友好,特意补充入门篇,帮大家快速了解如何动手写pytest.如果你是从这篇文章第一次阅读,那么请忽略以上 ...

  4. 操作系统:x86下内存分页机制 (1)

    前置知识: 分段的概念(当然手写过肯定是坠吼的 为什么要分页 当我们写程序的时候,总是倾向于把一个完整的程序分成最基本的数据段,代码段,栈段.并且普通的分段机制就是在进程所属的LDT中把每一个段给标识 ...

  5. Ajax接收int类型乱码

    在Ajax返回值类型是 "text" 的时候,接收int类型时可能会出现ၧ 解决方法:将int转为String即可 int money =100; String s = Integ ...

  6. [论文理解] Good Semi-supervised Learning That Requires a Bad GAN

    Good Semi-supervised Learning That Requires a Bad GAN 恢复博客更新,最近没那么忙了,记录一下学习. Intro 本文是一篇稍微偏理论的半监督学习的 ...

  7. HTML & CSS & JavaScript 从一个表格到一个灰阶颜色表 04

    工具1:HBuilder X 1.9.9.20190522 工具2:火狐浏览器 67.0.4 (64 位) 目前,我们已经将一些行和列插入到表格中,并设置单元格的背景颜色,显示 RGB 值等. 例 7 ...

  8. Black-Lives-Matter-Resources

    下载 Black-Lives-Matter-ResourcesBlack-Lives-Matter-Resources 关于最近在美国发生的事件的资源列表 链接 描述 由于(可选) 插入链接 在这里插 ...

  9. java安全编码指南之:锁的双重检测

    目录 简介 单例模式的延迟加载 double check模式 静态域的实现 ThreadLocal版本 简介 双重检测锁定模式是一种设计模式,我们通过首次检测锁定条件而不是实际获得锁从而减少获取锁的开 ...

  10. OpenCV计算机视觉学习(4)——图像平滑处理(均值滤波,高斯滤波,中值滤波,双边滤波)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice &q ...