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

news2024/12/28 20:44:03

Raft算法

概述

Raft算法属于Multi-Paxos算法,它在兰伯特Multi-Paxos思想的基础上做了一些简化和限制,比如日志必须是连续的,只支持领导者(Leader)、跟随者(Follwer)和候选人(Candidate)3种状态。在理解和算法实现上,Raft算法相对容易许多。
除此之外,Raft算法是现在分布式系统首选的共识算法。绝大多数选用Paxos算法的系统(比如Chubby、Spanner)都是在Raft算法发布前开发的,当时没有其他选择;而全新的系统大多选择了Raft算法(比如Etcd、Consul、CockroachDB)。
掌握了Raft算法,我们就可以得心应手地满足绝大部分场景的容错和一致性需求,比如分布式配置系统、分布式NoSQL存储等,轻松突破系统的单机限制。
如果要用一句话概括Raft算法,我觉得是这样的:从本质上说,Raft算法是通过一切以领导者为准的方式实现一系列值得共识和个节点日志的一致。这句话比较抽象,做个比喻:领导者就是Raft算法中的"霸道总裁",通过霸道的"一切以我为准"的方式。决定了日志中命令的值,也实现了个节点日志的一致。后面会以领导者选举、日志赋值、成员变更为核心,讲解Raft算法的原理。

在正式介绍之前,我们先来看一道思考题。
假设我们有一个由节点A、B、C组成的Raft集群(如图所示),因为Raft算法是一切以领导者为准,所以如果集群中出现了多个领导者,就会出现不知道谁来做主的问题。在这样一个有多个节点的集群中,在节点故障、分区容错等异常情况下,Raft算法应该如何保证在同一个时间内集群中只有一个领导者呢?
在这里插入图片描述

Raft是如何选举领导者的

既然要选举领导者,要从哪些成员中选举呢?除了领导者,Raft算法还支持哪些成员身份呢?这是需要掌握的最基础的背景知识。

有哪些成员身份

在这里插入图片描述

成员身份,又叫作服务器节点状态。Raft算法支持跟随者、候选人和领导者3种状态。为了方便理解,
我们使用不同的图形表示不同的状态,如图u宋史,在任何时候,每一个服务器节点都处于这3个状态中的其中1个

  • 1.跟随者:相当于普通群众,默默地接收和处理来自领导者的消息,当领导者心跳信息超时的时候,它会主动站出来,推荐自己当候选人

  • 2.候选人:候选人将向其他节点发送请求投票(RequestVote) RPC消息,通知其他节点来投票,如果它赢得了大多数选票,那么它将晋升为领导者

  • 3.领导者:一切以我为准,平常的主要工作包含三部分,处理写请求、管理日志复制和不断发送心跳信息,通知其他节点"我是领导者,你们现在不要发起新的选举,找个新领导者来替代我"

  • 需要注意的是,Raft算法是强领导者模型,集群中只能有一个"霸道总裁"。

选举领导者的过程

那么如何从3个成员中选出领导者呢?
首先,在初始状态下,集群中所有的节点都处于跟随者的状态,如图所示。
在这里插入图片描述

Raft算法实现了随机超时时间的特性。也就是说,每个节点等待领导者节点心跳信息的超时时间间隔是随机的。
通过上图可以看到,集群中没有领导者,而节点A的等待超时时间最小(150ms),所以它会最先因为没有等到领导者的心跳信息而超时。
这个时候,节点A会增加自己的任期编号,并推荐自己为候选人,先给自己投一张选票,然后先其他阶段发送请求投票RPC消息,请他们选举自己为领导者,如图所示在这里插入图片描述

如果其他节点接收到候选人A的请求投票RPC消息,且在编号为1的这届任期内,它也还没有投过票,那么它将把选票投给节点A,并增加自己的任期编号,如图所示。
在这里插入图片描述

如果候选人在选举超时时间内赢得了大多数选票,那么它就会成为本届任期内新的领导者,如图所示。在这里插入图片描述

节点A当选领导者后,将周期性的发送心跳消息,通知其他服务器"我是领导者",阻止跟随者发起新的选举、篡权。在这里插入图片描述

如图所示,看到这里,你是不是发现领导者选举很容易理解?它与现实中地议会选举也很类似?当然,你可能还是会对一些细节产生疑问,比如:

  • 1.节点间是如何通信地?
  • 2.什么是任期?
  • 3.选举有哪些规则
  • 4.随机超时时间又是什么

选举过程四连问

老话说,细节是魔鬼。这些细节也是大家在学习Raft算法时比较难掌握地,所以这里有必要具体分析一下。一步步来

节点间如何通信

在Raft算法中,服务器节点采用地沟通方式是远程过程调用(RPC),在领导者选举中,我们需要用到这样两类RPC:

  • 1.请求投票(RequestVote)RPC时由候选人在选举期间发起,通知各节点进行投票
  • 2.日志复制(AppendEntries)RPC是由领导者发起地,用来复制日志和提供心跳消息

需要注意的是,日志复制RPC只能由领导者发起,这是实现强领导者模型的关键之一,理解这一点有助于后续更好地理解日志复制,以及如何实现日志的一致

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

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

相关文章

【城市】2023浙江省/杭州市定居与生活相关政策(居住证、户籍、引进人才、高层次人才、车房)

【城市】2023浙江省/杭州市定居与生活相关政策1(居住证、户籍、引进人才、高层次人才、车房) 文章目录 一、户籍身份1、浙江省居住证(杭州/地方)2、户籍落户/身份证/户口本 二、人才引进1、应届生补贴2、引进人才居住证3、杭州市高…

Kubernetes学习-核心概念篇(三) 核心概念和专业术语

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Kubernetes渐进式学习-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 1. 前言 在前面两篇文章我们简单介绍了什么是K8S,以及K8S的…

【介绍下分布式系统】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

C语言中的三大循环

C语言中为我们提供了三种循环语句,今天我就来与诸君细谈其中之奥妙。循环这一板块总结的内容较多,而且,很重要!(敲黑板!!!),所以诸君一定要对此上心,耐住性子…

算法训练营day25

零、回溯算法理论 参考链接13.1 回溯算法 - Hello 算法 (hello-algo.com) 1.尝试与回退 之所以称之为回溯算法,是因为该算法在搜索解空间时会采用“尝试”与“回退”的策略。当算法在搜索过程中遇到某个状态无法继续前进或无法得到满足条件的解时,它会…

41. UE5 RPG 设置火球术的碰撞类型

在上一篇中,我们设置了火球术从发射到击中敌人的整个周期使用的音效和特效,现在看上去它像一个真正的火球术了。在这一篇文章里面,我们主要解决一下火球术碰撞的问题,现在已知的问题是,有些不需要和火球产生碰撞的物体…

同事上班这样摸鱼,我坐边上咋看他都在专心写代码啊

我边上有个同事,我坐他边上,但是每天看着他都眉头紧锁,忙的不亦乐乎,但终于有一天,我发现了他上班摸鱼的秘诀。 我劝你千万不要学会这4招,要不就该不好好上班了。 目录 1 上班看电影? 2 上班…

代码随想录(番外)图论3|1020. 飞地的数量|130. 被围绕的区域

代码随想录&#xff08;番外&#xff09;图论3|1020. 飞地的数量|130. 被围绕的区域 1020. 飞地的数量 class Solution { public:int dir[4][2]{0,1,1,0,0,-1,-1,0};int count;void dfs(vector<vector<int>>& grid,int x,int y){grid[x][y]0;count;for(int i…

网站内容下载软件有哪些 网站内容下载软件推荐 网站内容下载软件安全吗 idm是啥软件 idm网络下载免费

一招搞定网页内容下载&#xff0c;并且各大网站通用&#xff01;绕过资源审查&#xff0c;所有网站内容随意下载。解锁速度限制&#xff0c;下载即高速无视网站限速。跳过会员充值&#xff0c;所有VIP资源免费下载。有关网站内容下载软件有哪些&#xff0c;网站内容下载软件推荐…

【数据分析】NumPy

文章目录 [toc]ndarray的创建np.array()方法np.arange()方法np.zeros()方法np.ones()方法np.full()方法np.eye()方法np.random模块np.random.random()方法np.random.randint()方法np.random.choice()方法np.random.shuffle()方法 ndarray的属性ndarray.dtypendarray.ndimndarra…

用数据检验函数正确性,matlab2C

数据存取格式 filename1 g.txt; fid1 fopen(filename1,w); for i 1 : length(g)for j1:size(g,2)if(j1)fprintf(fid1,{%.16f,,g(i,j)); elseif(j>1&&j<151)fprintf(fid1,%.16f,,g(i,j)); elsefprintf(fid1,%.16f},\n,g(i,j));endend%fprintf(fid1,\n…

【小梦C嘎嘎——启航篇】C++特殊类设计

【小梦C嘎嘎——启航篇】C特殊类设计&#x1f60e; 前言&#x1f64c;1.请设计一个类&#xff0c;该类不能被继承2.请设计一个类&#xff0c;只能在堆上创建对象3.请设计一个类&#xff0c;只能在栈上创建对象4.请设计一个类&#xff0c;该类不能发生拷贝5.请设计一个类&#x…

uniapp真机调试无法调用之前页面的方法

在uniapp通过getCurrentPages&#xff08;&#xff09;页面栈调用之前页面方法&#xff0c;h5可生效但app真机调试找不到方法 let pages getCurrentPages()let beforePage pages[pages.length - 3]beforePage.refresh() //真机调试refresh为undefined解决&#xff1a; 后面…

【kettle004】kettle访问本地MySQL数据库并处理数据至execl文件

一直以来想写下基于kettle的系列文章&#xff0c;作为较火的数据ETL工具&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 熟悉、梳理、总结下MySQL关系数据库相关知识体系 kettle访问MySQL数据库并处理数据至execl文件…

Python AI库 Pandas的常见操作的扩展知识

Python AI库 Pandas的常见操作的扩展知识 本文默认读者具备以下技能&#xff1a; 熟悉python基础知识&#xff0c;vscode或其它编辑工具 熟悉表格文件的基本操作 具备自主扩展学习能力 前文中对Pandas的数据结构以及基础操作做了介绍,本文中会在前文的基础上,对常见的操作进…

MATLAB实现果蝇算法优化BP神经网络预测分类(FOA-BP)

果蝇算法&#xff08;Fruit Fly Optimization Algorithm, FFOA&#xff09;是一种启发式优化算法&#xff0c;受果蝇觅食行为的启发。将其应用于优化BP神经网络&#xff0c;主要是为了寻找BP神经网络中的最佳权重和偏置值。以下是一个基本的流程&#xff1a; 初始化&#xff1a…

【C语言】贪吃蛇详解(附源码)

一、贪吃蛇实现效果 【C语言】贪吃蛇&#xff08;控制台&#xff09; 二、源码 &#x1f388;&#x1f388;&#x1f388;Snake 残风也想永存/C语言项目 - 码云 - 开源中国 (gitee.com)&#x1f388;&#x1f388;&#x1f388; 三、如何使用C语言去实现一个贪吃蛇&#xff1f…

1438.绝对差不超过限制的最长连续子数组

显然我们是需要同时维护当前的最大值和最小值,这就需要两个单调队列dq_down(递减排列)一个维护最大值,dq_up(递增排列)一个维护最小值,同样这个是使用我们第二个模板 [left, i]. 只有当left等于某一个dq.front()的时候,才把它pop_front().这就使得对应相同的元素,我们只需要保…

ruoyi-nbcio-plus基于vue3的flowable修正加签与跳转的前端问题

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

IF 27.5|GWAS+图位克隆法,揭秘水稻调控籽粒性状的关键基因

水稻是全球种植最广泛的作物 拥有超过12万个品种 提高粮食品质是当代水稻育种的首要目标 在现代水稻育种中&#xff0c;不同类型的水稻已经被培育出来&#xff0c;比如食用稻和酿酒稻。这些不同类型的水稻具备不同的籽粒特性&#xff0c;其中包括育种过程中选择的不同等位基因…