Raft共识算法图二解释

下面是有关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 节中的描述实施“最新日志”检查非常重要。没有作弊,只是检查长度!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于二手车系统学习--登录模块

1.样式1-17行 <div class"cheader"><div style"width: 80%;margin: 0 auto;line-height: 50px;padding-top: 10px"><el-row><el-col:span"5"style"font-size: 20px;cursor: pointer;color: #00ae66;font-weight: bold…

苹果自研大语言模型“Ajax“ 助力iOS 18升级;Stack Overflow与OpenAI建立API合作伙伴关系

&#x1f989; AI新闻 &#x1f680; 苹果自研大语言模型"Ajax" 助力iOS 18升级 摘要&#xff1a;苹果公司预计通过自研大语言模型Ajax来为iOS 18和Siri带来重大升级&#xff0c;但不计划推出类似ChatGPT的AI聊天机器人。Ajax模型基于Google的Jax框架&#xff0c;并…

Android:弹出对话框方式梳理一览(一)

Android&#xff1a;弹出对话框方式梳理一览&#xff08;一&#xff09; Guide&#xff5c;导言 在Android开发中&#xff0c;对话框可能是我们与用户交互的非常常用的方式&#xff0c;包括弹出一个小界面&#xff0c;可能在实际场景中都非常实用。本篇文章主要就是对Android弹…

搭建Docker私有镜像仓库

大家好&#xff0c;今天给大家分享一下如何搭建私有镜像仓库&#xff0c;私有镜像仓库可以更好地管理和控制镜像的访问和使用&#xff0c;确保只有授权的人员能够获取和使用特定的镜像&#xff0c;而且方便团队内部共享定制化的镜像&#xff0c;提高开发和部署效率&#xff0c;…

MySQL 中的HASH详解

MySQL中的哈希索引&#xff08;Hash Index&#xff09;是一种特殊的数据库索引类型&#xff0c;它利用哈希表&#xff08;Hash Table&#xff09;的数据结构来存储索引项。哈希表通过哈希函数&#xff08;Hash Function&#xff09;将索引列的值转化为一个固定长度的哈希码&…

【目录】500 行或更少(500 Lines or Less)

AOSA 500 行或更少&#xff08;500 Lines or Less&#xff09;是《开源应用程序体系结构》(Architecture of Open Source Applications, AOSA)系列的第四卷。该系列的前三卷是关于大型程序必须解决的大问题&#xff0c;而本书专注于程序员在构建新事物时在小规模中做出的设计决…

数据结构链表

数据结构链表 链表 1&#xff09;链表的概念及结构: 链表是一种物理存储结构上非连续存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引用链接次序实现的。 2&#xff09;实际中链表的结构非常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; 单向、双向…

SAP PP模块学习提炼第一部分

SAP是ERP的一款软件。 SAP的入门困难&#xff1a; 听不懂&#xff0c;看不懂缺乏知识体系缺乏行业经验 SAP入门引导&#xff1a; 导师引导实战演练 SAP基础介绍 1.什么是SAP? System, Application and Products in Data Processing 即数据处理的系统、应用和产品。 2.…

7: 分配器

文章目录 operator new () 和 malloc()stl 中allocator的使用allocators 内部实现vc的分配器 并没有太多的技巧可言下面是BC5的stl 设计GCC的allocators2.9版本GCC使用的allocator是什么&#xff1f;这里面cookie的作用 4.9版本的GCC allocator operator new () 和 malloc() 所…

Redis系列之key过期策略介绍

为什么要有过期策略&#xff1f; Redis是一个内存型的数据库&#xff0c;数据是放在内存里的&#xff0c;但是内存也是有大小的&#xff0c;所以&#xff0c;需要配置redis占用的最大内存&#xff0c;主要通过maxmemory配置 maxmomory <bytes> # redis占用的最大内存官…

深入解析C#中的async和await关键字

文章目录 一、异步编程的基本概念及其在C#中的实现二、async关键字的定义及其用法三、await关键字的定义及其用法示例代码&#xff1a;使用async和await编写一个简单的异步程序 四、async和await的优点注意事项 五、C#下async和await中常见问题汇总1. 异步方法中的await调用2. …

CST电磁仿真软件远场源的导出调用和提取结果【小白必看】

远场源的导出&调用(1) 提取Hybrid仿真所需的远场源&#xff01; Post-Processing > Tools > Result Templates Tools >Farfield and Antenna Properties > Export Farfields As Source 混合求解(Hybrid Simulation)是对安装在舰船等大型平台上的天线进行仿真…

【Leetcode 42】 接雨水-单调栈解法

基础思路&#xff1a; 维持栈单调递减&#xff0c;一旦出现元素大于栈顶元素&#xff0c;就可以计算雨水量&#xff0c;同时填坑&#xff08;弹出栈顶元素&#xff09; 需要注意&#xff1a; 单调栈通常保存的是下标&#xff0c;用于计算距离 public static int trap2(int[…

什么是OSW(光交换)?

光交换&#xff08;OSW&#xff09;是光传输网络中的一项关键技术&#xff0c;为复杂网络内光信号的动态路由和管理提供了手段。OSW的工作原理涉及对光信号路径的精确控制&#xff0c;确保光通信系统中的高效和灵活传输。本文全面介绍了OSW的不同类型、功能、工作模式和优势&am…

Linux 二十一章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

上市企业扣非净利润是什么意思,可以反映什么问题?

扣非净利润&#xff0c;全称“扣除非经常性损益后的净利润”&#xff0c;是指企业在剔除与正常经营无关的、偶然发生的损益后所得到的利润。这些非经常性损益包括但不限于政府补贴、处置长期资产、税收返还等。 扣非净利润的计算公式为&#xff1a;扣非净利润 净利润 - 非经常…

python:机器学习特征优选

作者&#xff1a;CSDN _养乐多_ 在Python中进行机器学习特征选择的方法有很多种。以下是一些常用的方法&#xff1a; 过滤法&#xff08;Filter Methods&#xff09;&#xff1a;通过统计方法或者相关性分析来评估每个特征的重要性&#xff0c;然后选择最相关的特征。常用的…

基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 遗传算法&#xff08;GA&#xff09;原理 4.2 BP神经网络原理 4.3 遗传优化BP神经网络结合应用 4.4 遗传算法简要改进 5.完整程序 1.程序功能描述 基于改进遗传优化的BP神经网络金融…

电机控制系列模块解析(17)—— 速度环

一、电机转速控制 电机控制的速度环是整个电机控制系统中的外环&#xff0c;其主要任务是根据设定的转速指令值&#xff08;目标速度&#xff09;与实际电机转速之间的偏差&#xff0c;调整电流环的参考值&#xff08;d轴电流Id或q轴电流Iq&#xff0c;涉及类似单电流环的弱磁…

OpenCampass评测实战 作业

按照如下教程文档操作即可&#xff1a;https://aicarrier.feishu.cn/wiki/NxUOwnLuvi0clykyzj7ccSHPndb