MIT6.824-Raft笔记:脑裂、Majority Vote(过半投票/过半选举)

本部分主要是问题引入,以及给出一个解决方案

1 脑裂(Split Brain)

replication system的共同点:单点

前面几个容错特性(fault-tolerant)的系统,有一个共同的特点。

  • MapReduce复制了计算,但是复制这个动作,或者说整个MapReduce被一个单主节点控制。
  • GFS以主备(primary-backup)的方式复制数据,会实际的复制文件内容,但它也依赖一个单主节点,来确定每一份数据的主拷贝的位置。
  • VMware FT在一个Primary虚机和一个Backup虚机之间复制计算相关的指令。当其中一个虚机出现故障时,为了能够正确的恢复,需要一个Test-and-Set服务来确认,Primary虚机和Backup虚机只有一个能接管计算任务。

它们都是一个多副本系统(replication system),背后存在一个共性:它们需要一个单节点来决定,在多个副本中,谁是主(Primary)使用一个单节点的好处是,它不可能否认自己,因为只有一个节点,它的决策就是整体的决策;缺点是,它本身又是一个单点故障(Single Point of Failure),将系统容错的关键点,转移到了这个单点上。在系统出现局部故障时,通过primary copy继续工作。使用单点是为了避免脑裂(Split-Brain)。当出现故障时,要极其小心的决定数据的主拷贝,否则需要面临脑裂的场景。

这里主要说明多副本系统,虽然是多副本,但是最终还是搞了一个单点来做决定,而这样做的目的是为了避免脑裂;同样单点故障又可以通过新的primary继续工作。
下面通过示例可以得知,如果是多副本系统,要么同时等待所有副本响应,这样还不如单点,因为多个是一个出现问题的多倍;要么不等待多个,那这样就会出现脑裂,根源也很简单,在分布式系统中,根本无法确定你连接不上的这个服务到底是宕机了,还是仅仅你连接不上而其它服务可以。

脑裂带来的问题及其严重性

这里通过将单点Test-and-Set服务设计为多副本,说明为什么出现故障时,很难避免脑裂。
VMware FT中的Test-and-Set之前是一个单点服务,而VMware FT依赖这个Test-and-Set服务来确定Primary虚机,为了提高系统的容错性构建一个多副本的Test-and-Set服务。网络里面有两个服务器(S1,S2)都是Test-and-Set服务的拷贝,还有两个客户端(C1,C2),它们需要通过Test-and-Set服务确定主节点是谁。在这个例子中,这两个客户端本身就是VMware FT中的Primary和Backup虚拟机。
这两个Test-and-Set服务器中的数据记录将从0开始,任意一个客户端发送Test-and-Set指令,这个指令会将服务器中的状态设置成1,两个服务器都应该设置成1,然后将旧的值0,返回给客户端。本质上来说,这是一种简化了的锁服务。
**当一个客户端可以与其中一个服务器通信,但是不能与另一个通信时,有可能出现脑裂的问题。**假设客户端需要将请求同时发送给两个服务器。这时就需要考虑脑裂问题,即会出现各种情况的网络分区,以及服务器不响应需要如何处理。

  • 如果我们只将C1的请求设置给S1,而不设置给S2,会导致S2的数据不一致。或许应该规定,对于任何操作,客户端必须总是与两个服务器交互,而不是只与其中一个服务器交互。**但是这是一个错误的想法,因为这里根本就没有容错,甚至比只使用一个服务器更糟。**因为当两个服务器中的一个故障了或者失联了,我们的系统就不能工作了。对于一个单点的服务,我们只依赖一个服务器。现在我们有两个服务器,并且两个服务器都必须一致在线,这里的难度比单个服务器更大。
  • 如果客户端不能同时与两个服务器交互,那它就与它能连通的那个服务器交互,同时认为另一个服务器已经关机了。这也是一个错误的答案呢?我们的故障场景是,另一个服务器的状态无从知晓,实际可能是网络线路出现了故障,从而导致C1可以与S1交互,但是不能与S2交互。同时C2可以与S2交互,但是不能与S1交互。如果一个客户端连接了两个服务器,为了达到一定的容错性,客户端只与其中一个服务器交互也应该可以正常工作。但是这样就不可避免的出现了这种情况:假设这根线缆中断了,将网络分为两个部分。C1发送Test-and-Set请求给S1,S1将自己的状态设置为1,并返回之前的状态0给C1。C1对应的虚拟机会认为自己可以成为主节点。但是同时S2里面的状态仍然是0。如果现在C2也发送了一个Test-and-Set请求,本来应该发送给两个服务器,但是现在从C2看来,S1不能访问,根据之前定义的规则,那就发送给S2吧。同样的C2也会认为自己持有了锁。如果这个Test-and-Set服务被VMware FT使用,那么这两个VMware 虚机都会认为自己成为了主虚拟机而不需要与另一个虚拟机协商,这是一个错误的场景。

这里主要是针对上面的共同点,通过举反例说明单点的必要性。
实际上Lecture4中最后也提到 test and set 应该也是具有容错性的服务,而不是某个单点。

**在有两个拷贝副本的配置中,看起来我们只有两种选择:要么等待两个服务器响应,那么这个时候就没有容错能力;要么只等待一个服务器响应,那么就会进入错误的场景(通常称为脑裂)。**这基本是上世纪80年代之前要面临的挑战。多副本系统时,需要排除脑裂的可能,这里有两种技术:

  • 构建一个不可能出现故障的网络。比如电脑中,连接了CPU和内存的线路就是不可能出现故障的网络。如果网络不会出现故障,这样就排除了脑裂的可能。当网络不出现故障时,那就意味着,如果客户端不能与一个服务器交互,那么这个服务器肯定是关机了。这里假设有足够多的资金,就能接近这个假设。

主要还是,只要有网络的情况下,节点A和节点B连接异常,但是B本身是什么样的,节点B和其他节点是什么样的是未知的。

  • 人工解决问题,不要引入任何自动完成的操作。默认情况下,客户端总是要等待两个服务器响应,如果只有一个服务器响应,永远不要执行任何操作。之后通过运维人员检查,进行关机等处理,这里本质上把人作为了一个决策器,这个人也是个单点。

很长一段时间内,人们都使用以上两种方式中的一种来构建多副本系统。这虽然不太完美,因为人工响应不能很及时,不出现故障的网络又很贵,但是这些方法至少是可行的。

2 Majority Vote (quorum)

尽管存在脑裂的可能,人们发现哪怕网络可能出现故障,可能出现分区,实际上是可以正确的实现能够自动完成故障切换的系统。这种能自动恢复,同时又避免脑裂的多副本系统,关键点在于多数投票(Majority Vote)。这也是用来构建Raft的一个基本概念。
网络分区(Partition):当网络出现故障将网络分割成两半,网络的两边独自运行且不能访问对方。
多数投票系统的第一步在于,服务器的数量要是奇数,而不是偶数。如果只有两个服务器,被网络故障分隔的两边,它们看起来完全是一样的,它们运行了同样的软件,它们也会做相同的事情,这样不太好(会导致脑裂)。但如果服务器的数量是奇数的,那么当出现一个网络分割时,两个网络分区将不再对称,这是多数投票吸引人的地方。首先你要有奇数个服务器。然后为了完成任何操作,例如Raft的Leader选举,例如提交一个Log条目,在任何时候为了完成任何操作,你必须凑够过半的服务器来批准相应的操作

如果是偶数会如何呢,这里举两个例子:

  1. 2副本,那么如果分区,就要等待过半投票,即2/2 + 1 = 2,也就是每一个都要等待2个的响应,那这个和6.1中第二小节示例中的方案一:必须与所有副本通信,又有何区别,反而提高了故障概率。
  2. 4副本,过半投票 4/2+1=3,这里好一些了,能够容忍1个的故障,但是这和3副本相比,并不能提高容错概率,还不如之间5副本或者3副本,浪费反而不会提高容错。

综上:偶数情况下,如果被网络故障均分,那么整个系统依然是不可用的。

这里背后的逻辑是,如果网络存在分区,最多只有一个分区能够拥有过半的服务器。这里有一点需要明确,当我们在说过半的时候,我们是在说所有服务器数量的一半,而不是当前开机服务器数量的一半。这个点困扰了我(Robert教授)很长时间,如果你有一个系统有3个服务器,其中某些已经故障了,如果你要凑齐过半的服务器,你总是需要从3个服务器中凑出2个,即便你知道1个服务器已经因为故障关机了。过半总是相对于服务器的总数来说

服务器的总数:一是因为实际上很难完全知道具体出现故障的机器到底是怎么了,另一方面是因为为了后面的过半更新+过半选举,这样选出来的leader一定包含有最新数据。

个人思考:

  1. 这里的开机,在有网络的情况下,A连接不上B,无法判断B是否开机,B和C是否连接?
  2. 需要及时处理故障机
  3. 需要提供快速的数据恢复

对于多数投票,可以用一个更通用的方程式来描述:如果系统有 2 * F + 1 个服务器,那么系统最多可以接受F个服务器出现故障,仍然可以正常工作。这也被称为多数投票(quorum)系统,因为3个服务器中的2个,就可以完成多数投票。
有关多数投票系统的一个特性就是,最多只有一个网络分区会有过半的服务器,我们不可能有两个分区可以同时完成操作。这里背后更微妙的点在于,如果你总是需要过半的服务器才能完成任何操作,同时你有一系列的操作需要完成,其中的每一个操作都需要过半的服务器来批准,例如选举Raft的Leader,那么每一个操作对应的过半服务器,必然至少包含一个服务器存在于上一个操作的过半服务器中任意两组过半服务器,至少有一个服务器是重叠的。实际上相比其他特性,Raft更依赖这个特性来避免脑裂。
例如,当一个Raft Leader竞选成功,那么这个Leader必然凑够了过半服务器的选票,而这组过半服务器中,必然与旧Leader的过半服务器有重叠。新的Leader必然知道旧Leader使用的任期号(Term ID),因为新Leader的过半服务器必然与旧Leader的过半服务器有重叠,而旧Leader的过半服务器中的每一个必然都知道旧Leader的任期号。类似的,任何旧Leader提交的操作,必然存在于过半的Raft服务器中,而任何新Leader的过半服务器中,必然有至少一个服务器包含了旧Leader的所有操作。这是Raft能正确运行的一个重要因素。
在多数投票这种思想的支持下,大概1990年的时候,有两个系统基本同时被提出。这两个系统指出,你可以使用这种多数投票系统,从某种程度上来解决之前明显不可能避免的脑裂问题,例如,通过使用3个服务器而不是2个,同时使用多数投票策略。两个系统中的一个叫做Paxos(1989),Raft论文对这个系统做了很多的讨论;另一个叫做ViewStamped Replication(VSR, 1988)。尽管Paxos的知名度高得多,Raft从设计上来说,与VSR更接近。VSR是由MIT发明的。
学生提问:可以为Raft添加服务器吗?
Rober教授:Raft的服务器是可以添加或者修改的,Raft的作者提出了方法来处理这种场景,但是比较复杂。

参考文献:
https://pdos.csail.mit.edu/6.824/schedule.html
https://mit-public-courses-cn-translatio.gitbook.io/mit6-824/

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

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

相关文章

JavaScript框架 Angular、React、Vue.js 的全栈解决方案比较

在 Web 开发领域,JavaScript 提供大量技术栈可供选择。其中最典型的三套组合,分别是 MERN、MEAN 和 MEVN。前端框架(React、Angular 和 Vue)进行简化比较。 MERN 技术栈详解 MERN 技术栈包含四大具体组件: MongoDB&am…

蓝桥杯物联网竞赛_STM32L071_3_Oled显示

地位: 对于任何一门编程语言的学习,print函数毫无疑问是一种最好的调试手段,调试者不仅能通过它获取程序变量的运行状态而且通过对其合理使用获取程序的运行流程,更能通过关键变量的输出帮你验证推理的正确与否,朴素的…

常见网络安全防护

1 阻断服务攻击(DOS) 阻断服务攻击,想办法目标网络资源用尽变种:分布式阻断服务攻击 影响: 宽带消耗性(消耗目标的带宽)资源消耗型(消耗目标的计算资源) 解决方案&am…

人工智能对网络安全的影响越来越大

如果问当前IT行业最热门的话题是什么,很少有人会回答除了人工智能(AI)之外的任何话题。 在不到 12 个月的时间里,人工智能已经从一项只有 IT 专业人员才能理解的技术发展成为从小学生到作家、程序员和艺术家的每个人都使用的工具…

MySQL索引事务基础

目录 1. 索引 1.1索引的概念 1.2索引的特点 1.3 索引的使用场景 1.4索引的使用 1.4.1查看索引 1.4.2创建索引 1.4.3删除索引 1.5索引保存的数据结构 2.事务 2.1经典例子 2.2事务的概念 2.3事务的使用 2.4事务的4个核心特性 2.5事务的并发问题 2.5.1脏读 2.5.2不可…

Python + Docker 还是 Rust + WebAssembly?

在不断发展的技术世界中,由大语言模型驱动的应用程序,通常被称为“LLM 应用”,已成为各种行业技术创新背后的驱动力。随着这些应用程序的普及,用户需求的大量涌入对底层基础设施的性能、安全性和可靠性提出了新的挑战。 Python 和…

Java项目如何打包成Jar(最简单)

最简单的办法,使用Maven插件(idea自带) 1.选择需要打包的mudule,点击idea右侧的maven插件 2.clean操作 3.选择需要的其他mudule,进行install操作(如果有) 4.再次选择需要打包的module&#…

Vue.observable 是什么

Observable 翻译过来我们可以理解成可观察的 Vue.js2.6 新增 Vue.observable,让一个对象变成响应式数据。Vue 内部会用它来处理 data 函数返回的对象 。 返回的对象可以直接用于渲染函数和计算属性内,并且会在发生变更时触发相应的更新。也可以作为最小化…

Git的指令

Git 各平台安装包下载地址为:http://git-scm.com/downloads Ubuntu Git 安装命令为: $ apt-get install git用户信息 配置个人的用户名称和电子邮件地址: $ git config --global user.name "runoob" $ git config --global user.…

Python----类对象和实例对象

目录 一.类和类的实例 二.类属性和实例属性 三.私有属性和公有属性 四.静态方法和类方法 五.__init__方法,__new__方法和__del__方法: 六.私有方法和公有方法 七.方法的重载 八.方法的继承 九.方法的重写 十.对象的特殊方法 十一.对象的引用&a…

软件开发模式开源和闭源的优劣之争

开源和闭源,两种截然不同的开发模式,对于大模型的发展有着重要影响。开源让技术共享,吸引了众多人才加入,推动了大模的创新。而闭源则保护了商业利益和技术优势,为大模型的商业应用提供了更好的保障。 开源与闭源软件的…

基于命令行模式设计退款请求处理

前言 这篇文章的业务背景是基于我的另一篇文章: 对接苹果支付退款退单接口-CSDN博客 然后就是说设计模式是很开放的东西,可能我觉得合适,你可能觉得不合适,这里只是做下讨论,没有一定要各位同意的意思.... 相关图文件 这里我先把相关的图文件放上来,可能看着会比较清晰点 代码逻…

sql之left join、right join、inner join的区别

sql之left join、right join、inner join的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 inner join(等值连接) 只返回两个表中联结字段相等的行 举例如下&#xff1…

Web服务器(go net/http) 处理Get、Post请求

大家好 我是寸铁👊 总结了一篇Go Web服务器(go net/http) 处理Get、Post请求的文章✨ 喜欢的小伙伴可以点点关注 💝 前言 go http请求如何编写简单的函数去拿到前端的请求(Get和Post) 服务器(后端)接收到请求后,又是怎么处理请求&#xff0c…

【限时免费】20天拿下华为OD笔试之【前缀和】2023B-寻找连续区间【欧弟算法】全网注释最详细分类最全的华为OD真题题解

文章目录 题目描述与示例题目描述输入描述输出描述示例一输入输出说明 示例二输入输出 解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 给定一个含有N个正整数的数组,求出有多少个连续区间(包…

【网络奇缘】- 计算机网络|分层结构|ISO模型

🌈个人主页: Aileen_0v0🔥系列专栏: 一见倾心,再见倾城 --- 计算机网络~💫个人格言:"没有罗马,那就自己创造罗马~" 目录 计算机网络分层结构 OSI参考模型 OSI模型起源 失败原因: OSI模型组成 协议的作用 📝全文…

二十四、RestClient操作文档

目录 一、新增文档 1、编写测试代码 二、查询文档 1、编写测试代码 三、删除文档 1、编写测试代码 四、修改文档 1、编写测试代码 五、批量导入文档 批量查询 一、新增文档 1、编写测试代码 SpringBootTest public class HotelDocumentTest {private RestHighLevelC…

【栈】不同字符的最小子序列

题目: /*** 思路:栈,使用数组记录每个字母出现的次数,再用一个数组标记字符是否在栈中* 遍历栈,存储字符时比较栈顶字符,若小于栈顶字符并且后面有重复的字符则* 栈顶元素出栈,否则入栈。** au…

PS 注释工具 基础使用方法讲解

好 上文PS 颜色取样器&标尺工具 基本使用讲解中 我们讲了 颜色取样器和标尺工具的基本用法 下面我们来看一下 注释工具 这个 主要是后面 比较大的作品 可能不是我们一个人取设计 团队作图 就需要用到它 选择 注释工具 后 我们随便点击图像任何一个位置 右侧就会出现一个输…

gitlab各版本安装注意点:

研发团队在安装gitlab各版本过程中可能遇到各种问题,为了后续容易查看特将我们在实践过程中遇到的各类问题要点总结如下: gitlab 10.8.3 (564c342)安装 centos Linux yum安装网址查找网址:gitlab/gitlab-ce - Results for gitla…