拜占庭将军问题与分布式一致性算法(Raft、Paxos)理解

news2024/11/25 8:20:25

背景

在常见的分布式系统中,总会发生诸如机器宕机网络异常(包括网络消息的延迟、丢失、重复、乱序,还有网络分区)等情况。Paxos算法需要解决的问题就是如何在一个可能发生上述异常的分布式系统中,快速且正确地在集群内部对某个状态(日志、数据、命令等)的值达成一致,并且保证不论发生以上任何异常,都不会破坏整个系统的一致性。

image.png

一、拜占庭将军问题

拜占庭将军问题提供了对分布式共识问题的一种情境化描述。
是分布式系统领域最复杂的容错模型,他描述如何在存在恶意行为(消息篡改或者伪造)的情况下使分布式系统达成一致,是我们理解分布式一致性协议和算法的重要基础。参考:https://zhuanlan.zhihu.com/p/107439021

分析

将军数量可以任意,假如有将军数量为三,分布在不同的地方,他们之间可以两两通过消息互相通信,目的:最终达成一致进攻或者撤退的共识。

(1)如果三个将军都是忠诚的(对于某个将军发送给其他将军的消息总是一致的),那么最终都会达成一致进攻或者撤退的共识。

(2)如果三个将军存在一个敌将,敌将会散布虚假的进攻、撤退消息,目的:为了就是破坏共识。

  • 以0和1表示撤退、进攻的消息。
  • 以组合**(out:发出,in:收到)**表示某个将军发出、收到消息的状态。那么对于某个将军某次的协商状态:(0,0)、(0,1)、(1,0)、(1,1)
  • 以A、B、C表示三位将军

下图以C为叛将为例,C干扰A发送进攻信号,导致将军A单独进攻。
企业微信截图_7586b43d-f55b-4f81-97ab-2083631af88b.png
其实总共有6种协商不一致的情况,对于叛军可能是A、B、C任一个,因此共三种情况。
而对于将军A、B不一致的情况为A(0,1) and B(1,0) 、A(1,0) and B(0,1)。
ps:如果将军A、B总是一致的,那么无论叛军C如何干扰都没用。

推论

假定总共存在m位叛将,那么至少总将领数为 3m + 1,那么最终总能达成一致的行动计划。
值的注意的是, 在这个算法中, 叛将人数_m_是已知的, 且叛将人数_m_决定了迭代递归的次数(按照叛将拆分小组,保证每个小组内一个叛将)
即叛将数_m_决定了进行作战信息协商的轮数, 如果存在_m_个叛将, 则需要进行_m+1_轮作战信息协商. 这也是上述存在1个叛将时需要进行两轮作战信息协商的原因.

解决方案

Leslie Lamport在论文中给出了两种拜占庭将军问题的解决方案, 也就是证明3m + 1的问题,即对于二忠一叛的条件下,想要总是达到一致性是不可能的。

  • 口信消息型解决方案(A solution with oral message)
  • 签名消息型解决方案(A solution with signed message).

1、口信型解决方案

口信消息规定

  • 任何已经发送的消息都将被正确传达
  • 消息的接收者知道是谁发送了消息
  • 消息的缺席可以被检测

通过规定可得知,口信消息不能篡改但是可以被伪造,由拜占庭问题的3m+1得出,可以以3忠1叛推导,首先发送消息的为指挥官,其余为副官,需要做两轮协商,没收到作战消息就撤退。
口哨型消息-Leader为忠.png
口哨型消息-Leader为忠.png

2、签名型解决方案

简言之就是忠将具有识别消息是否被篡改的能力,根据虚假信息找出叛将军。
在口信消息定义的基础上增加定义

  • 忠诚将军的签名无法伪造,消息无法被篡改和伪造(口信消息定义是消息不能篡改但是可以被伪造)
  • 任何人都能验证将军签名的真伪

还是以三将军为例,三个将军2个忠一个叛
签名型消息.png

同样可以类比多忠多叛的情况。
在消息篡改能被发现的条件下

  • 如果莫将发出不一致的消息,直接被判别为叛将
  • 如果某将发出消息一致,那么就证明是忠将,如果收到其他将军转发的消息和自己收到的不一致,那么就找出了叛将

因此,签名消息型解决方案可以处理任何数量叛将的场景,因为三个一小组在消息不能篡改的前提下,总能找出叛将。

总结

拜占庭将军问题提供了对分布式共识问题的一种情景化描述,为理解和分类现有众多分布式一致性协议和算法提供了框架,现有的分布式一致性算法主要分为两类

  • 一类是故障容错算法:即非拜占庭算法,解决的是分布式系统存在故障但是不存在被恶意攻击的场景下的共识问题,主要针对消息丢失、重复等问题,面对消息被篡改就无力了,一般用于局域网场景下的分布式算法,如Paxos、Raft、ZAB协议等。
  • 一类是拜占庭算法:既可以解决分布式系统故障,又可解决恶意攻击的问题,如在数字货币的区块链技术中,属于此类算法有PBFT、PoW算法。

二、Paxos算法

参考:https://www.cnblogs.com/linbingdong/p/6253479.html
目的就是保证所有分布式节点(进程)上面某各状态(值)的一致性。具体就是通过协商保证只有一个value会被选定,当value被选定后,分布式节点(进程)最终也能获取到被选定的value。

// TODO

三、Raft算法

参考:https://cloud.tencent.com/developer/article/1525566

Raft是用于管理复制日志的一致性算法。它的效果相当于(multi-)Paxos,跟Paxos一样高效,但结构与Paxos不同。这使得Raft比Paxos更容易理解,也为构建实用系统提供了更好的基础。

// TODO

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

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

相关文章

GitLab使用的最简便方式

GitLab介绍 GitLab是一个基于Git版本控制系统的开源平台,用于代码托管,持续集成,以及协作开发。它提供了一套完整的工具,以帮助开发团队协同工作、管理和部署代码。 往往在企业内部使用gitlab管理代码,记录一下将本地代…

win11将visual studio 2022的调试控制台改为windows terminal

一、前言 默认的调试控制台太丑了,字体也没有好看的,还是更喜欢windows terminal 二、修改 2.1 修改之前 2.2 修改步骤 打开windows terminal点这个向下的标志 选择settings按照下图1, 2, 3步骤依次操作即可 2.3 修改之后 总结 漂亮很多了

在Kubernetes上安装和配置Istio:逐步指南,展示如何在Kubernetes集群中安装和配置Istio服务网格

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

六、串口通信

六、串口通信 串口接口介绍使用串口向电脑发送数据电脑发送数据控制LED灯 串口接口介绍 SBUF是串口数据缓存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器;读操作时,读出的是接收寄存器…

【数据库系统概论】数据模型

数据模型是什么两类数据模型两步抽象概念模型数据模型 常用的数据模型感谢 💖 数据模型是什么 模型是对现实世界中某个对象特征的模拟和抽象。比如飞机模型就体现了飞机的特性,它模拟飞机的起飞、飞行和降落,它抽象了飞机的基本特征——机头…

C++之vector::insert与vector::insert用法区别总结(二百二十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

Loguru:功能强大、简单易用的Python日志库

文章目录 Loguru:Python的日志库安装 Loguru基本用法配置 Loguruadd() 语句remove() 语句设置日志文件保留日志的等级设置控制台日志显示等级Loguru:Python的日志库 Loguru 是一个功能强大、简单易用的日志库,可以让 Python 的日志记录变得更加轻松。它提供了丰富的功能和配…

Kotlin | 在for、forEach循环中正确的使用break、continue

文章目录 for循环中使用break、continueLabel标签forEach中如何退出循环资料 Kotlin 有三种结构化跳转表达式: return:默认从最直接包围它的函数或者匿名函数返回。break:终止最直接包围它的循环。continue:继续下一次最直接包围…

【软考复习系列】计算机网络易错知识点记录

参考文章:图解路由器:这玩意儿能连接全世界的网络? - 知乎 (zhihu.com) 宏内核和微内核 宏内核应该叫单内核或者单核。在这种单核的设计中,内核是一个大的整体,所有内核服务都运行在一个地址空间中,函数之…

软件设计模式系列之九——桥接模式

1 模式的定义 桥接模式是一种结构型设计模式,它用于将抽象部分与其实现部分分离,以便它们可以独立地变化。这种模式涉及一个接口,它充当一个桥,使得具体类可以在不影响客户端代码的情况下改变。桥接模式将继承关系转化为组合关系…

Matlab图像处理-强度分层法

强度分层法 强度分层技术是最简单的伪彩色图像处理方法之一。 如果将一幅图像被描述为空间坐标(x,y) 的强度函数f(x,y) ,则分层的方法可以看作是将一些平面平行于图像坐标平面(x,y) ,然后将每个平面在相交区域切割图像函数。下图展示了使用平面将图像函…

vue+axios+el-progress(elementUI组件)实现下载进度条实时监听(小白简洁版)

一、实现效果 二、实现方式 方案:使用axios方法onDownloadProgress方法监听下载进度 使用此方式的前提!!!请让后端在响应头中加上content-length,存放下载文件的总大小,如下图: 三、代码 1、进…

【Git】03-GitHub

文章目录 1. GitHub核心功能2. GitHub搜索项目3. GitHub搭建个人博客4. 团队项目创建5. git工作流选择5.1 需要考虑的因素5.2 主干开发5.2 Git Flow5.3 GitHub Flow5.4 GitLab Flow(带生产分支)5.4 GitLab Flow(带环境分支)5.4 GitLab Flow(带发布分支) 6. 分支集成策略7. 启用…

redis 集群(cluster)

1. 前言 我们知道,在Web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999% 等等)。但是在Redis语境中,高可用的含义似乎要宽泛一些&#xf…

如何将本地的项目上传到Git

一、GitHub or GitLab or Gitee创建一个新的仓库 二、仓库路径创建成功后,将本地项目上传到git 1. 进入本地项目所在文件夹位置,右击 2.出现git命令框 输入git init 在当前项目的目录中生成本地的git管理(会发现在当前目录下多了一个.git文件…

git 查看当前版本号

你看,那个人好像一条狗哎。 ——周星驰 《大话西游》 要查看当前 Git 仓库的版本号,您可以使用以下命令: git log --oneline -n 1 这会显示最近一次的提交信息,包括提交的哈希值(版本号)和提交的摘要信息…

Jmeter接口测试简易步骤

使用Jmeter接口测试 1、首先右键添加一个线程组,然后我们重命名接口测试 2、在线程组上添加一个Http默认请求,并配置服务器的IP地址端口等信息 3、在线程组中添加一个HTTP请求,这里我们重命名“增加信用卡账户信息接口” 4、配置接口请求信息…

Java基础入门·对存储文件File的相关操作

前言 File类获取的方法 getName() | getPath() File getAbsoluteFile() | File getParentFile() long length() File类遍历方法 IO流对象的分类 1.按照操作的文件类型分类 2.按照数据的流向分类 IO流对象的分类归纳 OutputStream 字节输出流写入文件的步骤 追加写入 F…

迅为iTOP-RK3568开发板Sobel 算子边缘检测

本小节代码在配套资料“iTOP-3568 开发板\03_【iTOP-RK3568 开发板】指南教程 \04_OpenCV 开发配套资料\32”目录下,如下图所示: Sobel (索贝尔)算子是计算机视觉领域的一种重要处理方法。主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检…

计算机专业毕业设计项目推荐07-科研成果管理系统(JavaSpringBoot+Vue+Mysql)

科研成果管理系统(JavaSpringBootVueMysql) **介绍****系统总体开发情况-功能模块****各部分模块实现****最后想说的****联系方式** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以…