分布式系统中的共识

97 阅读3分钟

异步系统中的共识

一个适用于异步系统的共识算法,也能被用于同步系统,反之并不成立

FLP不可能定理

在一个完全异步的系统中,即使只有一个节点出现了故障,也不存在一个算法使系统达成共识 在一个异步系统中,进程可以在任意时间内返回响应,我们没有办法分辨一个进程是延迟响应还是已经 崩溃;因此,我们无法在有限时间内达成共识,不满足终止性 一个分布式共识算法需要满足两个属性 安全性:所有正确的进程都认同同一个值 活性:分布式系统最终会认同某一个值 我们无法同时拥有安全性、活性和容错性 一般有三种方法来绕过FLP不可能定理

  1. 故障屏蔽
  2. 故障检测器
  3. 随机性算法

故障屏蔽

想办法将异步系统转换为同步系统,故障屏蔽就是第一种方法 故障屏蔽假设故障的进程最终会恢复,并找到一种重新加入分布式系统的方式。如果没有收到某一个进程 的消息,就一直等待,直到收到预期的消息 常见的一种方式是,进程在持久化存储中保留了上下文信息,在崩溃重启后能利用这些数据继续工作

故障检测器

进程可以通过某种故障检测器来确认没有响应的进程是否已经发生了故障 一种最常见的故障检测器就是超时故障检测器,即如果进程在一定时间内没有响应,那么即便该进程没有 发生故障,我们依然认为该进程已经失效 对于故障检测器的要求必须是精确的,不然会导致系统经常放弃一个正常的进程;例如超时故障器,如果 超时时间设置不合理,那么可能会导致系统长时间阻塞等待或网络分区 因此,故障检测器必须拥有两个属性 完全性:每一个故障的进程都会被每一个正确的进程怀疑 精确性:正确的进程不会被别的进程怀疑 但是实现完美的故障检测器是比较困难的,只要通信可靠,失败的进程不超过N/2,这种不完美的故障检测 器仍然是可用于解决共识问题 最终弱故障检测器,具备以下性质 最终弱完全性:每一个故障的进程最终都会被一些正确的进程检测到 最终弱精确性:经过一段时间后,一个正确的进程不会被其他正确的进程怀疑

进程正确运行时,网络延迟也会导致故障检测器错误怀疑进程发生了故障,但最终故障检测器能够检测到进 程真的发生了故障 image.png

随机性算法

随机算法的输出不仅取决于外部输入,还取决于执行过程中的随机概率;随机性算法使得敌人 无法有效地阻碍系统达成共识,即实现拜占庭容错 例如区块链这类应用的共识是基于哪个节点最快计算出难题来达成的,而这个节点是不可预期 的、随机的

同步系统中的共识

上述提到的方法,目的都是让系统转换成部分同步 在同步系统重,有不超过f个进程发生故障,且错误进程数量f小于总进程数n,那么经过f+1轮 消息传递后即可达成共识 后续会讨论非拜占庭容错的Paxos算法和Raft算法,以及拜占庭容错的PBFT算法