两军问题
我们来看一下好处理器的情况,但通信线路有问题。这就是所谓的两军问题,可以概括如下:
A,B 两军师协同攻击敌军C, A和B在物理上是分开的,并使用信使进行通信。 A向B发送一个消息“ 让我们在黎明发起攻击 ”。 B收到消息并同意,用“ OK ”消息发送回信使者。信使到达A,但是A意识到B不知道信使是否安全地返回了。如果B不相信A得到了承认,那么就不会相信这次袭击应该发生,因为军队不会自己胜利。 A可以选择用“ A received the OK ” 的消息将信使发送回B,但A将不确定B是否接收到该消息。二军的问题表明,即使与没有缺陷的处理器,两个进程之间可证明协议是不是 可以用不可靠的通信通道。
在现实世界中,我们需要在通信和计算速度上设置上限,并且如果在有限的时间内没有响应,就要考虑一个过程是有缺陷的。
失败 - 停止,也称为失败 - 沉默,是失败的进程不通信的条件。
拜占庭故障是有故障的过程继续进行通信,但可能会产生错误信息。我们可以创建一个弹性的失败停止的共识算法。如果有n个进程,其中t可能有错误,那么进程永远不会期望收到超过(nt)个确认。现在一致的问题是要确保所有进程都做出相同的决定,即使每个进程从一组不同的进程接收(nt)答案(可能是由于部分网络分段或路由问题)。
故障停止弹性算法可以被演示如下。这是一个迭代算法。每个阶段包括:
- 一个进程广播它的首选值和它所看到的也有这个首选值的进程的数量(这个计数被称为基数,最初为1)。
- 该过程接收(nt)答案,每个答案都包含一个首选值和基数。
- 然后该过程可以改变其优选值,根据哪个值是其他过程最喜欢的值。它将相应的基数更新为已经收到的响应数量加上它本身。
继续这个过程,直到一个进程接收到至少有n / 2个基数的单个值的t个消息。这意味着至少有一半的系统已经达成了相同的价值。在这一点上,再运行两个阶段,播放这个值。
随着阶段的数量达到无穷大,未达成共识的可能性接近0。
为了更容易在现实世界中开发算法,我们可以放宽异步的定义并允许一些同步。
系统中可能存在几种不同步:
- 进程异步:进程可能会进入睡眠状态或暂停任意时间。
- 通讯异步:消息到达目的地的时间没有上限。
- 消息顺序异步:消息可能以不同于发送的顺序传送。
已经证明[Dolev,Dwork,Stockmeyer]认为,使流程同步是不够的,但是以下任何一种情况都足以使共识协议成为可能:
- 进程和通信同步:在进程休眠时间和消息传输上设置一个上限)。
- 进程和消息顺序同步:在进程休眠时间和消息顺序上设置一个上限)。
- 消息顺序同步和广播能力。
- 通信同步,广播能力和发送/接收原子性。 发送/接收原子性意味着处理器可以执行接收消息,执行计算和发送消息到其他进程的操作。
拜占庭在同步系统中的失败
拜占庭将军问题的解决方案并不明显,直观或简单。他们不在这些笔记中。
我们研究了通信线路不可靠的情况,通信可靠或失败。另一个需要考虑的情况是可靠的通信线路,但是有故障的(不是故障停止的)处理器。拜占庭故障是失败的处理器,而不是保持安静(故障停止),而是与错误的数据通信。
拜占庭将军问题
拜占庭将军问题 说明了可靠的通讯线路和拜占庭式失败的共识。
在这个问题上,有n个陆军将领分头。通信是可靠的(无线电或电话),但是 将军中的m是叛徒(有故障),并试图通过向他们提供不正确的信息来防止他人达成一致。问题是忠诚的将军还能达成一致吗?具体来说,每个将军都知道他的部门的规模。在算法的最后,每个将军都可以知道其他忠诚部门的兵力吗?
Lamport展示了一种适用于某些情况的解决方案。他的回答这个问题是,任何解决方案克服的问题米叛徒需要至少3 名 1参与者(2 名 1忠实将领)。
这意味着超过三分之二的将军必须是忠诚的。此外,已经证明,没有协议可以用少于m + 1轮消息交换和O(mn 2)消息来克服m个故障。如果n < 3m + 1那么问题就没有办法解决。
显然,这是一个相当昂贵的解决方案。
尽管拜占庭模型可能适用于某些类型的专用硬件,但在通用分布式计算环境中很少有用。
拜占庭将军问题使用签名的消息是有变化的。这意味着来自忠诚将领的讯息不能被伪造或修改。在这种情况下,存在可以实现达成共识的值算法Ñ ≥ M + 2,其中
n =处理器
总数m =故障处理器总数