分布式系统中的经典思想实验——两将军问题和拜占庭将军问题

news2024/11/6 9:30:48

文章目录

    • 一、两将军问题
      • 1.1 问题描述
      • 1.2 深入理解两将军问题
      • 1.3 实验结论
    • 二、拜占庭将军问题
      • 2.1 问题描述
      • 2.2 深入理解拜占庭将军问题
      • 2.3 解决方案
    • 三、两将军和拜占庭问题的关系
      • 3.1 区别和联系
      • 3.2 应用与现实意义
    • 参考资料

一、两将军问题

1.1 问题描述

两将军问题描述的是两个将军(或两支军队)通过不可靠的通信渠道(如信使)来协调攻击的情景。

背景:两支由不同的将军领导的军队,正准备进攻一座坚固的城市。军队在城市附近的两个山丘扎营,中间有一个山谷将两个山丘隔开,两个将军交流的唯一方法是派遣信使穿越山谷。然而,山谷被城市的守卫者占领,并且途经该山谷传递信息的信使有可能会被俘虏。他们必须同时攻击才能取胜。

问题:信使有可能被敌人拦截,导致消息无法到达。即便B收到消息,B回复的确认信息也可能被拦截。这导致将军A无法确定B是否收到了消息并同意攻击,反之亦然。

请添加图片描述

1.2 深入理解两将军问题

这个问题实质上描述的是:

  • 通信不可靠:在不可靠的通信环境下,双方无法确保消息被准确接收。
  • 共识难题:无法保证双方在同一时间达成一致的决策。

两将军问题强调了在不可靠通信环境下达成一致的困难,这在分布式系统的消息传递、确认和重试机制中有所体现。

1.3 实验结论

两将军问题被证明无解,计算机科学家们仍找到了工程上的解决方案,例如传输控制协议(TCP)的“三次握手”机制。

这个思想实验表明,在分布式系统中,一个节点无法直接确认另一个节点的状态,必须通过发送信息来交流。类似于人类交流,我们只能通过语言、文字或肢体语言来传达想法。

二、拜占庭将军问题

2.1 问题描述

拜占庭将军问题是两将军问题的扩展,涉及多个将军(或节点),其中一些可能是恶意的(即“拜占庭将军”)。

背景:多个拜占庭将军各率领一支军队,想要占领一座防守坚固的城市,将军们还是只能通过信使进行交流。为了简化问题,将各支军队的行动策略限定为进攻或者撤离两种。因为部分军队进攻、部分军队撤离可能会导致灾难性后果,所以各位将军必须通过投票来达成一致的策略,即所有军队一起进攻或者所有军队一起撤离。但其中一些将军可能是叛徒,会传递虚假信息以扰乱决策。

问题:如何确保所有忠诚的将军在存在恶意将军的情况下,能够达成一致的决策。

请添加图片描述

2.2 深入理解拜占庭将军问题

这个问题实质上描述的是:

  • 恶意节点:系统中存在恶意节点,会故意传递错误信息。
  • 共识协议:需要设计能够容错的共识协议,确保即使有恶意节点,也能保证忠诚节点达成一致。

拜占庭将军问题则进一步探讨了在存在恶意节点时的容错机制,这对于设计健壮的分布式系统(如区块链和分布式数据库)至关重要。

2.3 解决方案

拜占庭将军问题的解决方案主要集中在设计能够容忍拜占庭错误(恶意或故障节点)的共识协议。以下是几种主要的拜占庭容错(Byzantine Fault Tolerance, BFT)协议:

  • Practical Byzantine Fault Tolerance (PBFT)
  • Paxos
  • Raft
  • Tendermint

三、两将军和拜占庭问题的关系

3.1 区别和联系

特性两将军问题拜占庭将军问题
节点数量两个节点多个节点
节点类型都是忠诚节点可能有恶意节点
通信问题通信渠道不可靠,消息可能丢失存在恶意节点传递错误信息,消息可能被篡改
共识难度确保两个节点在不可靠通信下达成一致在存在恶意节点的情况下达成一致
解决方案没有通用解法(理论上无解)拜占庭容错协议(如Paxos、Raft)

3.2 应用与现实意义

两将军问题强调了在不可靠通信环境下达成一致的困难,这在分布式系统的消息传递、确认和重试机制中有所体现。

拜占庭将军问题则进一步探讨了在存在恶意节点时的容错机制,这对于设计健壮的分布式系统(如区块链和分布式数据库)至关重要。

参考资料

《深入理解分布式系统 唐伟志》

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

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

相关文章

使用了代理IP怎么还会被封?代理IP到底有没有效果

代理IP作为一种网络工具,被广泛应用于各种场景,例如网络爬虫、海外购物、规避地区限制等。然而,很多用户在使用代理IP的过程中却发现自己的账号被封禁,这让他们不禁产生疑问:使用了代理IP怎么还会被封?代理…

基于粒子群优化算法的的微电网多目标优化调度----算法改进

前言: 当阅读过前一篇我的博客之后,并且认真去读懂了那篇文章末尾的代码,那么,后续的算法改进对于你来说应当是很容易的了。前文中提及过,粒子群在进行迭代时,每迭代一次,都会根据自己个体最优值…

4 最简单的 C 程序设计—顺序程序设计-4.6 顺序结构程序设计举例

【例 4.14】输入三角形的三边长&#xff0c;求三角形面积。 #include <stdio.h> #include <math.h> // 包含数学函数头文件main() {/* 【例 4.14】输入三角形的三边长&#xff0c;求三角形面积。已知三角形的三边长 a,b,c&#xff0c;则该三角形的面积公式为&…

【Java04】引用变量数组初始化的内存机制

引用类型数组指向的元素也是引用。其本质是&#xff1a; 由一个在栈上的引用数组变量指向一块堆内存&#xff1b;这块堆内存里存储的元素是引用&#xff0c;又分别指向其他堆内存。 class Person // Person是一个自定义的类 {public int age;puiblic double height;public vo…

mybatis-plus使用拦截器实现sql完整打印

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 个人IP&#xff1a;shigen 在使用mybatis-plus&#xff08;mybatis&#xff09;的时候&#xff0c;往往需要…

DDPM公式推导(四)

3 Diffusion models and denoising autoencoders 扩散模型可能看起来是一类受限制的潜在变量模型&#xff0c;但它们在实现中允许很大的自由度。必须选择正向过程的方差 β t \beta_t βt​以及逆向过程的模型架构和高斯分布参数化。为了指导我们的选择&#xff0c;我们在扩散…

解决必剪电脑版导出视频缺斤少两的办法

背景 前几天将电脑重置了&#xff0c;今天想要剪辑一下视频&#xff0c;于是下载了必剪&#xff0c;将视频、音频都调整好&#xff0c;导出&#xff0c;结果15分钟的视频只能导出很短的时长&#xff0c;调整参数最多也只能导出10分钟&#xff0c;My God&#xff01; 解决 首…

Win10“始终使用此应用打开”不见了怎么办?

问题背景 真是服了&#xff0c;昨天家里停电把我电脑系统盘固态烧掉了&#xff0c;于是换了个新的固态给电脑装上新系统。结果这个版本的Win10系统居然无法修改默认应用。具体问题见下面两个图&#xff0c;以py文件为例。 图一&#xff1a;“选择打开方式时没有始终使用此应用…

深入理解指针(四)

目录 1. 回调函数是什么? ​2. qsort使用举例 2.1冒泡排序 2.2使用qsort函数排序整型数据 ​2.3 使用qsort排序结构数据(名字) 2.4 使用qsort排序结构数据(年龄) 3. qsort函数的模拟实现 1. 回调函数是什么? 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数…

计算机组成原理之定点加法与减法运算

文章目录 补码的加减法算法的流程与逻辑实现溢出判断溢出原因单符号位判断双符号位&#xff08;变形补码&#xff09; 基本的加法/减法器舍入方法习题 补码的加减法 数用补码表示&#xff0c;符号位参与运算 考虑几个问题&#xff1f; 1.实际操作能否只取决于操作码&#xff1f…

基于CentOS Stream 9平台 安装/卸载 Redis7.0.15

已更正systemctl管理Redis服务问题 1. 官方下载地址 https://redis.io/downloads/#redis-downloads 1.1 下载或上传到/opt/coisini目录下&#xff1a; mkdir /opt/coisini cd /opt/coisini wget https://download.redis.io/releases/redis-7.0.15.tar.gz2. 解压 tar -zxvf re…

docker拉取镜像太慢解决方案

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 创建daemon.json文件,输入以下信息 vim /etc/docker/daemon.json{"registry-mirrors": ["https://9cpn8tt6.mirror…

搭建WWW服务

1.实验环境的配置 【1】设置windows虚拟机server和test网络属性 打开虚拟机的【开始】菜单->【控制面板】->【网络连接】窗口。 1. 选中【本地连接】右击鼠标&#xff0c;选中【属性】&#xff0c;打开【本地连接属性】窗口。 2. 选择【网络】页签。 3. 在【此连接使…

vue3实现表格的分页以及确认消息弹窗

表格的分页实例展示 效果1:表格按照每行10条数据分页,且编号也会随之分页自增 实现按照页码分页效果 第二页 展示编号根据分页自动增长 固定表格高度 这边设置了滚动条,同时表格高度实现自适应滚动条高度 template部分 表格代码 编号是按照页码条数进行循环并根据索引自增…

理解DDD设计

DDD的理解 领域驱动设计&#xff08;Domain-Driven Design&#xff0c;DDD&#xff09;是一种软件开发方法论&#xff0c;强调将业务领域作为软件设计的核心&#xff0c;以便更好地满足业务需求。DDD认为&#xff0c;软件开发的核心是理解业务&#xff0c;而不是实现技术。在D…

Unity贪吃蛇改编【详细版】

Big and small greedy snakes 游戏概述 游戏亮点 通过对称的美感&#xff0c;设置两条贪吃蛇吧&#xff0c;其中一条加倍成长以及加倍减少&#xff0c;另一条正常成长以及减少&#xff0c;最终实现两条蛇对整个界面的霸占效果。 过程中不断记录两条蛇的得分情况&#xff0c…

Python 踩坑记 -- 调优

前言 继续解决问题 慢 一个服务运行有点慢&#xff0c;当然 Python 本身不快&#xff0c;如果再编码不当那这个可能就是量级上的劣化。 整个 Code 主线逻辑 1700&#xff0c;各依赖封装 3000&#xff0c;主线逻辑也是很久远的痕迹&#xff0c;长函数都很难看清楚一个 if els…

创建STM32F10X空项目教程

创建STM32F10X系列的空项目工程 官网下载STM32标准外设软件库 STM32标准外设软件库 创建一个空文件夹作为主工程文件夹在主工程文件夹中&#xff0c;创建三个空文件夹 CMSIS - 存放内核函数及启动引导文件 FWLIB - 存放库函数 USER - 存放用户的函数将STM32标准外设软件库文件…

弗洛伊德算法——C语言

弗洛伊德算法&#xff0c;是一种用于解决所有顶点对之间最短路径问题的经典算法&#xff0c;该算法通过动态规划的方法计算出从每个顶点到其他所有顶点的最短路径。 弗洛伊德算法的基本思想是逐步考虑每一个顶点作为中间点&#xff0c;更新所有顶点对之间的最短路径。它通过以…

环形链表2证明

解法 快慢指针相遇后&#xff0c;其中一个指回头部&#xff0c;然后同步前进 代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNod…