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

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.mfbz.cn/a/588417.html

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

相关文章

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.5--I.MX6U启动方式

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

想要吃瓜,就要学会,在不必要的冲突发生时,沉默就是一种智慧——早读(逆天打工人爬取热门微信文章解读)

练习一下怼人的本事 引言Python 代码第一篇 洞见 养生的尽头,是养格局第二篇 人民日报 来啦 早班新闻车要闻社会 政策结尾 沉默是智者的选择 在不必要的冲突面前 选择沉默是一种智慧 引言 昨天下午睡醒 看到群里有些言论 遂 battle了一波 给大家吃吃瓜 到中午 车…

Codeforces Round 941 (Div. 2) D. Missing Subsequence Sum

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e18, maxm 4e4 5; c…

网络安全之弱口令与命令爆破(中篇)(技术进阶)

目录 一&#xff0c;什么是弱口令&#xff1f; 二&#xff0c;为什么会产生弱口令呢&#xff1f; 三&#xff0c;字典的生成 四&#xff0c;使用Burpsuite工具验证码爆破 总结 笔记改错 一&#xff0c;什么是弱口令&#xff1f; 弱口令就是容易被人们所能猜到的密码呗&a…

MyBatis中的#{} 和 ${}

目录 #{} 和 ${} 预编译 SQL 和 即时 SQL SQL注入 ${}的使用 #{} 和 ${}的使用 MyBatis参数赋值有两种方式&#xff0c;在上一篇文章中&#xff0c;一直使用 #{} 进行赋值&#xff0c;接下来&#xff0c;我们来使用 ${} 进行赋值&#xff0c;并观察 #{} 和 ${} 的区别 使用…

2024年外贸企业邮箱最新排名

外贸企业在与客户沟通中的重要工具就是企业邮箱&#xff0c;那么外贸企业邮箱哪个比较好呢&#xff1f;本文聚焦2024年外贸企业邮箱市场的最新动态&#xff0c;通过对五个领先品牌的深度对比&#xff0c;旨在为企业决策者提供详尽参考。首当其冲的是备受瞩目的Zoho Mail企业邮箱…

JMeter性能压测脚本录制

第一步&#xff1a;电脑打开控制面板设置代理服务器 第二步&#xff1a;jmeter的测试计划添加一个HTTP&#xff08;S&#xff09;脚本记录器 在脚本记录器里配置好信息&#xff0c;然后保存为脚本文件&#xff08;.*表示限定&#xff09; 此方框内容为项目地址&#xff08;可改…

字符串函数与字符函数运用(1)

字符串与字符函数介绍1 前言一、字符分类函数字符函数练习 二、字符函数转换1.引入库2.代码改进 字符串函数strlen函数strcpy 结尾 前言 字符串函数大概有以下这几种 strcpy、strcat 、strcmp、strncpy、strncat、strncmp、strstr、strtok、strerror 这些函数可以很好的解决你…

DRF中的请求入口分析及request对象分析

DRF中的请求入口分析及request对象分析 django restframework框架是在django的基础上又给我们提供了很多方便的功能&#xff0c;让我们可以更便捷基于django开发restful API 1 drf项目 pip install django pip install djangorestframework1.1 核心配置 INSTALLED_APPS [d…

神经网络中常见的激活函数:理解与实践

神经网络中常见的激活函数&#xff1a;理解与实践 在神经网络中&#xff0c;激活函数是一个非常重要的组成部分&#xff0c;它为神经元引入了非线性特性&#xff0c;使得神经网络可以拟合各种复杂的函数关系。本文将介绍9种常见的激活函数&#xff0c;包括它们的概述、公式以及…

《百图解码支付系统设计与实现》电子书_V20240503

《百图解码支付系统设计与实现》这本书的底稿已经完成一半&#xff0c;从2023.12.24发布专栏第一篇文章“跟着图走&#xff0c;学支付&#xff1a;在线支付系统设计的图解教程”算起&#xff0c;陆续写了30来篇支付相关的干货。 本书是我的专栏《百图解码支付系统设计与实现》…

基于Spring Boot的校园闲置物品交易网站设计与实现

基于Spring Boot的校园闲置物品交易网站设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统功能界面图&#xff0c;在系统首页可以查看…

springboot项目组合定时器schedule注解实现定时任务

springboot项目组合定时器schedule注解实现定时任务&#xff01; 创建好springboot项目后&#xff0c;需要在启动类上增加注解开启定时器任务 下图所示&#xff1a; 增加这个注解&#xff0c;启动项目&#xff0c; package com.example.scheduledemo.util;import org.springf…

C++中的异常

目录 1.C语言传统的处理错误的方式 2. C异常概念 3. 异常的使用 3.1 异常的抛出和捕获 3.2 异常的重新抛出 3.3异常安全 3.4 异常规范 4.自定义异常体系 5.C标准库的异常体系 6.异常的优缺点 7.func&#xff08;&#xff09; throw();的方式规范化 1.C语言传统的处理…

C语言字符串(0基础到深入剖析)---字符串系列合集(函数+指针+数组)

前言 本篇旨在帮助不了解字符串或者逻辑梳理不够透彻的伙伴们理出一条脉络。选择能看懂的部分即可&#xff0c;建议收藏&#xff0c;后期学习完C语言方便回顾。 适用范围&#xff1a;0基础C语言&#xff08;刚学字符串&#xff09;- 学过函数 - 学过指针 ---大致了解了数据内…

Centos7 安装Git、使用

Centos7 安装Git 一、安装步骤1.1 查看版本1.2 卸载1.3 安装 二、创建仓库2.1 新增仓库2.2 新增配置项 三、管理文件3.1 文件创建3.2 文件修改、add、commit3.3 tree结构探索 四、分支4.1 创建分支&#xff1a;4.2 查看分支4.3 切换分支4.4 删除分支4.5 合并冲突 一、安装步骤 …

FusionMamba: Efficient Image Fusion with State Space Model【文献阅读】

论文&#xff1a;FusionMamba&#xff1a;一种基于SSM的有效图像融合方法 arXiv&#xff1a;https://arxiv.org/abs/2404.07932 作者单位&#xff1a;中国科学院自动化研究所、模式识别重点实验室、电子科技大学 推荐阅读&#xff1a;深入浅出一文图解Vision Mamba Abstract 图…

3.自动驾驶-局部路径规划

1. 规划planning 2. 局部路径规划模块实现-模块外围&#xff1a;输入 3. 局部路径规划模块实现模块外围:输出 4. 控制control 5. 系统分类 6 系统分类

C 认识指针

目录 一、取地址操作符&#xff08;&&#xff09; 二、解引用操作符&#xff08;*&#xff09; 三、指针变量 1、 指针变量的大小 2、 指针变量类型的意义 2.1 指针的解引用 2.2 指针 - 整数 2.3 调试解决疑惑 认识指针&#xff0c;指针比较害羞内敛&#xff0c;我们…

自定义SpringBoot的starter

案例需求&#xff1a;自定义redis-stater。要求当导入redis坐标时&#xff0c;SpringBoot自动创建Jedis的Bean。 实现步骤&#xff1a; 1、创建redis-spring-boot-autoconfigure模块 2、创建redis-spring-boot-starter模块&#xff0c;依赖redis-spring-boot-autoconfigure的…
最新文章