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

news2024/9/20 0:58:47

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.coloradmin.cn/o/1633579.html

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

相关文章

基于Docker + Locust的数据持久化性能测试系统

前几天给大家分享了如何使用Locust进行性能测试,但是在实际使用中会发现存在压测的结果无法保存的问题,比如在分布式部署情况下进行压测,每轮压测完成需要释放资源删除容器重新部署后,这段时间的压测结果就都丢失了,如…

Nacos 安全零信任实践

作者:柳遵飞 Nacos 作为配置中心经常存储一些敏感信息,但是由于误用导致安全风险,最常见的主要是以下两个问题: 1)Nacos 暴露公网可以吗?不可以,因为 Nacos 定位是注册配置中心,是…

【STM32+HAL】SDIO模式读写SD卡

一、准备工作 有关CUBEMX的初始化配置,参见我的另一篇blog:【STM32HAL】CUBEMX初始化配置 二、所用工具 1、芯片: STM32F407ZGT6 2、IDE: MDK-Keil软件 3、库文件:STM32F4xxHAL库 三、实现功能 实现用DMA读写SD卡内…

Hadoop3:集群搭建及常用命令与shell脚本整理(入门篇,从零开始搭建)

一、集群环境说明 1、用VMware安装3台Centos7.9虚拟机 2、虚拟机配置:2C,2G内存,50G存储 3、集群架构 从表格中,可以看出,Hadoop集群,主要有2部分,一个是HDFS服务,一个是YARN服务 …

CSS中的层叠上下文

HTML 文档中的三维概念 平时我们从设备终端看到的 HTML 文档都是一个平面的,事实上 HTML 文档中的元素却是存在于三个维度中。除了大家熟悉的平面画布中的 x 轴和 y 轴,还有控制第三维度的 z 轴。 其中 x 轴通常用来表示水平位置,y 轴来表示…

力扣刷题Day2

题目链接: 24. 两两交换链表中的节点 - 力扣(LeetCode) 效果: 解题思路: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 注意不可以只是单纯的改变节点内部的值,而…

面试:MYSQL(SQL优化、MYSQL事务)

目录 一、SQL优化 1、如何定位慢查询 (1)方案一:开源工具 (2)方案二:慢日志查询 2、定位到慢查询时,如何优化 3、什么是索引 (1)底层结构 4、聚簇索引&#xff0…

linux学习:线程安全(信号量+互斥锁读写锁+条件变量+可重入函数)

目录 信号量 有名信号量 步骤 api 创建、打开一个POSIX有名信号量 对 POSIX 有名信号量进行 P、V 操作 关闭、删除 POSIX 有名信号量 例子 无名信号量 步骤 api 初始化、销毁 POSIX 无名信号量 互斥锁读写锁 例子 两条线程 使用互斥锁来互斥地访问标准输出 在加锁…

UE Snap03 启动参数设置

UE Snap03 启动参数设置 UE打包后传入自定义参数及解析。 void UGameInstance::StartGameInstance() {Super::StartGameInstance();UE_LOG(LogTemp, Warning, TEXT("--StartGameInstance--"));FString param;FParse::Value(FCommandLine::Get(), TEXT("-UserN…

# 谷歌 Chrome 浏览器无法安装插件的解决方法

谷歌 Chrome 浏览器无法安装插件的解决方法 运用开发模式安装 安装步骤: 1、 将 XX.crx 插件的扩展名改成 .zip 或者 .rar 并解压到文件夹 XX 目录。 1)如:下载的 前端框架 vue.js 插件 nhdogjmejiglipccpnnnanhbledajbpd-6.6.1-Crx4Chro…

Isaac Sim 2 (学习笔记4.26)

今天一整天都要开会,闲的无聊,把这周学的东西简单整理下。纯英文文档想不起来东西的时候总是找不到位置...持续更新一整天 1.将块与块连接起来 尝试连接块与块的时候发现只能是cube、mesh连接,如果是一整个的包括坐标系、材质包等等&#xf…

阿里云服务器购买和设置

🐌博主主页:🐌​倔强的大蜗牛🐌​ 📚专栏分类:服务器❤️感谢大家点赞👍收藏⭐评论✍️ 目录 1、搜索阿里云网址: 2、点击产品,选择云服务器ECS 3、选择立即购买 4、选…

C# Web控件与数据感应之 Control 类

目录 关于数据感应 Control 类 范例运行环境 simpleDataListEx方法 设计 实现 调用示例 数据源 调用 小结 关于数据感应 数据感应也即数据捆绑,是一种动态的,Web控件与数据源之间的交互,诸如 ListControl 类类型控件,在…

uni-app - 使用地图功能打包安卓apk的完美流程以及重要的注意事项(带您一次打包成功)

在移动应用开发中,地图功能是一个非常常见且实用的功能,可以帮助用户快速定位并浏览周边信息。而在uni-app开发中,使用地图功能也是一项必备技能。本文将介绍uni-app使用地图功能打包安卓apk的注意事项,帮助开发者顺利完成地图功能…

万兆以太网MAC设计(12)万兆UDP协议栈上板与主机网卡通信

文章目录 一、设置IP以及MAC二、上板效果2.1、板卡与主机数据回环测试2.2、板卡满带宽发送数据 一、设置IP以及MAC 顶层模块设置源MAC地址 module XC7Z100_Top#(parameter P_SRC_MAC 48h01_02_03_04_05_06,parameter P_DST_MAC 48hff_ff_ff_ff_ff_ff )(input …

excel图表如何忽略空值呢?

在excel柱形图和折线图中有多余的空值,如何不把空值当成0值处理,可以达到第二个图的效果? 添加图片注释,不超过 140 字(可选) 用的excel2019已经是自动将这些空值忽略了,在低版本上,是会将空值…

2024年想创业做电商,视频号小店绝对是最明智的选择!

大家好,我是电商糖果 在电商行业摸爬滚打了七年时间了,做过天猫,京东,闲鱼。 目前在做的项目只有两个,一个是抖音小店,已经做了四年多了。 另一个就是视频号小店,现在做了有一年多了。 视频…

力扣HOT100 - 79. 单词搜索

解题思路&#xff1a; 深度优先搜索&#xff08;DFS&#xff09; 剪枝。 class Solution {public boolean exist(char[][] board, String word) {char[] words word.toCharArray();for(int i 0; i < board.length; i) {for(int j 0; j < board[0].length; j) {if (df…

docker compose安装redis

一、安装准备 在docker hub查看redis镜像版本。查看地址如下&#xff1a; Dockerhttps://hub-stage.docker.com/_/redis/tags 二、拉取docker镜像 我这里用redis:6.2.14版本&#xff0c;先拉取镜像。命令如下&#xff1a; docker pull redis:6.2.14 查看刚刚下载的镜像&am…

冯喜运:4.30现货黄金涨跌互现,最新黄金原油趋势分析

【黄金消息面分析】&#xff1a;上周五公布的数据&#xff0c;美国3月核心PCE年率维持前值不变&#xff0c;美国4月一年期通胀率预期上升&#xff0c;显示通胀顽固并有所回升&#xff0c;但其经济数据美国3月个人支出月率和美国4月密歇根大学消费者信心指数终值则低于预期和前值…