分布式与一致性协议之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.mzph.cn/web/4276.shtml

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

相关文章

以太网LAN双向透明传输CH9120透传芯片实现以太网转232串口转485转TTL串口

网络串口透传芯片 CH9120 1、概述 CH9120 是一款网络串口透传芯片。CH9120 内部集成 TCP/IP 协议栈,可实现网络数据包和串口数据的双向透明传输,具有 TCP CLIENT、TCP SERVER、UDP CLIENT 、UDP SERVER 4 种工作模式,串口波特率最高可支持到…

BUUCTF-WEB2

[SUCTF 2019]EasySQL1 1.启动靶机 2.寻找注入点和注入方法 随便输入一个字母,没有回显 随便输入一个数字,发现有回显,并且回显结果一样 3.堆叠注入 1; show databases; #查看数据库 1; show tables; #查看数据表 里面有个flag 1;set …

图像处理ASIC设计方法 笔记19 连通域标记ASIC系统设计

目录 核心的模块有:标记ASIC的工作流程如下:该芯片的系统结构具有如下特点:P131 第6章 连通域标记与轮廓跟踪 本章节讲述了多值分割图像连通域标记芯片的系统设计 多值分割图像连通域标记芯片(以下简称"标记芯片",也称"标记 ASIC"),完成图像连通域标…

ffmpeg中stream_loop参数不生效原因分析

问题 使用ffmpeg把一个视频文件发布成一个rtmp流,并设置成循环推流,此时需要使用参数stream_loop,命令如下: ffmpeg.exe -stream_loop -1 -re -i D:\tools\ffmpeg-5.1.2\bin\sei.h264 -c copy -f flv -safe 0 rtmp://localhost:1935/live/te…

视频号小店要交多少保证金?这里面的秘密,全网无人敢说!

大家好,我是电商糖果 关于视频号小店的保证金的问题,有不少人询问过糖果。 这毕竟是个新平台,很多人对于它的收费标准不太清楚。 糖果做视频号小店一年多了,也开了多家小店。 下面就来给大家详细的说一下。 首先,我…

鸿蒙官网学习3

鸿蒙官网学习3 每日小提示项目的模块类型跨设备预览调试阶段应用的替换方式有两种 打开老的demo工程报错UIAbility 每日小提示 项目的模块类型 moduleType分为三种,只有1,2的模块支持直接调试和运行 entryfeaturehar 跨设备预览 需要手动在config.j…

Java微服务架构之Spring Boot —上篇

SpringBoot 概述 SpringBoot提供了一种快速使用Spring的方式,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度…

Swift - 基础语法

文章目录 Swift - 基础语法1. 常量1.1 只能赋值1次1.2 它的值不要求在编译时期确定,但使用之前必须赋值1次1.3 常量、变量在初始化之前,都不能使用 2. 标识符3. 常用数据类型4. 字面量4.1 布尔4.2 字符串4.3 整数4.4 浮点数4.5 数组4.6 字典 5. 类型转换…

【MySQL关系型数据库】基本命令、配置、连接池

目录 MySQL数据库 第一章 1、什么是数据库 2、数据库分类 3、不同数据库的特点 4、MySQL常见命令: 5、MySQL基本语法 第二章 1、MySQL的常见数据类型 1、数值类型 2、字符类型 3、时间日期类型 2、SQL语句分类 1、DDL(数据定义语言&#x…

Qt设置可执行程序图标,并打包发布

一、设置图标 图标png转ico: https://www.toolhelper.cn/Image/ImageToIco设置可执行程序图标 修改可执行程序图标 添加一个rc文件,操作如下,记得后缀改为rc 打开logo.rc文件添加代码IDI_ICON1 ICON DISCARDABLE "logo.ico"在项目pro后缀名的文件中添加代码 RC_…

一套Java语言开发的(药物不良反应智能监测ADR成品源码)B/S架构:用于监测和收集药品在使用过程中发生的不良反应的系统

药品不良反应监测工作弥补了药品上市前研究的局限性,可以最大程度上降低药品不良反应的重复发生,提高合理用药水平,同时也为监管、遴选、调整基本药物提供了数据支持。 所谓“是药三分毒”,药品是把双刃剑,具有两面性…

基于springboot+vue+Mysql的CSGO赛事管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

Docker容器部署overleaf

overleaf在线版限制很多,好在开源,准备在本地Docker部署,网上翻了翻,似乎本地部署并非易事,我也尝试了一下,发现直接使用docker-compose拉官方最新镜像部署的确问题很多,不过最终还是完美解决。…

vs2019 - warning LNK4098 : 默认库“msvcrt.lib”与其他库的使用冲突

文章目录 vs2019 - warning LNK4098 : 默认库“msvcrt.lib”与其他库的使用冲突概述笔记实验 - 编译静态库实验 - 编译主工程,包含静态库实验主工程和静态库编译设置不同时的编译报错和警告备注备注 - 判断/Mdd, /MdEND vs2019 - warning LNK4098 : 默认库“msvcrt.…

OpenHarmony实战开发-动画概述

UI(用户界面)中包含开发者与设备进行交互时所看到的各种组件(如时间、壁纸等)。属性作为接口,用于控制组件的行为。例如,开发者可通过位置属性调整组件在屏幕上的位置。 属性值的变化,通常会引…

NetSuite如何迁移Workbook

截止到24.1, Workbook的迁移仍然是个难题。Bundle和Copy To Account都不支持Workbook的迁移,只剩下SDF的办法了。所以,今朝我们就介绍一下SDF迁移Workbook的方法。 1. 迁移准备 基本上,Workbook的迁移涉及4类对象: …

VMWARE安装xpsp3时无法从光盘启动安装显示dhcp转圈圈

VMWARE安装xpsp3时无法从光盘启动安装显示dhcp转圈圈。之前都安装过无数次了。这次被卡住了。 原来是这里原因 不成功是因为启动时连接没打钩。默认是打钩的。不知道怎么的我把勾去掉了。我还跑去设置bios。都没有用。

paddle ocr模型量化实践

参考:https://github.com/PaddlePaddle/PaddleOCR/blob/main/deploy/slim/quantization/README.md https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7.1/doc/doc_ch/FAQ.md 蒸馏 剪枝 量化 参考:https://blog.csdn.net/mddCSDN/article/de…

ptyhon画图显示中文

import matplotlib.pyplot as plt import matplotlib# 设置中文字体 matplotlib.rcParams[font.sans-serif] [SimHei] matplotlib.rcParams[font.family]sans-serifplt.plot([1, 2, 3, 4]) plt.xlabel(这是x轴) plt.ylabel(这是y轴) plt.title(这是标题) plt.show()用这个代码…

记一次线上日志堆栈不打印问题排查(附:高并发系统日志打印方案可收藏)

目录 一.线上的日志堆栈不打印了二.一步一步仔细排查三.最后搞定四.聊一聊线上日志到底应该怎么打印4.1 日志打印的诉求4.2 常见的系统日志上报方案4.2.1 ELK 方案4.2.2 自定义log appender 完成应用日志采集. 4.3 日志常见框架傻傻分不清4.4 日志在高并发系统中需要注意的 tip…