分布式---raft算法

1、Leader的选举和Failover过程

首先了解raft中节点的三种状态:

  • 1、Follower:Follower是请求的被动更新者,从Leader接收更新请求,将日志写入到本地文件
  • 2、Candidate:如果Follower在一定时间内,如果每收到Leader的心跳,则判断Leader可能已经发生了故障,此时启动Leader Election过程,本节点切换为Candidate,值到选主节点结束
  • 3、Leader:所有请求的处理者,接收客户端发起的操作请求,写入本地日之后,同步至其他Follower节点

首先刚启动时所有节点都是处于Follower状态,然后开始进行选举,看哪个节点先超过了选举的超时时间,如果超时时间内还没收到leader节点的心跳那么就会发起一个新一轮的leader节点的选举,先超时的节点会切换为Candidate候选人状态,然后为自己称为Leader投一票,然后该节点会向集群的所有节点发起一个请求进行一次拉票选取,由于目前集群中只有一个候选人状态那么其他节点收到了这个请求,就会将赞成票投给这个节点,然后各个节点就转变为Candidate状态并且也为自己+1票,然后某个Candidate节点得到的票数超过了总结点的一半,那么就会升为leader节点

即当集群中Leader节点出现故障之后,由于其他节点收不到leader节点的心跳检测,那么过了这且节点过了等待心跳的超时时间后就会发起一个leader的选取,然后得到的票数超过了半数就升级为Leader节点

2、出现“投票分裂”的时候如何选出leader节点

注意只要节点处于Candidate状态,那么就会不停的向其他节点发起拉票请求

其实投票分裂问题就是:集群中leader节点宕机了,此时集群中的某两个或多个节点同时过了等待心跳的过期时间,各自等变成Candidate节点,然后各自拉票,然后最终这两个节点收到赞同的票数相同,那么不进行省级操作,此时其他节点也超时了,由于最开始的那两个节点选不出来,因此新的Candidate节点收到的票数就超过了半数,最终升为了Leader节点

3、raft算法的日志复制过程

目前集群中只有两个健康的节点s1,s2,假设此时S1节点是主节点

注意注解点日志有两个状态:未提交、已提交

注解点只有当将日志同步到半数以上的节点后才会将对应的日志设置为已提交状态

1、刚开始时只有两个节点存活

开始同步日志:

此时其他节点恢复了:

然后s1节点会继续向s3节点发起第二条日志,s3接收到之后,除了复制第二条日志之外还会将第一个日志状态设置为已提交状态

以此往复,对于之前其他节点的已经复制的日志,在s3同步第一条日志之后,的时候主节点重新发请求,然后对应的节点就可以将状态设置为已提交状态

4、修复不一致的日志

有新的节点加入到集群,leader节点首先要做的就是一致性检查,

raft算法日志是根据leader节点的强一致性

原来得leader节点s1挂了,并且s1中有4,5两条日志未确认,此时集群做新的一轮leader选取

此时s2先超时然后开始发起leader投票,最终选为leader节点,

再然后s4节点恢复了,那么对于新节点加入集群,leader节点都会进行一个一致性检查,检查后会从最大下标(leader箭头处)开始往前找,看看有没同步的日志,找到未同步的位置之后,就开始进行日志的复制

再然后此时主节点s2新产生了日志图中得3并且提交了,此时原来的s1恢复了,那么此时回复的节点由于不是主节点了,所以会接收leader节点的一致性检查(新加入节点从当前leader节点得最大下标处开始往前检查),然后将日志同步为当前leader节点的(leader节点的强一致性)

5、如何保证数据安全性

Candidate节点发起投票的时候会比较term和index得值

如果这些follower节点发现自己的term和index比candidate节点的新,那么就投反对票

如下图:原来S2节点向所有节点发起心跳机制后宕机了,此时s5节点刚好恢复了,那么接收到心跳之后,返回消息给s3但由于s3宕机了,所以此时没有leader节点,此时s5等待心跳检测的时间过期了,那么s5称为candidate节点发起新一轮的投票,但是其他节点收到之后会进行1、term比较,和index(每个节点当前日志的最大下标),如果小于follower节点,那么投反对票,因此s5没资格当leader(这是因为其他节点都同步日志了,现在一个新兵蛋子啥也么有,如果当了leader那么根据leader日志的强一致性会同步leader的日志,那么之前其他节点的日志就会被覆盖掉)

因此又开始新的一轮leader选举最终s1当选

总结选举规则

1、首选根据term值来选举,term值越高越优先仙居

2、如果term相同,那么当选index最大最新的哪一个

3、选举leader节点之后,或者有新节点加入集群之后,会进行一个leader节点的强一致性检查同步

参考视频:动画:Raft算法Leader选举、脑裂后选举、日志复制、修复不一致日志和数据安全_哔哩哔哩_bilibili

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

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

相关文章

uniapp 获取签名证书 SHA1 自有证书签名打包

1.登录你的Dcloud 账户 2.找到我的应用菜单 3.点开某个应用 4.查看证书详情,里面有SHA1 和别名,密码,下载证书用于云打包,可以选择自有证书,输入别名,密码打包

GPT+Python)近红外光谱数据分析与定性/定量建模技巧

2022年11月30日,可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5,将人工智能的发展推向了一个新的高度。2023年4月,更强版本的ChatGPT4.0上线,文本、语音、图像等多模态交互方式使其在…

高效实现用友BIP与旺店通数据无缝对接

用友BIP与旺店通企业奇门的YS其他入库单数据集成方案 在企业日常运营中,数据的高效流转和准确对接是确保业务顺畅运行的关键。本文将分享一个具体的系统对接案例,即如何将用友BIP平台中的YS其他入库单数据集成到旺店通企业奇门中,实现两大系…

简历修订与求职经历 - Chap05

现在是又一个周一。上周最值得记录的有这么几件事: 1.拿到了D照。 周二科目一,周四科目二三四联考——是打算为逆行人生准备的。有备无患。然后拿到驾照后发现又有一些问题。看了honda的125,感觉车身好胖。我不喜欢这类很胖的车。然后按照驾…

光伏行业如何借助ERP领跑绿色经济?

在全球能源结构转型和绿色能源转型的大背景下,现在光伏行业呈现出技术创新、市场需求扩大、产能调整和竞争加剧等特点,也预示行业的持续成长和未来的发展潜力。但企业仍然需要不断提高技术水平和管理水平以应对激烈的市场竞争,SAP ERP制定符合…

Maven基于构建阶段分析多余的依赖

基于构建阶段 test compile 实现依赖分析 执行maven 命令: mvn dependency:analyze 关注:Maven-dependency-plugin 分析结果: [INFO] --- maven-dependency-plugin:2.10:analyze (default-cli) impl --- 配置依赖未使用的依赖项: [INFO] --- maven-dependency-…

Lucas带你手撕机器学习——线性回归

什么是线性回归 线性回归是机器学习中的基础算法之一,用于预测一个连续的输出值。它假设输入特征与输出值之间的关系是线性关系,即目标变量是输入变量的线性组合。我们可以从代码实现的角度来学习线性回归,包括如何使用 Python 进行简单的线…

git的安装以及入门使用

文章目录 git的安装以及入门使用什么是git?git安装git官网 git初始化配置使用方式初始化配置: git的安装以及入门使用 什么是git? Git 是一个免费开源的分布式版本控制系统,使用特殊的仓库数据库记录文件变化。它记录每个文件的…

WebGl 使用uniform变量动态修改点的颜色

在WebGL中,uniform变量用于在顶点着色器和片元着色器之间传递全局状态信息,这些信息在渲染过程中不会随着顶点的变化而变化。uniform变量可以用来设置变换矩阵、光照参数、材料属性等。由于它们在整个渲染过程中共享,因此可以被所有使用该着色…

嵌入式linux系统中多路复用和信号驱动实现

大家好,今天主要给大家分享一下,如何使用linux系统中的多路复用和信号驱动的功能实现。 第一:linux多路复用基本特点 当应用程序同时处理多路数据的输入或输出时,若采用非阻塞模式,将达不到预期的效果 如果采用非阻塞模式,对多个输入进行轮询可以实现,但CPU的消耗非常大…

【设计模式系列】装饰器模式

目录 一、什么是装饰器模式 二、装饰器模式中的角色 三、装饰器模式的典型应用场景 四、装饰器模式在BufferedReader中的应用 一、什么是装饰器模式 装饰器模式是一种结构型设计模式,用于在不修改对象自身的基础上,通过创建一个或多个装饰类来给对象…

黑马 | Reids | 基础篇

黑马reids基础篇 文章目录 黑马reids基础篇一.初始Redis1.1SQL 和 NoSql的区别1.1.1结构化和非结构化1.1.2关联和非关联1.1.3查询方式1.1.4 事务1.1.5总结 1.2 认识Redis1.3 Redis安装启动默认启动:后台启动:开机自启 1.4 Redis客户端1.4.1.Redis命令行客…

windows安装mysql,跳过自定义的密码验证

1、mysql版本8 2、配置系统环境变量 3、新建my.ini文件在mysql目录下,需要指定data目录 [mysqld] # 设置3306端口 port3306# 自定义设置mysql的安装目录,即解压mysql压缩包的目录 basedirD:\hjl\app\mysql\mysql-8.0.33-winx64# 自定义设置mysql数据…

24/10/14 算法笔记 循环神经网络RNN

RNN: 一种专门用于处理序列数据的神经网络,它能够捕捉时间序列中的动态特征。RNN的核心特点是其循环连接,这允许网络在不同时间步之间传递信息,从而实现对序列数据的记忆和处理能力。 应用的场景: 自然语言处理(NLP&…

[241021] X-CMD 内测版 v0.4.12 新功能: starship ohmyposh ping tping docker ascii

目录 X-CMD 发布内测版 v0.4.12📃Changelog🎨 starship🎨 ohmyposh🎨 theme🌐 ping🌐 tping🐋 docker💻 mac - 集成 MacOS 实用功能🔄 ascii🦖 deno&#x1f…

探索秘境:如何使用智能体插件打造专属的小众旅游助手『小众旅游探险家』

文章目录 摘要引言智能体介绍和亮点展示介绍亮点展示 已发布智能体运行效果智能体创意想法创意想法创意实现路径拆解 如何制作智能体可能会遇到的几个问题快速调优指南总结未来展望 摘要 本文将详细介绍如何使用智能体平台开发一款名为“小众旅游探险家”的旅游智能体。通过这…

怎么设置打别人电话显示自己公司名称?

在日常生活中,想必许多人都曾接到过显示公司名称的来电。相较于常规的电话号码,这类带有企业信息的来电无疑更具可信度,让人更愿意接听。在这个骚扰电话和推销电话泛滥、信任缺失的现代社会,这些能够自证身份的电话号码就像是一张…

职场经验:如何封装自动化测试框架?

封装自动化测试框架,测试人员不用关注框架的底层实现,根据指定的规则进行测试用例的创建、执行即可,这样就降低了自动化测试门槛,能解放出更多的人力去做更深入的测试工作。 本篇文章就来介绍下,如何封装自动化测试框…

filebeat接入nginx和mysql获取日志

下载nginx (1) 直接下载 yum install nginx -y(2)查看状态启动 systemctl start nginx systemctl status nginx(3)配置文件检查 nginx -t(4)端口检查 netstat -tulpn | grep :80&am…

Linux系统:配置Apache支持CGI(Ubuntu)

配置Apache支持CGI 根据以下步骤配置,实现Apache支持CGI 安装Apache: 可参照文章: Ubuntu安装Apache教程。执行以下命令,修改Apache2配置文件000-default.conf: sudo vim /etc/apache2/sites-enabled/000-default.con…