分布式与一致性协议之Raft算法(四)

Raft算法

Raft是如何解决成员变更问题的

在日常工作中,你可能会遇到服务器故障的情况,这时你需要替换集群中的服务器。如果遇到需要改变数据副本数的情况,则需要增加或移除集群中的服务器。总的来说,在日常工作中,集群中的服务器数量是会发生变化的。也许你会问,Raft算法是共识算法,它对集群成员进行变更时(比如增加2台服务器),会不会因为集群分裂出现两个领导者呢?在我看来,的确会出现这个问题,因为Raft算法的领导者选举是建立在"大多数"的基础之上,那么当成员变更,集群成员发生变化时,就可能同时存在新旧配置的两个"大多数",出现两个领导者,从而破坏了Raft集群的领导者唯一性,影响了集群的运行。成员变更不仅是Raft算法中比较难理解也非常重要的一部分,而且是Raft算法中唯一被优化和改进的部分。比如,最初成员变更的是联合共识(Joint Consensus),但这个方法实现起来很难,后来Raft算法的作者就提出了一种改进后的方法,单节点变更(single-server change).

在分析之前,我们先介绍以下"配置"这个词。配置是成员变更中一个非常重要的概念,可以这样理解:配置用于说明集群由哪些节点组成,是集群各节点地址信息的集合。比如节点A、B、C组成的集群配置就是【A,B,C】集合。
假设有一个由节点A、B、C组成的Raft集群,现在我们需要增加数据副本数。即增加两个副本(也就是增加两台服务器),扩展为由节点A、B、C、D、E这5个节点组成的新集群,如图所示。那么在集群配置变更时,Raft算法是如何保障集群稳定运行,而不出现两个领导者呢?老话说的好,认识问题,才能解决问题。为了更好地理解单节点变更地方法,我们先来看一看成员变更时到底会出现什么样的问题
在这里插入图片描述

成员变更问题

在我看来,上图所示的集群中进行成员变更的最大风险是,可能会同时出现两个领导者。比如在进行成员变更时,节点A、B、C之间发生了分区错误,节点A、B组成旧配置中的"大多数",也就是变更前的3节点集群中的"大多数",那么这时的领导者(节点A)依旧是领导者。然后,节点C和新节点D、E组成了新配置的"大多数",也就是变更后的5节点集群中的"大多数",它们可能会选举出新的领导者(比如节点C)。那么这时旧出现了同时存在两个领导者的情况,如图所示
在这里插入图片描述

两个领导者违背了"领导者的唯一性"的原则,进而影响到集群的稳定运行。如何解决这个问题呢?也许有人想到下面这种解决办法。
集群在启动时的配置是固定的,不存在成员变更,此时,Raft算法的领导者选举能保证只有一个领导者,也就是说,这时不会出现多个领导者的问题,那么我们是否可以先将集群关闭再启动新集群,即先关闭节点A、B、C组成的集群,待成员变更后,再启动由节点A、B、C、D、E组成的新集群?
在我看来,这个方法不可行。为什么呢?因为每次变更都要重启集群,意味着在集群变更期间服务不可用,这势必会影响用户体验。想象以下,你正在玩王者荣耀,但时不时会受到系统弹出的对话框,通知你,系统升级,游戏暂停3分钟。这种体验糟糕不糟糕?既然这种办法影响用户体验,根本行不通,那应该怎样解决成员变更的问题呢?最常用的方法就是单节点变更。

注意。
成员变更的问题主要在于成员变更时,可能存在新旧配置的两个"大多数",导致集群中同时出现两个领导者,破坏了Raft算法的领导者的唯一性原则,影响了集群的稳定运行

如何通过单节点变更解决成员变更问题

单节点变更就是通过一次变更一个节点实现成员变更。如果需要变更多个节点,则需要执行多次单节点变更。比如在将3节点集群扩容为5节点集群时,你需要执行两次单节点变更,先将3节点集群变更为4节点集群,再将4节点集群变更为5节点集群,如图所示。
在这里插入图片描述

让我们回到前面的思考题,看看如何通过单节点变更的方法解决成员变更的问题。为了演示方便,我们假设节点A是领导者,如图所示。
在这里插入图片描述

目前的集群配置为【A,B,C】,我们先向集群中加入节点D,这意味着新配置为【A,B,C,D】。具体实现步骤如下:

  • 1.第一步,领导者(节点A)向新节点(节点D)同步数据
  • 2.第二步,领导者(节点A)将新配置【A,B,C,D】作为一个日志项复制到新配置中的所有节点(节点A、B、C、D)上,然后将新配置的日志项应用到本地状态机,完成单节点变更,如图所示。
    在这里插入图片描述

变更完成后,集群配置变为【A,B,C,D】,我们再向集群中加入节点E,也就是说,新配置为【A,B,C,D,E】。具体实现步骤与上面类似。

  • 1.第一步,领导者(节点A)向新节点(节点E)同步数据
  • 2.第二步,领导者(节点A)将新配置【A,B,C,D,E】作为一个日志项复制到新配置中的所有节点(A、B、C、D、E)上,然后将新配置的日志项应用到本地状态机,完成单节点变更,如图所示。在这里插入图片描述
    在这里插入图片描述

这样一来,我们就通过一次变更一个节点的方式完成了成员变更,保证了集群中始终只有一个领导者,也保证了集群稳定运行,持续提供服务。
在正常情况下,不管旧的集群配置是怎么组成的,旧配置的"大多数"和新配置的"大多数"都会有一个节点是重叠的。也就是说,不会同时存在旧配置和新配置两个"大多数"。
如果你遇到这种情况,可以在领导者启动时创建一个NO_OP日志项(也就是空的日志项),当领导者应用该NO_OP日志项后,再执行成员变更请求。具体实现可参考Hashicorp Raft的源码,也就是runLeader()函数,代码如下:

noop :=&logFuture{
log: Log{
Type:LogNoop,
},
}
r.dispatchLogs([*logFuture{noop}])

当然,有的人会好奇"联合共识",在我看来,联合共识难以实现,很少被Raft算法采用。比如,除了Logcabin外,目前还没有其他常用Raft算法采用这种方式。

注意。
因为联合共识实现起来复杂,所以绝大多数Raft算法采用的都是单节点变更的方法(比如Etcd、Hashicorp Raft),其中,Hashicorp Raft单节点变更的实现是由Raft算法的作者迭戈安加罗(Diego Ongaro)设计的,很有参考价值

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

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

相关文章

如何基于nginx搭建https网站

华子目录 使用nginx的http_ssl模块建立加密传输的网站查看配置文件ssl配置文件的主要参数实验:搭建nginxssl加密认证的web服务器 使用nginx的http_ssl模块建立加密传输的网站 查看 [rootserver ~]# nginx -V #查看是否有--with-http_ssl_module模块,如…

AI时代,如何让ChatGPT成为你最好的编程老师|TodayAI

ChatGPT作为生成式预训练变换器(GPT)系列模型的一种,专门设计用来理解和生成文本,其生成的文本能够高度模仿人类的对话方式。这种能力不仅让它在进行日常对话时表现得像极了真人,还使其在各种专业领域内,比…

TCP四次挥手分析

TCP四次挥手分析 概念过程分析为什么连接的时候是三次握手,关闭的时候却是四次握手?为什么要等待2MSL? 概念 四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。 在…

基于深度学习的3D目标检测与跟踪

目标检测和跟踪对于自动驾驶来说是至关重要和基础的任务,旨在从场景中识别和定位出那些预定义类别的对象。在所有形式的自动驾驶数据中,3D点云学习引起了越来越多的关注。目前,有许多用于3D目标检测的深度学习方法。然而,鉴于点云…

【方法】PDF如何取消“限制编辑”?

我们知道,PDF设置“限制编辑”可以用来保护文件,设置后很多功能就会被锁定,比如无法编辑内容,无法打印,另存文件等等,可以看到大多数菜单选项都是灰色状态,无法点击。 那如果后续想要使用锁定的…

启动盘制作

魔术师pe安装教程 我一般使用魔术师来安装windows系统 魔术师pe地址下载 解压后使用 把ios映像文件放入pe系统u盘下 开机按f1,进入bios,将usb接口拉到本电脑,在按f10保存,在按f12即可找到pe的u盘 ventoy安装教程 其他系统安装我使用ventoy ventoy地…

宇宙最强Windows下载神器IDM,还不快用 互联网下载管理器(IDM)全面评测

互联网下载管理器(IDM)是一款功能强大的下载工具,自 1999 年问世以来,一直以其卓越的性能和稳定性受到用户的喜爱。IDM 可以帮助用户加速下载速度,最高可达 5 倍,同时还具有断点续传、定时下载、自动分类等…

第14章 软件测试过程和管理

一、测试过程模型 (一)组织级测试过程 用于开发和管理组织级测试规格说明。常用的组织级测试规格说明包括组织级测试方针和组织级测试策略。 (二)测试管理过程 1、内容 包括测试管理和动态测试。动态测试:测试设计…

大数据组件之Storm详解

Storm 是一个免费并开源的分布式实时计算系统,具有高容错性和可扩展性。它能够处理无边界的数据流,并提供了实时计算的功能。与传统的批处理系统相比,Apache Storm 更适合处理实时数据。 让我们深入了解一下 Storm: 1.Storm 简介…

超强动画制作软件blender

blender中文手册:Blender 4.1 Manual Blender 是一款集3D建模、渲染、动画、视频编辑、音频处理、游戏设计等多功能于一体的软件。由于其开源性质,它拥有庞大的用户群体和活跃的开发者社区,这使得Blender的功能和性能得到了不断的提升和优化…

【数学建模】2024五一数学建模C题完整论文代码更新

最新更新:2024五一数学建模C题 煤矿深部开采冲击地压危险预测:建立基于多域特征融合与时间序列分解的信号检测与区间识别模型完整论文已更新 2024五一数学建模题完整代码和成品论文获取↓↓↓↓↓ https://www.yuque.com/u42168770/qv6z0d/gyoz9ou5upv…

NI CRIO 9045 LABVIEW2020

1.labview工程如果要访问CRIO,需要设置以下,否则在项目中连接失败。 2.项目中如果要传文件,需要安装WebDEV 3.使用WebDAV将文件传输到实时(RT)目标 https://knowledge.ni.com/KnowledgeArticleDetails?idkA03q000000YGytCAG&lzh-CN

Redis协议与异步方式

Rredis Pipeline redis pipeline 是一个客户端提供的机制,而不是服务端提供的; pipeline 不具备事务性; 目的:节约网络传输时间; 通过一次发送多次请求命令,从而减少网络传输的时间。 Redis发布订阅 为了支…

下载Node.js及其他环境推荐nvm

文章目录 项目场景:下载Node.js环境配置配置环境变量 安装脚手架安装依赖安装淘宝镜像安装 cnpm(我需要安装)nvm 安装 Node.js (推荐) 项目场景: 提示:这里简述项目相关背景: 项目…

数据库管理-第179期 分库分表vs分布式(20240430

数据库管理179期 2024-04-30 数据库管理-第179期 分库分表vs分布式(20240430)1 分库分表1.1 分库1.2 分表1.3 组合1.4 问题 2 分布式3 常见分布式数据库4 期望总结 数据库管理-第179期 分库分表vs分布式(20240430) 作者&#xff1…

《Spring-MVC》系列文章目录

简介 Spring MVC是一种基于Java的实现MVC设计模式的请求驱动类型的轻量级Web框架,它通过把Model(模型)、View(视图)、Controller(控制器)分离,将web层进行职责解耦,把复杂…

记一次古董级netapp存储更换故障硬盘全过程

1、案例背景 记一次某医院PACS存储NetApp FAS2554更换故障硬盘的过程。 这个netapp设备以前从未调试过,据客户说该设备上线也有快9年了,头一次故障硬盘。因为己经过保了,客户只是采购的硬盘,我这来免费服务了。。。 netapp调试…

docker 基础命令

docker 安装 更新系统 sudo apt update sudo apt -y dist-upgrade安装docker sudo apt-get -y install ca-certificates curl gnupg lsb-release sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/…

Servlet(一些实战小示例)

文章目录 一、实操注意点1.1 代码修改重启问题1.2 Smart Tomcat的日志1.3 如何处理错误 一. 抓自己的包二、构造一个重定向的响应,让页面重定向到百度主页三、让服务器返回一个html数据四、表白墙4.1 约定前后端数据4.2 前端代码4.3 后端代码4.4 保存在数据库的版本…

力扣hot100:101. 对称二叉树(双指针以不同方式递归)

LeetCode:101. 对称二叉树 看了第一个样例,很容易直接层序遍历看每一层的前后是否相同。但接下来这个样例告诉你,不能这样做。 层序遍历 仔细思考会发现,层序遍历不能看本结点,但是可以看儿子结点是否对称&#xf…