拜占庭将军问题

分布式一致性问题

Posted by bbkgl on October 15, 2019

情黯黯

闷腾腾

身如秋后蝇

最近一直在看分布式存储相关的东西,然后都提到了一个问题,拜占庭将军问题。既然绕不过,索性我就把这些都看一下。

引用百度百科的定义:拜占庭将军问题(Byzantine failures),是由莱斯利·兰伯特提出的点对点通信中的基本问题。含义是在存在消息丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的。因此对一致性的研究一般假设信道是可靠的,或不存在本问题。

故事

拜占庭位于如今的土耳其的伊斯坦布尔,是东罗马帝国的首都。由于当时拜占庭罗马帝国国土辽阔,为了达到防御目的,每个军队都分隔很远,将军与将军之间只能靠信差传消息。 在战争的时候,拜占庭军队内所有将军和副官必须达成一致的共识,决定是否有赢的机会才去攻打敌人的阵营。但是,在军队内有可能存有叛徒和敌军的间谍,左右将军们的决定又扰乱整体军队的秩序。在进行共识时,结果并不代表大多数人的意见。这时候,在已知有成员谋反的情况下,其余忠诚的将军在不受叛徒的影响下如何达成一致的协议,拜占庭问题就此形成。

其实这个假设是对现实世界的一种模型化,计算机网络系统也会因为硬件故障及网络失效等问题出现类似的问题,就比如现在的分布式系统的一致性

针对这个故事我们总结出如下三个问题:

  1. 类似的分布式一致性问题是否有解呢?
  2. 什么条件下有解?
  3. 有解的话,有什么特定的算法可以实现呢?

前两个问题 Lamport 在论文《拜占庭将军问题》已经回答,而第三个问题在后来的论文 《The Part-Time Parliament》中提出了一种算法并命名为 Paxos。

后话

其实故事最后提到的Paxos不是这篇文章的目的,学习Raft才是我去了解“拜占庭将军”问题的目的。文中大部分文字来源于博文Raft 为什么是更易理解的分布式一致性算法,这篇文章会是后面我要学习Raft的重要参考。