Raft共识算法图二解释

news2024/11/25 20:18:49

下面是有关Raft协议中不同术语和概念的翻译及解释:

术语和概念:

  • 任期号(term number):用来区分不同的leader。
  • 前一个日志槽位的信息(prelogIndex):这是前一个日志条目的索引(第几个)。
  • 前一个槽位的任期号(prelogTerm):这是前一个日志条目的任期号。
  • 下一个槽位的索引(nextIndex{follow}):应当给特定追随者(follow)发送的下一个日志条目的索引。
  • 快速恢复:特定机制用于解决日志不一致问题。
    • XTerm:在日志不一致时,追随者中与领导者冲突的日志条目对应的任期号。如果追随者在对应位置的任期号不匹配,它会拒绝领导者的AppendEntries消息,并将自己的任期号放在XTerm中。如果在对应位置没有日志,则XTerm为-1。
    • XIndex:在追随者中,对应任期号为XTerm的第一条日志条目的索引。
    • XLen:如果追随者在对应位置没有日志,那么XTerm返回-1,XLen表示空白的日志槽位数。

在这里插入图片描述

State:

  • 持久化数据:需要在服务器重启后依然保持的数据,包括:

    • 当某个服务器刚刚重启,在它加入到Raft集群之前,它必须要检查并确保这些数据有效的存储在它的磁盘上。服务器必须要有某种方式来发现,自己的
      确有一些持久化存储的状态,而不是一些无意义的数据。
    • Log:所有的日志条目。
    • currentTerm:当前任期号。
    • votedFor:当前任期内投票给的候选人。
  • 非持久化数据(适用于所有服务器):

    • commitIndex:已知已提交的最高日志条目的索引(初始化为0,单调增加)。
    • lastApplied:应用于状态机的最高日志条目的索引(初始化为0,单调增加)。
  • 非持久化数据(仅适用于领导者)(选举后重新初始化):

    • nextIndex[]:对于每个服务器,下一个需要发送的日志条目的索引(初始化为领导者的最后一个日志条目索引+1)。
    • matchIndex[]:对于每个服务器,已知在该服务器上复制的最高日志条目的索引(初始化为0,单调增加)。
      在这里插入图片描述

Rules for Servers:

  • All Servers:所有服务器的共通行为规则。

    • 如果 commitIndex > lastAppliedlastApplied 自增,应用 log[lastApplied] 到状态机(§5.3)
    • 如果 RPC 请求或响应包含任期 T 大于 currentTerm:设置 currentTerm = T,转变为追随者(§5.1)
  • Followers:追随者的特定行为规则。

    • 对来自候选人和领导者的 RPC 做出响应
    • 如果在没有收到当前领导者的 AppendEntries RPC 或未向候选人授予投票的情况下,选举超时过期:转变为候选人
  • Candidates:候选人的特定行为规则。

    • 转变为候选人时,开始选举:
      • 增加 currentTerm
      • 为自己投票
      • 重置选举计时器
      • 向所有其他服务器发送 RequestVote RPC
      • 如果从大多数服务器收到投票:成为领导者
      • 如果收到新领导者的 AppendEntries RPC:转变为追随者
      • 如果选举超时过期:开始新的选举
  • Leaders:领导者的特定行为规则。

    • 选举成功后:向每个服务器发送初始的空 AppendEntries RPC(心跳),在空闲期间重复以防止选举超时(§5.2)
    • 如果从客户端收到命令:将条目追加到本地日志,条目应用到状态机后回应(§5.3)
    • 如果最后的日志索引 ≥ 追随者的 nextIndex:从 nextIndex 开始发送 AppendEntries RPC
    • 如果成功:更新追随者的 nextIndex 和 matchIndex(§5.3)
    • 如果因日志不一致导致 AppendEntries 失败:减少 nextIndex 并重试(§5.3)
    • 如果存在一个 N,使得 N > commitIndex,大多数 matchIndex[i] ≥ N,且 log[N].term == currentTerm:设置 commitIndex = N(§5.3, §5.4)。

在这里插入图片描述

AppendEntries RPC

目的:由领导者调用以复制日志条目,同时也作为心跳信号,以维持权威并防止超时。

参数:
  • term(任期号):领导者的当前任期。
  • leaderId(领导者ID):领导者的标识符,使得追随者可以在必要时重定向客户端。
  • prevLogIndex(前一个日志索引):紧接在新条目之前的日志条目的索引。
  • prevLogTerm(前一个日志条目的任期):与 prevLogIndex 对应的日志条目的任期。
  • entries[](日志条目数组):要存储的日志条目(心跳时为空;为了效率可能发送多个)。
  • leaderCommit(领导者的提交索引):领导者的 commitIndex
结果:
  • term(当前任期):用于领导者更新自己的任期。
  • success(成功标志):如果追随者包含与 prevLogIndexprevLogTerm 匹配的条目,则为真。
接收者实现:
  1. 如果 term < currentTerm,回复假(§5.1)
  2. 如果日志中不存在在 prevLogIndex 位置且任期与 prevLogTerm 匹配的条目,回复假(§5.3)
  3. 如果现有条目与新条目发生冲突(索引相同但任期不同),删除现有条目及其后所有条目(§5.3)
  4. 将任何未在日志中的新条目追加到日志中
  5. 如果 leaderCommit > commitIndex,将 commitIndex 设置为 leaderCommit 与最后一个新条目的索引中的较小者
    在这里插入图片描述

RequestVote RPC

目的:由候选者调用,用于在选举中收集选票。

参数:
  • term(任期号):候选者的当前任期。
  • candidateId(候选者ID):请求投票的候选者的标识符。
  • lastLogIndex(最后日志条目的索引):候选者最后一个日志条目的索引(§5.4)。
  • lastLogTerm(最后日志条目的任期):候选者最后一个日志条目的任期(§5.4)。
结果:
  • term(当前任期):用于候选者更新自己的任期。
  • voteGranted(授予选票):如果候选者收到了选票,则为真。
接收者实现:
  1. 如果 term < currentTerm,回复假(§5.1)
  2. 如果 votedFor 为空或等于 candidateId,并且候选者的日志至少与接收者的日志一样新,授予选票(§5.2, §5.4)
要求:
  • 具体来说,您应该仅在以下情况下重新启动选举计时器:
    • a) 您AppendEntries当前领导者处获得 RPC(即,如果参数中的术语AppendEntries已过时,则不应重置计时器);
    • b) 您正在开始选举;
    • c) 您向另一个同行授予投票权。
  • 请按照图 2 的指示了解何时开始选举。特别要注意的是,如果您是候选人(即您当前正在进行选举),但选举计时器触发,您应该开始另一次选举。这对于避免由于 RPC 延迟或丢失而导致系统停顿非常重要。
  • 以下是我们一遍又一遍地看到的一些内容,您应该在实施中留意:
    • 如果某个步骤显示“回复错误”,则意味着您应该立即回复,而不是执行任何后续步骤。
    • 如果您收到一个AppendEntriesRPC,其 prevLogIndex指向日志末尾之外,您应该像确实有该条目但术语不匹配一样处理它(即回复 false)。
    • 即使领导者没有发送任何条目,也AppendEntries应该执行 RPC 处理程序的检查 2 。
    • min最后一步(#5)中的是AppendEntries必要,并且需要使用最后一个条目的索引来计算。仅仅拥有应用日志中的内容并在到达日志末尾时停止的函数是不够的。这是因为在领导者发送给您的条目(全部与您的日志中的条目匹配)之后,您的日志中可能有与领导者日志不同的条目。因为#3 规定只有在存在冲突条目时才截断日志,这些条目不会被删除,并且如果 超出领导发送给您的条目,您可能会应用不正确的条目。lastApplied``commitIndex``leaderCommit
    • 严格按照第 5.4 节中的描述实施“最新日志”检查非常重要。没有作弊,只是检查长度!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1651227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【容器】k8s获取的节点oom事件并输出到node事件

在debug k8s node不可用过程中&#xff0c;有可能会看到: System OOM encountered, victim process: xx为了搞清楚oom事件是什么&#xff0c;以及如何产生的&#xff0c;我们做了一定探索&#xff0c;并输出了下面的信息。&#xff08;本文关注oom事件是如何生成&传输的&a…

LeetCode-1463. 摘樱桃 II【数组 动态规划 矩阵】

LeetCode-1463. 摘樱桃 II【数组 动态规划 矩阵】 题目描述&#xff1a;解题思路一&#xff1a;动态规划一般有自顶向下和自底向上两种编写方式&#xff0c;其中自顶向下也被称为「记忆化搜索」。解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&#xff1a; 给你一…

HBase 读写流程

HBase 读写流程 1. 读流程 Client先访问zookeeper&#xff0c;从zookeeper获取meta region的位置从meta region中读取meta表中的数据&#xff0c;meta中存储了用户表的region信息&#xff1b;根据namespace、表名和rowkey在meta表中找到对应的region信息&#xff1b;找到这个r…

深入剖析Spring框架:推断构造方法与@Bean注解的内部机制

你好&#xff0c;我是柳岸花开。 Spring框架作为Java开发中广泛使用的基础架构&#xff0c;其设计精巧、功能强大&#xff0c;尤其是其依赖注入&#xff08;DI&#xff09;和控制反转&#xff08;IoC&#xff09;特性&#xff0c;极大地提高了代码的可维护性和可测试性。本文将…

9. Django Admin后台系统

9. Admin后台系统 Admin后台系统也称为网站后台管理系统, 主要对网站的信息进行管理, 如文字, 图片, 影音和其他日常使用的文件的发布, 更新, 删除等操作, 也包括功能信息的统计和管理, 如用户信息, 订单信息和访客信息等. 简单来说, 它是对网站数据库和文件进行快速操作和管…

SpringBoot项目部署到阿里云服务器

部署步骤 步骤分以下&#xff1a; 将SpringBoot项目打包Linux上准备好Java环境、可用的MySql数据库项目上传到服务器启动项目停止项目 1.SpringBoot项目打包 数据库的链接&#xff0c;账户和密码需要和Linux上一致。 如上图打包即可。 2.Linux上准备好Java环境以及Mysql环境…

【数据结构】二叉树知识点详解

树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合有一个特殊的结点&#xff0c;称为根结点&#xff0c;根节点没有前驱结点除根节点外&#xff0c;其余结点被分成M(M>0)个互不相交的集合T1、T2、…

【busybox记录】【shell指令】expand

目录 内容来源&#xff1a; 【GUN】【expand】指令介绍 【busybox】【expand】指令介绍 【linux】【expand】指令介绍 使用示例&#xff1a; 把制表符转化为空格 - 默认输出 把制表符转化为空格 - 修改制表符转空格的个数 把制表符转化为空格 - 修改制表符转空格的个数…

git bash各分支修改内容不同但合并后不显示冲突问题

在跟着廖雪峰老师的git学习时&#xff0c;按部就班的执行明后&#xff0c;发现 而不是出现原文的结果 解决方法&#xff1a; 切换位feature分支&#xff0c;再合并 git switch feature1 git merge master 此时我们发现&#xff1a; 后面再跟着原文敲就可以了

CSS学习笔记之基础教程(二)

上节内容CSS学习笔记之基础教程&#xff08;一&#xff09; 6、边距 6.1 外边距&#xff1a;margin 6.1.1 外边距 marginmargin-topmargin-leftmargin-bottommargin-right <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8…

python-scrapy框架示例

参考&#xff1a;https://blog.csdn.net/qq_44907926/article/details/119531324 创建项目步骤&#xff1a; 1.目标网站:www.itcast.cn 2.安装虚拟环境 pip install virtualenv3.创建虚拟环境 virtualenv --always-copy --system-site-packages venv4.激活虚拟环境 venv\sc…

OCR文本识别模型CRNN

CRNN网络结构 论文地址&#xff1a;https://arxiv.org/pdf/1507.05717 参考&#xff1a;https://blog.csdn.net/xiaosongshine/article/details/112198145 git:https://github.com/shuyeah2356/crnn.pytorch CRNN文本识别实现端到端的不定长文本识别。 CRNN网络把包含三部分&…

推荐5个免费的国内平替版GPT

提起AI&#xff0c;大家第一个想到的就是GPT。 虽然它确实很厉害&#xff0c;但奈何于我们水土不服&#xff0c;使用门槛有些高。 不过随着GPT的爆火&#xff0c;现在AI智能工具已经遍布到各行各业了&#xff0c;随着时间的推移&#xff0c;国内的AI工具也已经“百花盛放”了…

简单了解泛型

基本数据类型和对应的包装类 在Java中, 基本数据类型不是继承自Object, 为了在泛型代码中可以支持基本类型, Java给每个基本类型都对应了一个包装类型. 简单来说就是让基本数据类型也能面向对象.基本数据类型可以使用很多方法, 这就必须让它变成类. 基本数据类型对定的包装类…

Istio 流量管理(请求路由、流量转移、请求重试、流量镜像、故障注入、熔断等)介绍及使用

一、Istio 流量管理 Istio是一个开源的服务网格&#xff0c;它为分布式微服务架构提供了网络层的抽象。它使得服务之间的通信变得更为可靠、安全&#xff0c;并且提供了细粒度的流量管理、监控和策略实施功能。Istio通过在服务之间插入一个透明的代理&#xff08;Envoy&#x…

Unreal游戏GPU参数详解,游戏性能优化再升级

UWA GOT Online For Unreal GPU模式近期全新发布&#xff0c;方便开发者从渲染和带宽的角度进行GPU分析。同时&#xff0c;此次更新中UWA也增加了丰富的GPU参数&#xff0c;涵盖了GPU SoC和GPU Counter模块。这些新增的参数不仅能够帮助Unreal开发者从宏观层面监控GPU的压力状况…

QT-TCP通信

网上的资料太过于书面化&#xff0c;所以看起来有的让人云里雾里&#xff0c;看不懂C-tcpsockt和S-tcpsocket的关系 所以我稍微画了一下草图帮助大家理解两个套接字之间的关系。字迹有的飘逸勉强看看 下面是代码 服务端&#xff1a; MainWindow::MainWindow(QWidget *parent) …

Jira Server 不维护了,如何将 Jira 平滑迁移到阿里云云效

作者&#xff1a;天彤 Atlassian 在 2020 年官方发布公告&#xff0c;从 2021 年起停止 Jira Server 产品的销售&#xff0c;并且在 2024 年彻底停止 Server 端产品的服务支持&#xff0c;这对于国内使用 Jira 产品的企业和研发团队造成了不小的影响。而此时国内很多 DevOps 产…

本地主机访问服务器的Redis -- 配置 ssh 端口转发

前言 在进行Java开发时&#xff0c;高度的依赖 Windows 上的开发软件 idea &#xff0c;那么我们想访问位于服务器上的 redis 怎么办呢&#xff1f;在平时我们想访问位于服务器上的程序&#xff0c;只需要开放它的端口即可&#xff0c;比如我们创建的网站&#xff0c;比如 tomc…

【拆位法 决策包容性 位运算】2871. 将数组分割成最多数目的子数组

本文涉及知识点 拆位法 贪心 位运算 决策包容性 位运算、状态压缩、子集状态压缩汇总 LeetCode2871. 将数组分割成最多数目的子数组 给你一个只包含 非负 整数的数组 nums 。 我们定义满足 l < r 的子数组 nums[l…r] 的分数为 nums[l] AND nums[l 1] AND … AND nums[r…