Raft算法

内容出自 : https://www.bilibili.com/video/BV1eL411578r/?spm_id_from=333.337.search-card.all.click

raft具备良好的容错能力,能够在系统出现复杂的故障时依旧能够保证数据的一致性

能够继续对外提供服务

在raft协议中,分布式系统的每个节点有三个状态

跟随者状态

候选者状态

领导者状态

系统中所有的节点都从跟随者开始

如果跟随者没有接收到领导者的消息,那么就会变为候选者状态

当节点成为候选者后,会通过网络消息请求其他节点投票

其他节点接收到投票请求后,会回复投票

候选者节点拿到的投票超过半数时会变成领导者,这个过程就叫做领导选举

随后,系统中所有的事务操作都会通过领导者来操作

假设客户端对分布式节点的数据进行更新.客户端会把写请求发送到分布式节点中的领导者,

领导者会把该事务操作作为一条新的表象,写入到本地日志 注意 这个事务操作只是被添加到日志表象

但并未被提交执行,所以并不会更新节点数据的值

为了提交这个操作,领导者会复制这个事务操作发给所有跟随者状态,此时领导者进入到等待状态,

直到大多数节点将该操作写入到各自本地日志,并且收到这些节点的确认消息,此刻领导者的这个事务操作就

能够真正提交了。随后领导者执行的数据被更新,并且通知所有跟随者这条事务操作已经提交执行,收到消息后跟随者也会提交刚才执行的事务操作,将数据更新。此刻数据的状态就达成一致了。这个流程操作就叫做日志复制

在raft中我们通过设置两个定时器来进行选举,

1.选举计时器(选举计时器的时长控制了一个节点从跟随者等到成为候选者的时间)

选举计时器被随机初始化为150毫秒~300毫秒之前

当一个跟随者节点的选举计时器超时,跟随者就会变成候选者,并且发起一个新德选举周期

周期号位1 term = 1 会给自己投 此时vote count = 1

同时会发送请求给其他节点 发送时会携带节点的周期号(term)

如果接收到消息的节点在这个周期内还没有投过票 就会给这个候选者投票

然后并重启自己的选举计时器,重新执行。一旦该候选者收到了多个节点的赞成票

就会变为领导者,随后领导者会周期性的发送日志增量表象给跟随者,这个也被称为心跳信息

这些增量表象和心跳信息它们的间隔长短由心跳计时器来控制,

跟随者收到增量表象后会回复确认给领导者。这个选举周期会一直持续不变。直到

有某个跟随者在心跳计时器超时之内都没有收到领导者的心跳信息,这个跟随者就会转换为候选者状态

重新发起选举

假设此时有三个节点

node1 node2 node3 node3为leader

此时node3挂了

node1在心跳计时器超时内都没有接收到领导者的心跳信息此时呢会转换为候选者

发起新的一轮选举。 会将投票请求发送给node2 此时node1获得了node2的投票也获得到了自己的

一票 得票数超过半数,此时会变为领导者

但是如果node1 node2同时超时,都会转换为候选者

此时会出现分票问题

raft协议如何处理分票情况呢?

假设node1 node2 node3 node4 4个节点

node1 node2心跳计时器超时 同时变成了候选者状态

并且都发起了投票操作,那么就有可能他俩获取的票数都无法满足半数机制,那么

还会重新发起投票操作,直至选出leader为止

一旦系统中选出了一个领导者 我们需要把之前所有系统中间发生的操作变动复制给所有节点,从而保证所有节点的数据一致性。

这个过程是通过日志增量表象来完成的,日志增量表象同时也用作为节点之间的心跳消息

如果因为网络出现故障 会出现什么情况呢?

node1 node2 node3 node4 node5 node5是领导者

因为网络出现故障部分节点无法通信

node1 node2 nod3成了一组

node4 node5成了一组 并且呢 原leader是node5

那么此时呢 node1 node2 node3会因为接收不到领导者的心跳 然后重新选举出来一个leader(node1)

此刻中网络中就有两个领导者了 并且处于不同的选举(term)周期

假设此时有两个客户端

clientA clientB

clientA像node1发起节点更新操作 更新为3 因为node1这一组呢 拥有多数节点 所以会写入成功

clientB像node5发起节点更新操作 更新为5 node5这一组因为节点没有超过半数,所以写入的数据是

未提交的状态

此刻 两组网络中的节点数据会发生不一致

随后网络故障恢复了 整个分布式系统中出现了两个leader

谁的选举周期高(term)谁就是leader 周期低的会主动变成跟随者

并且会撤回之前没有提交的数据,并将自己的操作日志与新领导的操作日志更新匹配

更新自己的日志数据 从而保证数据的一致性

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

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

相关文章

Qemu 之安装(源码安装)

Qemu 之安装 Qemu 有两种安装方式: apt 下载二进制文件,可以直接用,但是换版本、卸载等比较麻烦源码编译安装,需要一定的配置,但是自由度比较高 这里主要介绍源码编译安装的方式: 0、安装依赖 这部分参…

AboutAndroid 多语种适配框架,兼容高版本,适配第三方库语种

语种切换框架 项目地址:Github 可以扫码下载 Demo 进行演示或者测试,如果扫码下载不了的,点击此处可直接下载 集成步骤 如果你的项目 Gradle 配置是在 7.0 以下,需要在 build.gradle 文件中加入 allprojects {repositories {…

微服务介绍

背景 微服务是什么?杜克大学教授DanAriely说过一段非常出名的话,用来表述Big Data的发展现状。我觉得把这句话放到微服务身上也极其贴切。 Micro-services is like teenage sex: Everyone talks about it, nobody really knows how to do it, everyo ne thinks ev…

excel(vab)删除空行

删除第一、二、三列位空的所有行(8000)行范围以内 代码如下: Sub Macro1()Dim hang As Integer For hang 8000 To 1 Step -1If Sheet1.Cells(hang, 1) "" And Sheet1.Cells(hang, 2) "" And Sheet1.Cells(hang, 3) "&quo…

系统性学习vue-vue中的ajax

vue中的ajax 配置代理常用发送Ajax请求方式跨域方式一方式二 vue-resource插槽默认插槽具名插槽作用域插槽 配置代理 常用发送Ajax请求方式 xhr new XMLHttpRequest() 在真正开发中不常用,比较麻烦jQuery 封装了xhraxios 封装了xhr 与jQuery相比优势是&#xff1a…

怎样才能找到合适的产品说明书模板 方法献上

制作一份专业而吸引人的产品手册对于企业来说至关重要。然而,对于许多企业和个人而言,制作产品手册可能是一个挑战,因为需要一定的设计和排版能力。为了帮助大家更轻松地制作出优质的产品手册,下面将向大家推荐三款优秀的产品手册…

大物小练-判断题题解

一、判断题 1.检验电荷受到的电场力F方向就是电场强度E的方向。( B) A对 B错 解释:场强E的切线方向才和受力F的方向相同 2.电容器电容的大小与导体的形状、相对位置、其间的电介质有关,与其所带的电荷量无关。A A对 B错 解释…

Ovtio不同版本下载

关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material , 更 \color{red}{更} 更 多 \color{blue}{多} 多 精 \color{orange}{精} 精 彩 \color{green}{彩} 彩! 主要专栏内容包括: †《LAMMPS小技巧》: ‾ \textbf…

2024年汉字小达人区级选拔备考——附加题:汉字和国学常识

上海的孩子们已经率先开启了悠长的寒假生活。在寒假期间,除了完成寒假生活、学校安排和要求外,还可以做些什么呢?不妨来为2024年汉字小达人做些准备吧!每天花个15分钟左右,背一背、做一做,轻松掌握汉字小达…

翻译: Streamlit从入门到精通 构建一个机器学习应用程序 三

Streamlit从入门到精通 系列: 翻译: Streamlit从入门到精通 基础控件 一翻译: Streamlit从入门到精通 显示图表Graphs 地图Map 主题Themes 二 1. 构建一个机器学习应用程序 在这一部分,我将带你了解我做的一个关于贷款预测的项目。 贷款的主要利润直…

“15个必备的自动化测试工具,助你构建2024年的自动化策略!“

以下为作者观点: 如何选择正确的自动化测试工具?自动化测试工具是旨在通过自动化测试脚本验证功能或非功能软件需求的应用程序,帮助加快发布速度、提高项目质量并强化成果。 自动化测试工具可以帮助开发测试人员轻松创建、运行和维护测试&a…

opencv_模型训练

文件夹 opencv训练文件 xml negdataposdata 说明 negdata目录: 放负样本的目录 posdata目录: 放正样本的目录 xml目录: 新建的一个目录,为之后存放分类器文件使用 neg.txt: 负样本路径列表 pos.txt: 正样本路径列表 pos.vec: 后续自动生成…

PlatformIO中ESP8266使用GxEPD库和U8G2库驱动 2.9寸黑白墨水屏显示中文

Content 0. 前言1. 安装platformIO环境2. 新建工程3. 添加外部库4. 修改U8g2_for_Adafruit_GFX库5. 代码和烧录 0. 前言 墨水屏是黄鱼淘的,效果还不错。 U8G2库一直编译不进去,显示汉字始终不太美观,个人一直不太喜欢汉字取模的方法&#x…

linux根据服务名称查服务文件夹路径

ps -ef |grep java| grep -v grep | awk { print $2 } -e 显示所有进程。 -f 全格式。 grep -v grep是在Linux系统的某些时刻下查看进程的命令,它的作用是排除grep进程本身。 启动: #!/usr/bin/bash PID$(ps -ef | grep serverName | grep -v gr…

【RabbitMQ】RabbitMQ高级:死信队列和延迟队列

目录 设置TTL(过期时间)概述RabbitMQ使用TTL原生API案例springboot案例 死信队列概述原生API案例springboot案例 延迟队列概述插件实现延迟队列安装插件代码 TTL实现延迟队列实现延迟队列优化 设置TTL(过期时间) 概述 在电商平台…

Komodor:Kubernetes 监控工具全面指南

为了方便起见,Komodor 提供了一个简单的 Web 界面,以帮助您监控 Kubernetes 集群的状态。它拥有付费和免费增值计划,除了在出现问题时通知用户外,还拥有一系列方便的工具,用于跟踪和管理集群中部署的资源的状态。让我们…

计算机网络 应用层

文章目录 应用层域名系统 DNS域名系统概述互联网的域名结构域名服务器 文件传送协议FTP 概述FTP 的基本工作原理简单文件传送协议 TFTP 远程终端协议 TELNET万维网 WWW统一资源定位符 URL超文本传送协议 HTTP万维网的信息检索系统 电子邮件电子邮件概述简单邮件传送协议 SMTP邮…

2024年机器人和人工智能将通过4种方式改变行业

文 | BFT机器人 前言: 2023年是人工智能界充满创造性和突破性的一年,包括生成式人工智能在内的人工智能 (AI) 技术的出现引起了全球的关注并占据了头条新闻。然而,生成式人工智能在企业中的应用仍处于早期阶段,如何最好地利用这项…

大物②练习题解

1.【单选题】关于磁场中磁通量,下面说法正确的是( D) A、穿过闭合曲面的总磁通量不一定为零 B、磁感线从闭合曲面内穿出,磁通量为负 C、磁感线从闭合曲面内穿入,磁通量为正D、穿过闭合曲面的总磁通量一定为零 磁感线从…

“轻松粘贴,高效办公:自动粘贴文本技术让您事半功倍

"在快节奏的现代工作中,时间就是金钱。使用自动粘贴文本技术,让您告别繁琐的手动操作,提高工作效率。一键粘贴,释放您的双手,让您专注于创作和思考。让工作更高效,生活更精彩!" 首先…