在讲述分布式的共识问题之前,我们先了解下什么是拜占庭将军问题, 其次从拜占庭将军问题来认识什么是分布式共识问题,与分布式一致性的区分在哪里?然后推演分布式共识问题产生的原因以及解决共识问题的策略算法有哪些,对应的适用场景有哪些?接下来我们可以带着疑问来逐步揭开上述问题的本质.另外这里要先说明一点,这里讲述的服务节点不可用包含网络超时/服务节点出现故障/网络通信被伪造等情况.
拜占庭将军问题
拜占庭一般性问题
- 拜占庭军队中的每一个师都有自己的将军,并且由该将军负责指挥作战
- 现在拜占庭军队中的将军存在一些叛徒,将军们可以通过信使进行相互沟通作战方案
- 现在对拜占庭军队要求是:
- 所有忠实的将军都能够采取相同的作战计划.
- 少数叛徒不会使忠诚的将军们采取错误的计划从而导致最终的作战失败.
问题重述
- 所有忠诚的将军都得到同样的信息,他们将以某种方式得到同样的决定
- 一个忠诚的将军发出的信息应该被所有其他忠诚的将军所采用
什么是拜占庭将军问题
基于上述的问题的理解,假设现在拜占庭军队中有三个师,每个师都有自己的将军,现在要准备开始作战计划攻打城池,现在需要满足上述讲到的要求,即保证每个师的忠诚将军都能够采取相同的作战计划以防止被叛徒信息误导采取错误的决定.此时需要每个师派发行使进行通信协商,同时为了保证协商存在可靠性,即下面的半数投票的可靠性.
少数服从多数的投票可靠性
- 每个师的将军可以发表自己对作战方案的计划,并通过信使通知其他师的将军们
- 其次,每个师的将军接收到其他师的将军们的作战方案时候,采取默认少数服从多数的方案作为作战方案执行.
这个时候我们可以看到,每一个师的将军都能够提供方案,说明是具备作战的指挥权的,相对地,其他师的将军就作为副官,负责执行作战方案.于是对于一个拜占庭将军问题可以进行以下归纳.
拜占庭将军问题
我们可以将问题进行简化为一系列由一个指挥官和多个副官组成的问题,即拜占庭将军问题:
- 如果所有的副官都是忠诚的,那么他们必然遵循相同的作战命令
- 如果指挥官是忠诚的,那么所有忠实的副官也都会遵循其所发出的命令
简而言之,拜占庭将军问题就是如何在可能存在有叛徒的情况下,采取合适的通信机制来保证忠诚的将军能够达成共识采取一致的作战计划.
不可能的结果
如果忠实于将军的将军少于或等于2/3,则不存在解决方案.
分布式共识问题
什么是分布式共识问题
基于拜占庭将军问题的分析,我们将其翻译为分布式系统相关的术语,并对其进行阐述如下:
- 拜占庭将军: 即分布式系统的服务节点
- 忠诚的拜占庭将军: 即分布式系统服务正常运作的服务节点
- 叛变的拜占庭将军: 出现故障并发送误导信息的服务节点
- 信使被杀: 服务节点之间出现通信故障,导致信息丢失
- 信使被间谍替换: 服务节点进行网络通信过程中信息被黑客攻击,通信存在劫持以及信息伪造
而分布式共识问题就是在分布式系统中,我们要如何保证系统服务节点之间的通信接收到的消息指令都是可靠且一致的.
分布式共识与一致性区分
在讲述分布式的共识与一致性之前,我们先来看下上述的图解,用户发起请求向分布式系统集群服务请求资源然后服务资源给予响应,这个时候我们考虑以下的场景:
- 首先,用户A先发起一个事务操作的请求到集群服务,这个时候集群服务接收到事务操作请