分布式系统的共识问题
共识是大多数相关人员就一项决定达成的普遍共识。例如,问题可能像朋友试图决定哪家餐厅有多种选择一样简单,也可能像分布式系统上的决策一样复杂。
分布式系统中的共识需求:
在分布式系统中,节点分布在网络中。其中一些节点可能会出现故障(崩溃故障)或开始出现异常行为(拜占庭故障)。在这种情况下,很难做出共同的决定。更简洁地说,
- 有n个进程,其中m个可能有故障。
- 任务是使所有非故障进程在某些值上达成一致,即使在存在故障进程的情况下也是如此。
因此,我们可以通过以下解决方案消除这些问题:
- 没有任何过错的共识
- 最多有 m 个崩溃故障的共识
- 最多有 m 个拜占庭断层的共识
没有任何错误的共识:
网络状态:
- 可靠的通讯媒介
- 同步系统
- 完全连接
- 接收者始终知道消息发送者的身份
脚步:
- 每个进程都会将其值广播给所有其他节点。
- 每个节点都会就他们收到的所有值中的最小值达成一致
- 由于没有错误,每个人都将收到相同的一组值,并且它们的最小值将相同。
最多有 m 个崩溃故障的共识:
网络状态:
- 可靠的通讯媒介
- 同步系统
- 完全连接
- 接收者始终知道消息发送者的身份
脚步:
- 在这样的环境下,至少需要 m+1 轮才能达成共识。
- 在第一轮广播你自己的值,然后从连续的轮次广播节点在上一轮收到的任何新值。
- 一个节点在与其他节点共享值之间可能会发生故障。因此,如果最多 m 个节点可能会失败,那么在最坏的情况下,每次我们试图达成共识时,都会有一个节点失败。
- 如果每个节点都经过 m+1 轮,那么我们确信在这 m+1 轮中,当没有节点失败并且每个人都获得每个值时,肯定会有至少一轮。
- 所以在 m+1 轮之后,每个节点都会选择最小值。
最多有 m 个拜占庭错误的共识:
拜占庭故障:简单来说,拜占庭故障是一些节点开始出现恶意或异常行为的地方。这里的问题是任何这样的节点都可能向两个不同的节点发送两个不同的值,如果发生这种情况,那么我们之前的所有方法都将不起作用。因为之前我们确信如果一个节点发送一个值,那么它将向每个节点发送相同的值。
网络状态:
- 可靠的通讯媒介
- 同步系统
- 完全连接
- 接收者始终知道消息发送者的身份
- S 是所有节点的集合。
- 发起协议协议的节点是指挥官
- 指挥官建议的值是顺序
- 指挥官向其发送命令的其他节点是他的副手。
- OM 代表 Oral Message,这个术语只是为了表明一个节点可以将两个不同的值告诉两个不同的节点。
脚步:
- 我们将在这里展示一种称为Lamport-Shostak-Pease 算法的递归算法来解决拜占庭一般问题。
- 基本情况- OM(0,S) :
- 指挥官 i 将建议值 v 发送给 S 中的每个副官 j - {i}
- 每个副官 j 接受来自 i 的值 v
- 递归案例-OM(m,S):
- 指挥官 i 向每个副官 j ∈ S – {i} 发送一个值 v。
- 设 vj 是副官 j 从指挥官 i 那里收到的值,(如果没有收到值,则为 0)。
- 中尉 j 现在作为指挥官发起OM(m-1, S – {i}) ,其值为 vj。在这些递归执行中的每一个结束时,每个忠诚的副官 j ∈ S – {i} 都同意一组对 (k,vk),每个 k ∈ S – {i} 对应一个。
- 在所有副官完成步骤 3 后,每个副官 j 收集它在步骤 3 中收到的对(它自己的对包含来自其指挥官的原始值,其他对包含其自己的副手通过递归调用OM返回的值) (m,S-{i}) )
- 每个副官 j 都同意这些对中大多数的值v = 大多数 ({ (k,vk) | k ∈ S -{i} } ) 。
这里,
- 当系统是同步的、完全连接的并且节点知道彼此的身份时,到目前为止讨论的所有解决方案都是可能的。
- 在拜占庭故障的情况下,如果 n < (3m + 1),则不可能有解决方案。
- 在异步模型中,即使是一次崩溃失败也无法达成共识。
- 即使在同步模型中,即使在单个链路故障的情况下也无法达成共识。
还有一些许可环境的共识算法,如 RAFT、PAXOS。除了上述讨论之外,还有一些共识算法用于无许可环境,例如工作量证明:它用于比特币。