Raft集群变更:This article is all your need

news/2024/11/8 14:44:48/

Background

为了变化raft集群,我们可以选择:.停在旧配置,然后再上线新配置 。但是这个会导致整个集群变得不可用,同时手动修改也会到来问题。

所以我们采用热变更

这也导致了安全性的问题,变更过程有可能导致两个leader出现。

变更方式:

一次只变更一个

如果限制每次只变更一个节点,那么就能保证“新、旧集合的quorum集合是有重合的”,由于有重合,这样就能保证新旧两个集群的集合不会选出不同的leader,就能间接保证安全性。

证明

加入节点前    加入节点后

(n / 2 + 1 ) + (((n + 1))  / 2  + 1)

开始时是偶数:n  = 2k          k + 1 + k + 1  = 2k + 2 > 2k + 1不可能

开始时是奇数:n = 2k + 1     k + 1 + k + 2 = 2k + 3 > 2k + 2 不可能

同时变更多个,采用二阶段的策略

注意:配置日志是立即生效的,不需要等待 

Cnew和Cold的并集作为一个配置,然后把先把Cold的通过leader提交,这个配置立即生效,在提交之前的话,可能leader会fail,然后被别的Cold别的节点变成leader,然后截断日志,可能就会回退到Cold。所以说在提交之前Cold可以make decison alone。另一种情况是提交之后的话,要new和old两个分别大多数同样才能提交。那么这样的话,因为选举限制的缘故,那么新老配置都不能独立做出决定,因为肯定都是有新配置的变为leader,能看到并集的个数的,要达到并集个数的大多数才能提交。同理对于新配置,看到的是新配置的个数,有一种情况是提交失败,一种情况是提交成功,也就是意味着在新配置在新配置节点上大多数同意了,同时也意味着联合共识不可能了,保障了不会有两个leader。第一个阶段,提交并集配置到新旧大多数节点。这样保障了不会有两个leader,因为leader必然要新配置,新配置要达到并集大多数。第二阶段:提交new的配置到new的大多数节点,这样保障了之前的联合共识不可能达成,就一个leader。i
issue:(我还是好奇这个新加入节点的配置。。。,感觉是不是要没配置啊,然后等别人发给他配置才能变成candidate,不然第一阶段就有可能产生两个leader啊,希望懂哥可以在评论区指点江山)

Failover

我们来看看Joint Consensus算法,在变更过程中如果出错,是如何failover选出新leader的。

第一阶段,这时候选出来的leader只有可能有两种情况,还是旧的C_Old节点集合,或者已经收到了{C_Old,C_New}节点集合:

  • 只有C_Old节点集合的节点:由于这时候这个leader并没有第一阶段提交的{C_Old,C_New}节点集合变更,因此那些已有{C_Old,C_New}节点集合的follower这部分的日志将被截断,成员变更失败,回退回C_Old集合。
  • 有{C_Old,C_New}节点集合的节点:这意味这个leader已经有第一阶段提交的{C_Old,C_New}节点集合变更,可以继续将未完成的成员变更流程走完。

类似的,也可以去推导一下在第二阶段出现leader宕机时,选出来的leader只可能具备两种情况,但是这两种情况都不可能选出多个leader。

提交安全性

为了安全性,Raft在进行集群变更操作时,无论是“单次变更一个节点”还是“一次变更多个节点”,在不同的阶段都不能有重叠(overlap)的情况出现,因为重叠意味着可能违反前面提到的安全性。比如将一个集群节点集合从{1,2,3}变更为{1,4,5},如果使用这两种方式,步骤分别是:

  • 单次变更一个节点:{1,2,3}->{1,2,3,4} (增加节点4)->{1,2,3,4,5} (增加节点5)->{1,3,4,5} (删除节点2)-> {1,4,5} (删除节点3)。
  • 单次变更多个节点:{1,2,3}(C_Old)-> {1,2,3,4,5}({C_Old,C_New})-> {1,4,5}(C_Old,C_New)。

可以看到,无论采用哪一种方式,都会有多个步骤。由leader来决定当前的步骤,其判断的标准是:前一步修改的日志,是否已经被提交(半数以上同意)。所以,如果成员变更类的日志在提交之后才生效的话,leader就需要再多一个步骤:

  • 首先确认日志已经被提交到半数以上节点。
  • 在这之后,再确认这个成员变更已经在节点上生效。

而后面的这个确认,是可以避免的。因为根据前面failover部分的分析,无论哪一种情况出现,即便在变更的过程中leader宕机,也不会出现选出多个leader的情况。

于是,对于成员变更类的日志来说,Raft的规则是:

  • 多次提交不能重叠(overlap),即如果当前已经有还未提交的成员变更日志,在它提交之前不允许提交新的成员变更修改。
  • 成员变更的生效,无需等待提交,每个节点在收到这类日志的时候,就能马上修改本节点上的成员为最新的这个配置。

参考资料:周刊(第13期):重读Raft论文中的集群成员变更算法(一):理论篇 - codedump的网络日志


http://www.ppmy.cn/news/87538.html

相关文章

极米十年巅峰之作极米Z7X,能带走的百吋大屏

近年来,随着人们娱乐消费的升级,家用投影仪消费市场不断扩大,增长速度也非常可观。据IDC最新发布的数据显示,2022年中国投影机市场总出货量505万台,同比增长7.4%。其中,智能投影机市场(搭载有OS…

软考初级程序员上午单选题(19)

1、操作数“00000101”与“00000101”执行逻辑______操作后,运算结果应为“00000000”。 A.或 B.与 C.异或 D.非 2、下列叙述中,属于预防计算机病毒的是______。 A.将来历不明的U盘换一台计算机…

2023年第十五届“中国电机工程学会杯”全国大学生电工数学建模竞赛题目 A题:电采暖负荷参与电力系统功率调节的技术经济分析

A题:电采暖负荷参与电力系统功率调节的技术经济分析 建设以新能源为主体的新型电力系统是应对全球气候变化挑战的重要举措。高比例新能源接入导致电力系统调节能力稀缺,亟需开发新的调节资源,如火电深度调峰、建设抽水蓄能电站、配置储能和挖掘负荷中的…

前端食堂技术周刊第 83 期:TS 5.1 RC、Nuxt 3.5、INP、Knip、管理 GitHub 通知、WebXR

By Midjournery 美味值:🌟🌟🌟🌟🌟 口味:杏花乌龙拿铁 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 本期摘要 TypeScript 5.1 RCNuxt 3.5INP 将成为新的 Core Web…

CyberLink的摄像头应用程序YouCam 10.1版本在win10系统的下载与安装配置教程

目录 前言一、YouCam安装二、使用配置总结 前言 YouCam是由CyberLink公司开发的一款实用的摄像头应用程序,它集成了多种实时视频特效、背景虚化、美颜、屏幕录制等功能。 通过使用该软件内置的相机特效,用户可以将视频聊天或自拍照片变得更加精彩和有趣…

Caffeine 本地高速缓存工具类

目录 Caffeine工具类方式 SpringBoot 整合 Caffeine 缓存 (SpringCache模式) 驱逐策略 开发使用 Caffeine是一种高性能的缓存库,是基于Java 8的最佳(最优)缓存框架,性能各方面优于guava。 Caffeine工具…

逻辑回归及逻辑回归的评估指标

一、逻辑回归介绍 逻辑回归(Logistic Regression)是机器学习中的一种分类模型,逻辑回归是一种分类算法,虽然名字中带有回归,但是它与回归之间有一定的联系。由于算法的简单和高效,在实际中应用非常广泛。 1.逻辑回归的应用场景 …

hive02

查询练习 练习1 2022-08-07 1,liuyan 2,tangyan 3,jinlian 4,dalang 5,ximenqing ​ 2022-08-08 1,liuyan 2,tangyan 4,dalang 6,wusong ​ -- 创建分区表记录每天用户登陆信息 create table tb_login (uid int,name string ) partitioned by (dt string)row format delimit…