分布式与一致性协议之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.mzph.cn/diannao/5806.shtml

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

相关文章

基于Springboot的大学生社团活动平台

基于SpringbootVue的大学生社团活动平台设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录 首页 社团信息 社团活动 社团论坛 社团资讯 后台登录 后台首页 学生管理 社…

医疗大模型华佗GPT-2:医学问答超越GPT-4,通过2023年国家执业药师考试

前言 随着人工智能技术的快速发展,特别是在自然语言处理(NLP)领域,大型预训练模型如GPT系列已经显示出在多个领域的强大应用潜力。最近,华佗GPT-2医疗大模型的发布,不仅标志着人工智能在医学领域的一大进步,更是在202…

Mybatis逆向工程的2种方法,一键高效快速生成Pojo、Mapper、XML,摆脱大量重复开发

一、写在开头 最近一直在更新《Java成长计划》这个专栏,主要是Java全流程学习的一个记录,目前已经更新到Java并发多线程部分,后续会继续更新;而今天准备开设一个全新的专栏 《EfficientFarm》。 EfficientFarm:高效农…

eaapp账号注销怎么操作 简单几步完成ea账号注销

eaapp账号注销怎么操作 简单几步完成ea账号注销 有许多玩家在注册ea平台账户的时候,会出现账号输错,地区选择错误等问题,导致自己没有注册成功心仪的账号,想要将账号注销却又不知道该如何操作,今天小编就为大家带来详…

mac idea 下载spring 源码遇到的问题

一、Kotlin: warnings found and -Werror specified 这个问题网上看了很多文章多说是缺少cglib、objenesis包。然后执行了 实际还是没有什么用 解决: 最后自己看了一下前面一个警告。说的就是版本太低。所以我觉得是这个前置问题导致的 然后搜索了改这个Kotlin版本…

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

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

C++-5

完成特殊成员函数 #include <iostream>using namespace std;class Person {string name;int *age; public://构造&#xff0c;析构&#xff0c;拷贝构造&#xff0c;拷贝赋值Person():age(new int ){}Person(int *age,string name):name(name),age(new int (*(age))){}~…

unity制作app(2)--主界面

1.先跳转过来&#xff0c;做一个空壳&#xff01;新增场景main为4号场景&#xff01; 2.登录成功跳转到四号场景&#xff01; 2.在main场景中新建canvas&#xff0c;不同的状态计划用不同的panel来设计&#xff01; 增加canvas和底图image 3.突然输不出来中文了&#xff0c;浪…

【C语言加油站】字符函数与字符串函数

字符函数与字符串函数 导言一、字符分类函数1.1 字符分类函数的用法 二、字符转换函数2.1 字符转换函数的用法 三、字符串函数3.1 成员3.2 strlen函数3.2.1 size_t类型3.2.2 strlen的易错点3.2.2 strlen的使用3.2.3 strlen与sizeof 3.3 strcpy函数和strncpy函数3.3.1 strcpy和s…

unity 专项一 localPosition与anchoredPosition(3D)的区别

一 、RectTransform 概念 1、RectTransform继承自Transform&#xff0c;用于描述矩形的坐标(Position)&#xff0c;尺寸(Size)&#xff0c;锚点(anchor)和中心点(pivot)等信息&#xff0c;每个2D布局下的元素都会自动生成该组件。 2、当我们在处理UI组件时&#xff0c;往往容易…

VTK 的可视化方法:Glyph

VTK 的可视化方法&#xff1a;Glyph VTK 的可视化方法&#xff1a;Glyph标量、向量、张量将多边形数据的采集点法向量标记成锥形符号参考 VTK 的可视化方法&#xff1a;Glyph 模型的法向量数据是向量数据&#xff0c;因此法向量不能像前面讲到的通过颜色映射来显示。但是可以通…

【计算机网络】网络层总结

目录 知识梗概 IP地址 子网划分 IP包头格式 路由 网络层协议 ARP病毒/ARP欺骗 知识梗概 IP地址 IP相关介绍&#xff1a;机器之间需要交流&#xff0c;必须要一个地址才能找到对应的主机&#xff0c;IP地址是主机的一种表示&#xff0c;保证主机之间的正常通信&#xff…

LabVIEW高效目标跟踪系统

LabVIEW高效目标跟踪系统 随着机器视觉技术的飞速发展&#xff0c;设计和实现高效的目标跟踪系统成为了众多领域关注的焦点。基于LabVIEW平台&#xff0c;结合NI Vision机器视觉库&#xff0c;开发了一种既高效又灵活的目标跟踪系统。通过面向对象编程方法和队列消息处理器程序…

File contains parsing errors: file:///etc/yum.repos.d/nginx.repo报错解决,文件配置出现问题

执行yum指令出现以下错误&#xff1a; 解决方案&#xff1a;yum的配置文件出现问题&#xff0c; 先删除yum.repos.d目录下所有文件 rm -f /etc/yum.repos.d/* 然后重新下载阿里的资源 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.…

无人机+大载重+长航时:油电混动多旋翼无人机技术详解

多旋翼无人机是一种具有三个及以上旋翼轴的特殊的无人驾驶旋翼飞行器。具有稳定性强、操控简单、勤务性高、价格便宜等优势&#xff0c;因此在市场上的应用非常广泛。此外&#xff0c;利用地面供电的绳系多旋翼通过电缆向多旋翼持续传输电能&#xff0c;可以大大提高多旋翼的空…

【Java EE】MyBatis使用注解操作数据库

文章目录 &#x1f340;参数传递&#x1f334;增(Insert)&#x1f338;返回主键 &#x1f343;删(Delete)&#x1f333;改(Update)&#x1f332;查(Select)&#x1f338;起别名&#x1f338;结果映射&#x1f338;开启驼峰命名(推荐) ⭕总结 &#x1f340;参数传递 需求: 查找…

邊緣智能2024—AI開發者峰會(5月9日)數碼港即將啟幕

隨著 AI &#xff08;人工智能&#xff09;技術的飛速發展&#xff0c;我們正迎來邊緣計算智能化與分布式AI深度融合的新時代&#xff0c;共同演繹分布式智能創新應用的壯麗篇章。"邊緣智能2024 - AI開發者峰會"將聚焦於這一前沿領域&#xff0c;探討如何通過邊緣計算…

网络安全知识点

网络安全 1&#xff0e; 网络安全的定义&#xff0c;网络安全的属性。 定义&#xff1a;针对各种网络安全威胁研究其安全策略和机制&#xff0c;通过防护、检测和响应&#xff0c;确保网络系统及数据的安全性。 属性&#xff1a;机密性 认证&#xff08;可鉴别性&#xff09…

启发式搜索算法4 -遗传算法实战:吊死鬼游戏

相关文章: 启发式搜索算法1 – 最佳优先搜索算法 启发式搜索算法2 – A*算法 启发式搜索算法2 – 遗传算法 有一个小游戏叫吊死鬼游戏&#xff08;hangman&#xff09;&#xff0c;在学习英语的时候&#xff0c;大家有可能在课堂上玩过。老师给定一个英文单词&#xff0c;同学们…

第 8 章 机器人平台设计(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 学习到当前阶段大家对ROS已经有一定的认知了&#xff0c;但是之前的内容更偏理论&#xff0c;尤其是介绍完第6…