分布式与一致性协议之Raft算法(二)

Raft算法

什么是任期

我们知道,议会选举中的领导者是有任期的,当领导者任命到期后,需要重新再次选举。Raft算法中的领导者也是有任期,每个任期由单调递增的数字(任期编号)标识。比如,节点A的任期编号是1。任期编号会随着选举的举行而变化,分析如下。

  • 1.跟随者在领导者心跳信息超时并推荐自己为候选人时,会增加自己的任期编号,比如节点A的当前任期编号为0,那么在推荐自己为候选人时,它会将自己的任期编号增加为1。
  • 2.如果一个服务器节点发现自己的任期编号比其他节点小,那么它会更新自己的编号到较大的编号值。比如节点B的任期编号是0,当受到来自节点A的请求投票RPC消息时,因为消息中包含了节点A的任期编号,且编号为1,所以节点B将把自己的编号更新为1.

与现实议会选举中的领导者的任期不同,Raft算法中的任期不只是指时间段,而且任期编号的大小会影响领导者选举和请求的处理。

  • 1.Raft算法中约定,如果一个候选人或者领导者发现自己的任期编号比其他节点小,那么它会立即恢复成跟随者状态。比如分区错误恢复后,任期编号为3的领导者节点B收到来自新领导者的包含任期编号为4的心跳信息,那么节点B将立即恢复成跟随者状态
  • 2.Raft算法中还约定,如果一个节点接收到一个包含较小的任期编号值得请求,那么它会直接拒绝这个请求。比如任期编号为4的节点C在收到任期编号为3的请求投票RPC消息时,会拒绝这个消息。可以看到,Raft算法中的任期比议会选举中的任期要复杂一些。同样,Raft算法中的选举规则的内容也会比较多

选举有哪些规则

在议会选举中,比成员身份、领导者的任期还重要的就是选举的规则,比如一人一票、弹劾制度等。“无规矩不成方圆”,Raft算法中也约定了选举规则,主要包含以下内容。

  • 1.领导者周期性的向所有跟随者发送心跳消息(即不包含日志项的日志复制RPC消息),通知大家我是领导者,阻止跟随者发起新的选举。

  • 2.如果在指定时间内,跟随者没有接收到来自领导者的消息,那么它就认为当前没有领导者,同时推荐自己为候选人,发起领导者选举。

  • 3.在一次选举中,赢得大多数选票的候选人将晋升为领导者

  • 4.在一个任期内,领导者一直都会是领导者,直到它自身出现问题(比如宕机)或者网络延迟,其他节点才会发起一轮新的选举。

  • 5.在一次选举中,每一个服务器节点最多会对一个任期编号透出一张选票,并且按照"先来先服务"的原则进行投票。比如任期编号为3的节点C
    先收到了一个包含任期编号为4的投票请求(来自节点A),又收到了1个包含任期编号为4的投票请求(来自节点B),那么节点C将会把唯一一张选票
    投给节点A,在收到节点B的投票请求RPC消息时,它已没有选票可投了,如图所示
    在这里插入图片描述

  • 6.日志完整性高的跟随者(也就是最后一条日志对应的任期编号值更大,索引号更大)拒绝投票给日志完整性低的候选人。比如节点B的任期编号为3,节点C的任期编号是4,节点B的最后一条日志项对应的任期编号为3,而节点C的最后一条日志项对应的任期编号为2,那么当节点C请求节点B投票给自己时,节点B将拒绝投票,如图所示。
    在这里插入图片描述

  • 注意。
    选举时跟随者发起的,推荐自己为候选人;大多数选票是指集群成员半数以上的选票;大多数选票规则的目标是保证在一个给定的任期内有且只有一个领导者。

其实在选举中,除了选举规则外,我们还需要避免一些导致选举失败的情况,比如同一任期内,多个候选人同时发起选举,导致选票被瓜分,选举失败。那么Raft算法是如何避免这个问题的呢?答案就是采用随机超时时间。

如何理解随机超时时间

议会选举中常出现未达到指定票数,选举无效,需要重新选举的情况。Raft算法的选举中也u才能在类似的问题,那它是如何处理选举无效的问题呢?其实,Raft算法巧妙地使用了随机选举超时时间的方法,即把超时时间都分散开来,在大多数情况下只有一个服务器节点发起选举,而不是同时发起选举,从而减少因选票瓜分导致选举失败的情况。在Raft算法中,随机超时时间有两种含义,这也是很多人容易理解错误的地方,需要注意一下:

  • 1.跟随者等待领导者心跳信息超时的时间间隔是随机的。

  • 2.如果候选人在一个随机时间间隔内没有赢得过半票数,那么选举无效,然后候选人会发起新一轮的选举,也就是说,等待选举超时的时间间隔是随机的。

  • 注意
    Raft算法通过任期、领导者心跳消息、随机选举超时时间、先来先服务的投票原则、大多数选票原则等,保证了一个任期只有一位领导者,也极大地减少了选举失败的情况

Raft是如何复制日志的

我们知道Raft除了能实现一系列值得共识之外,还能实现各节点日志的一致。但是,你也许会有这样的疑惑:“什么是日志?它和我的业务数据有什么关系呢?”
想象一下,一个木筏(Raft)是由多根整齐一致的原木(Log)组成的,原木又是由木质材料组成的,已知日志是由多条日志项(Log Entry)组成的,如果把日志比喻成原木,那么日志项就是木质材料。在Raft算法中,副本数据是以日志的形式存在的,领导者接收到来自客户端的写请求后,处理写请求的过程就是一个复制和应用(Apply)日志项到状态机的过程。那么Raft算法是如何复制日志,又是如何实现日志的一致的呢?这些内容是Raft算法中非常核心的内容

如何理解日志

副本数据是以日志的形式存在的,而日志由日志项组成,那么日志项究竟是什么呢?
其实,日志项是一种数据格式,它主要包含用户指定的数据,也就是指令(Command),以及一些附加信息,比如索引值(Log Index)、任期编号(Term),如图所示。
在这里插入图片描述

  • 1.指令:一条由客户端请求指定的、状态机需要执行的命令。你可以将指令理解成客户端指定的数据
  • 2.索引值:日志项对应的整数索引值,用于标识日志项,是一个连续的、单调递增的整数号码
  • 3.任期编号:创建这条日志项的领导者的任期编号。

从图中可以看到,一届领导者任期往往有多条日志项,而且日志项的索引值是连续的,这一点需要特别注意。
现在你可能会问:不是说Raft算法实现了个节点间日志的一致吗?为什么上图中的4个跟随者的日志都不一样呢?日志是如何复制的呢?Raft又是如何实现日志的一致呢?

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自定义类型

引言: C语言分为:1、内置类型 2、自定义类型: 1》结构体——每个成员有自己的空间 2》枚举型——定义多个常量 3》联合体——所有成员共用一快内存空间 一、结构体: 单独写过了一篇 关于结构体的介绍以及使用 二、 枚举型&…

论文辅助笔记:Tempo之modules/prompt.py

1 get_prompt_param_cls 2 get_prompt_value 3 Prompt 类 3.1 _init_weights 3.2 forward

表空间的概述

目录 表空间的属性 表空间的类型 永久性表空间(PermanentTablespace) 临时表空间(Temp Tablespace ) 撤销表空间(Undo Tablespace) 大文件表空间(BigfileTablespace) 表空间的状态 联机状态(Online) 读写状态(Read Write) 只读状态(Read) 脱机状态(Offline) Oracle从…

Elasticsearch初步认识

Elasticsearch初步认识 ES概述基本概念正向索引和倒排索引IK分词器ik_smart最少切分ik_max_word为最细粒度划分 ES索引库基本操作对索引库操作对文档操作 ES概述 Elasticsearch,简称为 ES,是一款非常强大的开源的高扩展的分布式全文检索引擎&#xff0c…

谁能取代迈巴赫,征服互联网安全大佬周鸿祎?

‍作者 |老缅 编辑 |德新 4月18日,「周鸿祎卖车」登上了微博热搜。这位360创始人、董事长发微博称:自己做了一个艰难的决定,将把陪伴9年的迈巴赫600给卖掉。 随后,他解释道:「这是因为我需要体验新一代车的感觉。古人…

opencv图像处理详细讲

传统的计算机视觉框架: SimpleCV BoofCV Dlib JavaCV 深度学习计算机视觉框架 Caffe Tensorflow Pytorch Paddlepaddle Keras 深度视觉计算机视觉框架 OpenVINO TensorRT onnxruntime Deepface YOLO/DarkNet mmdetection Paddle-detection/seg/ocr …

重学java 29.经典接口

光阴似箭,我好像跟不上 —— 24.5.6 一、java.lang.Comparable 我们知道基本数据类型的数据(除boolean类型外)需要比较大小的话,直接使用比较运算符即可,但是引用数据类型是不能直接使用比较运算符来比较大小的。那么,如何解决这个…

ECC 号码总结

1、问题背景 在手机开发过程中,经常遇见各种紧急号码问题,在此特意总结下紧急号码相关知识。 2、紧急号码来源 在MTK RILD EccNumberSource.h中,定义了如下几种紧急号码来源。 按优先级排序介绍如下 2.1、SOURCE_NETWORK 网络下发&#xff…

本地大语言模型LLM的高效运行专家 | Ollama

Ollama简介 Ollama是一个开源的大型语言模型服务工具,它帮助用户快速在本地运行大模型。通过简单的安装指令,用户可以执行一条命令就在本地运行开源大型语言模型,如Llama 2。Ollama极大地简化了在Docker容器内部署和管理LLM的过程&#xff0…

Linux网络设置

配置网络相关设置 一般包括如下内容: 主机名 IP/netmask A B 路由:默认网关 DNS服务器 主DNS服务器 次DNS服务器 第三个DNS服务器 ping baidu 网络配置命令 ifconfig ifconfig -a #表示显示所有网卡包括没有启动的网卡 ifconfig 网卡名称 [up|down…

考研数学|基础跟张宇,强化直接1000题还是先做660?

跟宇哥用1000题的,我愿称之为卷王之王!660对基础阶段是绝佳的查漏补缺,必做! 自我介绍一下:我21年一战数学83,总分没过线,22年二战143,逆袭上岸211!660是我的心头好&…

js api part4

其他事件 页面加载事件 外部资源(如图片、外联CSS和JavaScript等)加载完毕时触发的事件 原因:有些时候需要等页面资源全部处理完了做一些事情,老代码喜欢把 script 写在 head 中,这时候直接找 dom 元素找不到。 事件…

简单介绍IIC通信协议

文章目录 一,简单介绍二,IIC物理层三,IIC通信时序1.起始位与停止位2.IIC读写地址位信号3.IIC应答信号4.IIC数据位收发信号 四,总线速率五,主机发送数据流程六,主机接收数据流程七,IIC的时钟延展…

力扣每日一题109:有序链表转换二叉搜索树

题目 中等 给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为 平衡 二叉搜索树。 示例 1: 输入: head [-10,-3,0,5,9] 输出: [0,-3,9,-10,null,5] 解释: 一个可能的答案是[0,-3,9,-10,null,5],它…

高效转化,智能私信软件策略揭秘

在数字营销的浪潮中,智能私信软件策略正成为提升转化率的重要工具。这种软件以其个性化、自动化的特点,正在重新定义与客户的互动方式,让企业能够更加高效地吸引并留住潜在客户。 智能私信软件的核心在于其高度的定制化和人性化设计。通过大数…

Android Handler用法

Android Handler用法 为什么要设计Handler机制?Handler的用法1、创建Handler2、Handler通信2.1 sendMessage 方式2.2 post 方式 Handler常用方法1、延时执行2、周期执行 HandlerThread用法主线程-创建Handler子线程-创建Handler FAQMessage是如何创建主线程中Looper…

今天发现个有意思的问题:java基础篇章网络编程的报错问题,顺便看一下各个GPT的实力

问题: 一个java socket网络编程的引发的异常,具体代码Client.java、Server.java,如下 Client.java package Test2;import java.io.*; import java.net.Socket;public class Client {public static void main(String[] args) throws IOExce…

JMeter 请求头信息配置详解

在进行 Web 测试和 API 测试时,正确配置 HTTP 请求头是关键步骤之一,尤其当使用诸如 JMeter 这样的强大工具时。在本文中,我将详细介绍如何在 JMeter 中有效地配置和管理HTTP请求头。 在 JMeter 中添加和配置 HTTP 请求头 步骤 1: 打开 HTT…

中间件研发之Springboot自定义starter

Spring Boot Starter是一种简化Spring Boot应用开发的机制,它可以通过引入一些预定义的依赖和配置,让我们快速地集成某些功能模块,而无需繁琐地编写代码和配置文件。Spring Boot官方提供了很多常用的Starter,例如spring-boot-star…

张大哥笔记:卖盗版网课,获利 100 万被抓

这几天刷视频,看到一个新闻,某大学生卖盗版网课,把别人2000多正版网课,以做活动名义售卖20元,获利100多万被抓。 下方图片来自:极目新闻 卖这种盗版网课,门槛低,成本低,…