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

news2025/1/16 15:48:31

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.coloradmin.cn/o/557342.html

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

相关文章

miniconda安装+pycharm安装

miniconda安装pycharm安装 1.miniconda安装2.pycharm安装3.pycharm环境配置 1.miniconda安装 miniconda下载路径:https://docs.conda.io/en/latest/miniconda.html 打开后选择对应的电脑系统及python版本下载 下载完成后双击运行 选择安装路径,记住安装…

SpringCloud Eureka 的详细讲解及示意图

目录 SpringCloud Eureka 服务注册与发现 Spring Cloud 组件选型- 图 当前项目架构问题分析-引出Eureka 一图胜千言 问题分析 引入Eureka 项目架构 解读上图 Eureka采用了 CS 的设计架构, 创建单机Eureka Server-注册中心 创建e-commerce-eureka-server-90…

【深度学习】- 作业3: CIFAR10图像分类

课程链接: 清华大学驭风计划 代码仓库:Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的,其分为四门课,包括: 机器学习(张敏教授) , 深度学习(胡晓林教授), 计算…

【数据结构与算法】- 周测三

课程链接: 清华大学驭风计划 代码仓库:Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的,其分为四门课,包括: 机器学习(张敏教授) , 深度学习(胡晓林教授), 计算…

【瑞萨RA_FSP】UART 编程实战

文章目录 一、UART收发回显二、UART指令控制RGB灯三、基于环形队列的UART收发回显 一、UART收发回显 UART只需两根信号线即可完成双向通信,对硬件要求低,使得很多模块都预留UART接口来实现与其他模块或者控制器进行数据传输, 比如GSM模块&am…

【Unity3D】反射和折射

1 前言 立方体纹理(Cubemap)和天空盒子(Skybox)中介绍了生成立方体纹理和制作天空盒子的方法,本文将使用立方体纹理进行采样,实现反射和折射效果。 立方体纹理采样原理:从世界坐标系的坐标原点出…

深入printf

目录 printf的定义 printf的使用 函数说明 说明符(specifier) flags(标志) width(最小宽度) .precision(精度) length(类型长度) 转义序列 printf的…

linux(软硬链接)

目录: 1.软连接 2.硬链接 ----------------------------------------------------------------------------------------------------------------------------- 1.软连接 linux当中有两个概念,一个是软连接,一个是硬链接,在学习…

Golang每日一练(leetDay0074) 词典类设计、单词搜索II

目录 211. 添加与搜索单词 - 数据结构设计 Design-add-and-search-words-data-structure 🌟🌟 212. 单词搜索 II Word Search ii 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golan…

基于C#和Blazor开发的前后端分离框架

Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行。 开源地址 https://gitee.com/known/Known 开发环境 .NET 7VS2022 概述 基于C#和Blazor实现的快速开发框架,前后端分离…

【深度学习】- 作业4: 脑部MRI(核磁共振)图像分别

课程链接: 清华大学驭风计划 代码仓库:Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的,其分为四门课,包括: 机器学习(张敏教授) , 深度学习(胡晓林教授), 计算…

【数据结构与算法】- 周测四

课程链接: 清华大学驭风计划 代码仓库:Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的,其分为四门课,包括: 机器学习(张敏教授) , 深度学习(胡晓林教授), 计算…

三、尚医通医院管理实现

文章目录 三、医院管理实现1、医院列表1.1 医院列表api接口1.1.1 添加service分页接口与实现1.1.2 添加controller方法 1.2 service-cmn模块提供接口1.2.1添加service接口与实现1.2.2添加controller方法 1.3封装Feign服务调用1.3.1搭建service-client父模块1.3.2 搭建service-c…

微生物实验之分菌(细菌)

文章目录 1. 采集实验样本2. 对实验样本进行处理1. 土壤样本的处理2. 植物内生菌样本的处理 3. 接种4. 分离纯化5. 测16s6. 测全基因组7. 保藏菌株 分离细菌菌株 (分菌) 是微生物学实验中,很重要的一环,对于微生物资源来说尤为重要。分菌主要包含以下几个…

人工智能CNN 卷积神经网络结构(tensorflow代码实现)

MNIST是一个简单的视觉计算数据集,它是像下面这样手写的数字图片: MNIST 通过上期的分享,我们了解了手写数字识别的基本原理以及CNN卷积神经网络的基本原理,本期我们结合MNIST数据集,来用代码来实现CNN。(手写数字识别是TensorFlow人工智能最基础的案例,这个跟学习编程…

删除表单(form)元素中的某一个数据项操作实现

问题 对于表单(form)元素,只支持POST请求。若是需要删除表单(form)元素中的某一个数据项,最为严谨的方式是采用POST请求, 对于表单元素,如何转换为DELETE请求 详细问题 对于表单元…

AC规则-2

基于RAM的远程接口 安全元件的访问规则可以通过远程应用程序管理 (RAM) 更新命令进行管理。 因此,ARA-M 和 ARA-C 各自提供一个远程接口,允许在 ARA 中存储或删除访问规则。 访问控制数据的任何远程管理都应仅通过 [GP 卡规范] 定义的安全通道协议来完成…

『树莓派云台机器人』01. 使用手机控制机器人

目录 1. 检查是否已经开机,连接机器人wifi2. 安装树莓派控制app应用,直连模式连接机器人3. 机器人功能实现总结 欢迎关注 『树莓派云台机器人』 博客,持续更新中 欢迎关注 『树莓派云台机器人』 博客,持续更新中 动手组装等步骤请…

chatgpt赋能Python-python_erode

Python Erode:用Python实现图像腐蚀 图像处理是人工智能领域的重要分支,Python是一种广泛应用于机器学习和深度学习的编程语言,也是图像处理领域的主要开发语言之一。在Python中,我们可以使用许多不同的库和工具来处理图像。其中…

深入理解Java虚拟机:JVM高级特性与最佳实践-总结-9

深入理解Java虚拟机:JVM高级特性与最佳实践-总结-9 虚拟机类加载机制类加载的过程准备解析字段解析 方法解析接口方法解析 虚拟机类加载机制 类加载的过程 准备 准备阶段是正式为类中定义的变量(即静态变量,被static修饰的变量&#xff09…