2.2 结果一致性
在分布式对等网络中,存在需要就某个问题达成一致的情况,问题可能是多种多样的,但最终目标是在整个系统内就最终结果取得一致,本书称这类问题为“结果一致性”。
拜占庭将军问题描述的是某些成员节点(单计算机系统)或网络链路(通信系统)出现错误,甚至被蓄意破坏者控制的情况。分布式系统需要采取某种行动解决此类问题,而采取何种行动,其过程就需要通过某种规则/协议进行规范。在规则/协议的规范下,取得系统范围内的一致共识,即达成结果一致,这就是共识问题,即结果一致性问题。但需要注意的是,达成共识未必是拜占庭将军问题所独有的,拜占庭将军问题中的达成共识属于节点间无信任关系的共识问题,而节点间存在信任关系时也有需要达成共识。
2.2.1 共识问题形象化描述:拜占庭将军问题
著名的拜占庭将军问题是被Lamport在参考文献[86]中用来描述结果一致性的一个故事。这个问题本质上是分布式对等网络通信容错问题,即客观上保证多节点对通信结果达成一致。更广泛的理解是,拜占庭将军问题是一个如何让分布式系统的所有节点保持共识和在特定条件下保持正确性的问题。其故事背景如下。
拜占庭位于现在土耳其的伊斯坦布尔,是东罗马帝国的首都。当时的拜占庭罗马帝国国土辽阔,拥有多支军队(分布式系统),每支军队分别由一位将军带领。因为军队驻地间相距很远,故将军与将军(每位将军都是一个单独的节点)之间只能靠信差传消息。
发生战争的时候,所有将军必需达成共识(目的:保证所有节点间对最终发出的数据/消息或做出的决定保持一致),以决定是否去攻打敌人的阵营。但是,这些将军中可能有叛徒和敌军间谍,这些叛徒会扰乱或左右决策的过程(多个节点之间的消息传递不可靠,这是分布式系统的典型特征,需要在设计算法时特别考虑)。
现实情况:在已知有叛徒(部分节点不可靠,传递的消息可能会延迟发送、多次发送或丢失、被篡改[1]。但分布式系统的一致性协议,如Paxos、Raft等,不考虑被篡改的可能,只考虑消息丢失的情况,这是因为Lamport先生在(参考文献[162])中对问题进行了限定,算法保证了消息一定不可被篡改)的情况下,忠诚的将军在不受叛徒影响(只有大部分节点可靠整个分布式系统才可靠,但不知道哪些节点可靠)的情况下如何达成一致的协议,就是拜占庭将军问题。
参考文献[86]证明,当错误节点个数不超过总节点个数的1/3时(n>=3m+1,n表示总节点个数,m表示容忍的错误节点个数),存在有效的算法,使得所有成员最终接受大多数成员做出的决定,即忠诚的将军们总能达成一致的结果。所以一个分布式系统中,节点通信故障(节点或连接节点的网络)的个数不超过分布式系统中的全部节点个数的1/3时,此分布式系统仍然能保持可用性。分布式系统为支持高可用的特性,多采用多副本机制存储数据,而副本个数即由此规则确定。例如,要容忍单节点故障,需要4个副本(3×1+1);要容忍2个节点故障,需要7个副本(3×2+1)。但是,需要注意的是,拜占庭将军问题容忍了消息篡改,而现在设计分布式数据库系统时,多不考虑消息篡改问题,因此上述算法并不实用。多副本构建的可用性和可靠性依赖的是多数派技术。
2.2.2 结果一致性的应用
拜占庭将军问题在分布式数据库系统中的应用分为两种。这两种应用情况都可通过对通信过程的规范达成最终取得一致结果的效果。
- 应用情况一:当同一份数据存在多个副本时(高可用的要求),所有副本之间如何达到数据的一致性。所以,拜占庭将军问题不是事务的一致性问题,而是分布式一致性问题。
- 应用情况二:多个节点(含有同一份数据)之间如何就某个问题达成一致,如怎么从多个候选者中选择出一个Leader(领导者)。
通常在分布式数据库中,不需要考虑消息篡改的情况,因此分布式数据库中面临的并不是真正的拜占庭将军问题,而是拜占庭将军问题的简化版本。3.5节和3.6节将讨论结果一致性的解决方案。
[1]引自参考文献[162]:Messages can take arbitrarily long to be delivered, can be duplicated, and can be lost, but they are not corrupted.(消息交付可以花很长时间,可以复制,可以丢失,但不能被篡改。)注意,消息没有被篡改是非拜占庭将军问题,消息被篡改则是拜占庭将军问题。