分布式与一致性协议之Paxos算法(二)

Paxos算法

如何达成共识

想象这样一个场景,某地出现突发事件,当地村委会、负责人等在积极研究和搜集解决该事件的解决方案,你也决定参与其中,提交提案,建议一些解决方法。为了和其他村民的提案做区分,你的提案还得包含一个提案编号,以起到唯一标识的作用。与你的做法类似,在Basic Paxos中,兰伯特也使用提案代表一个提议。不过提案中除了包含提案编号,还包含提议值。为了方便表示,使用[n,v]表示一个提案,其中n为提案编号,v为提议值。

强调一下,整个共识协商是分为两个阶段进行的(也就是前面提到的二阶段提交:准备阶段、接受阶段),那么具体要如何协商呢?
我们假设客户端1的提案编号为1,客户端2的提案编号为5,并假设节点A、B先收到来自客户端1的准备请求,节点C先收到客户端2
的准备请求

1.准备节点

先来看第一个阶段,首先,客户端1、2作为提议者,分别向所有接受者发送包含提案编号的准备请求,如图所示。
在这里插入图片描述

需要注意的是,准备请求中不需要指定提案的值,只需要携带提案编号就可以了,这也是很多人容易产生误解的地方。接着,节点A、B收到提案编号为1的准备请求,节点C收到提案编号为5的准备请求后,将进行如图所示的处理。由于之前没有通过任何提案,所以,节点A、B将返回一个"尚无提案"的响应,也就是说,节点A和B在告诉提议者,我之前没有通过任何提案,并承诺以后不再响应提案编号小于或等于1的准备请求,也不会通过编号小于1的提案。节点C也是如此,它将返回一个"尚无提案"的响应,并承诺以后不再响应提案编号小于等于5的准备请求,也不会通过编号小于5的提案。另外,节点A、B收到提案编号为5的准备请求,节点C收到提案编号为1的准备请求后将进行如图所示的处理过程。当节点A、B收到提案编号为5的准备请求时,因为提案编号5大于它们之前响应的主备请求的提案编号1,而且两个节点都没有通过任何提案,所以,节点A、B.将返回一个"尚无提案"的响应,并承诺以后不再响应提案编号小于等于5的准备请求,也不会通过编号小于5的提案。当节点C收到提案编号为1的准备请求时,由于提案编号1小于它之前响应的准备请求的提案编号5,所以节点C将丢弃该准备请求,不做响应
在这里插入图片描述
在这里插入图片描述

注意

本质上而言,提案编号的大小代表着优先级,你可以这么理解,根据提案编号的大小,接受者保证3个承诺,具体来说:

  • 1.如果准备请求的提案编号小于或等于接受者已经响应的准备请求的提案编号,那么接受者将承诺不响应这个准备请求;
  • 2.如果接受请求中的提案编号小于接受者已经响应的准备请求的提案编号,那么接受者将承诺不通过这个提案;
  • 3.如果接受者之前有通过提案,那么接受者将承诺准备请求的响应中会包含已经通过的最大编号的提案信息

2.接受阶段

第二个阶段也就是接受阶段,首先,客户端1、2在收到大多数节点的准备请求之后,会分别发送接受请求,如图所示.
在这里插入图片描述

客户端1收到大多数的接受者(节点A、B)的准备响应后,会根据响应中的提案编号最大的提案的值设置接受请求中的值。因为该值在来自节点A和B的准备响应都为空(“尚无提案”),所以就把自己的提议值3作为提案的值,发送接受请求[1,3].客户端2收到大多数的接受者(节点Ahe 节点B)的准备响应后,会根据响应中提案编号最大的提案的值设置接受请求中的值,因为该值在来自节点A、B的准备响应中都为空,所以就把自己的提议值7作为提案的值,发送接受请求[5,7].
在这里插入图片描述

当3个节点收到两个客户端的接受请求时,会进行如图所示的处理.
当节点A、B、C收到接受请求[1,3]的时候,由于提案的提案编号1小于3个节点承诺能通过的最小提案编号5,所以提案[1,3]将被拒绝。当节点A、B、C收到的接受请求[5,7]的时候,由于提案的提案编号5不小于3个节点承诺能通过的提案的最小编号5,所以提案[5,7]通过,也就是接受了提议值7,3个节点就X值达成共识。如果集群中有学习者,接受者通过了一个提案后就会通知所有的学习者,当学习者发现大多数的接受者都通过了某个提案,那么它也会通过该提案,并接受该提案的值。通过上面的示例过程可以看到,最终就X的值达成了共识。Basic Paxos的容错能力源自"大多数"的约定,可以这么理解,当少于一半的节点出现故障时,共识协商仍然可以正常工作

Multi-Paxos:Multi-Paxos不是一个算法,而是一个统称

通过前面的了解,你应该知道,Basic Paxos只能就单个值达成共识,一旦遇到要实现一系列值得共识的情况时,它就不管用了。虽然兰伯特
提到可以通过多次执行Basic Paxos示例(比如每接到一个值,就执行以此Basic Paxos算法)实现一系列值得共识。但是,很多人读完论文后,
还是两眼抹黑,虽然能读懂每个英文单词,但是不理解兰伯特提到得Multi-Paxos到底时什么意思。为什么Multi-Paxos这么难理解呢?
在我看来,兰伯特并没有把Multi-Paxos讲清除,只是介绍了大概的思想,缺少算法过程的细节和编程所必需的细节(比如缺少选举领导者的细节),
导致每个人实现的Multi-Paxos都不一样。不过从本质上看,大家都是在兰伯特特岛的Mutli-Paxos思想上补充细节,设计自己的Multi-Paxos算法,
然后实现它(比如Chubby的MultiPaxos实现、Raft算法等)。
所以在这里,补充一下:兰伯特提到的Multi-Paxos是一种思想,不是算法。而Multi-Paxos算法是一个统称,它是指基于Multi-Paxos思想,通过
多个Basic Paxos实例实现一系列值的共识算法。这一点由器需要注意

兰伯特关于Multi-Paxos的思考

熟悉Basic Paxos的读者可能还记得,Basic Paxos是通过二阶段提交来达成共识的。在第一阶段,也就是准备阶段,只有接收到大多数准备响应的提议者才能发起接受请求进入第二阶段(也就是接受阶段),如图所示 。
在这里插入图片描述

但是,如果我们之解通过多次执行Basic Paxos实例来实现一系列值得共识,就会存在这样几个问题:

  • 1.如果多个提议者同时提交提案,可能出现因为提案编号冲突,在准备阶段没有提议者接收到大多数准备响应,导致协商失败,需要重新协商。你想象一下,一个5节点的集群,如果其中3个节点作为提议者同时提案,就可能发生因为没有提议者接收大多数响应(比如1个提议者接收到1个准备响应,另外两个提议者分别接收到两个2准备响应)而准备失败,需要重新协商。还有可能只有提案编号最大的那个提议者的值能获得大多数的响应,前面的值则无响应,这显然也不符合Multi-Paxos的思想。
  • 2.两轮RPC通信(准备阶段和接受阶段)往返消息多、耗性能、延迟大。你要知道,分布式系统的运行是建立在RPC通信的基础之上的。因此,延迟一直是分布式系统的通电,是需要我们在开发分布式系统时认真考虑和优化的那么如何解决上面的两个问题呢?可以通过引入领导者和优化Basic Paxos执行过程来解决

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

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

相关文章

Transformer实战 单词预测

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍦 参考文章:TensorFlow入门实战|第3周:天气识别🍖 原作者:K同学啊|接辅导、项目定制 一、定义模型 from tempfile import Tempor…

在config.json文件中配置出来new mars3d.graphic.PolylineCombine({大量线合并渲染类型的geojson图层

在config.json文件中配置出来new mars3d.graphic.PolylineCombine({大量线合并渲染类型的geojson图层 问题场景: 1.浏览官网示例的时候图层看到大量线数据合并渲染的示例 2.矢量数据较大量级的时候,这种时候怎么在config.json文件中尝试配置呢&#x…

大数据运维之数据质量管理

第1章 数据质量管理概述 1.1 数据质量管理定义 数据质量管理(Data Quality Management),是指对数据从计划、获取、存储、共享、维护、应用、消亡生命周期的每个阶段里可能引发的各类数据质量问题,进行识别、度量、监控、预警等一…

【好书推荐8】《智能供应链:预测算法理论与实战》

【好书推荐8】《智能供应链:预测算法理论与实战》 写在最前面编辑推荐内容简介作者简介目录精彩书摘前言/序言我为什么要写这本书这本书能带给你什么 致谢 🌈你好呀!我是 是Yu欸 🌌 2024每日百字篆刻时光,感谢你的陪伴…

ARP学习及断网攻击

1.什么是ARP ARP(Address Resolution Protocol)是一种用于在IPv4网络中将IP地址映射到MAC地址的协议。在计算机网络中,每个网络接口都有一个唯一的MAC地址(Media Access Control address),用于识别网络设备…

tomcat部署

1.客户端和服务器端的交互过程 客户端发送请求给服务器 由服务器中的服务器软件拦截请求 根据请求调动相应的Java业务逻辑执行相关的处理 我们前面知道Java代码的运行势必提前将其装载在JVM上 而服务器软件一般都是由Java代码编写 所以两者都要装载在JVM上 而Java业务逻辑装载…

个人学习资源整理

文章目录 视频相关stl源码讲解相关 网站相关CPP网站 视频相关 stl源码讲解相关 跳转 网站相关 CPP网站 https://cplusplus.com/ https://gcc.gnu.org/

C语言实验-函数与模块化程序设计

一: 编写函数fun,其功能是:输入一个正整数,将其每一位上为偶数的数取出重新构成一个新数并输出。主函数负责输入输出,如输入87653142,则输出8642。(main函数->fun函数) #define _…

解决RuntimeError: cuDNN error: CUDNN_STATUS_EXECUTION_FAILED

下图说明在一瞬间我的GPU就被占满了 我的模型在训练过程中遇到了 CUDA 相关的错误,这是由于 GPU资源问题或内存不足导致的。这类错误有时候也可能是由于某些硬件兼容性问题或驱动程序问题引起的。 为了解决这个问题,可以尝试以下几个解决方案&#xff1a…

实验14 MVC

二、实验项目内容&#xff08;实验题目&#xff09; 编写代码&#xff0c;掌握MVC的用法。【参考课本 例1 】 三、源代码以及执行结果截图&#xff1a; example7_1.jsp&#xff1a; <% page contentType"text/html" %> <% page pageEncoding "ut…

【C/C++】动态内存管理(C:malloc,realloc,calloc,free || C++:new,delete)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; C | | C语言 目录 前言C/C内存分布C语言中的动态内存管理&#xff1a;malloc/realloc/realloc/freemallocrealloccallocfree C中的动态内存管理&#xff1a;new/deletenew和delete操作内…

2-4 任务:等差数列求和

本次实战的目标是计算1到100的累加和。我们将使用Java编程语言&#xff0c;通过三种不同的循环结构&#xff08;for循环、while循环和do-while循环&#xff09;来实现这个任务。在每个循环结构中&#xff0c;我们将逐步累加数字&#xff0c;并在最后输出结果。 首先&#xff0…