本文以《Paxos made simple》为蓝本,分析Leslie Lamport大神设计Paxos算法(适用于异步非拜占庭故障下的分布式系统)的思路。
大神先从共识算法(Paxos算法是共识算法的一种)开始,首先介绍了一下共识算法是干啥的:共识算法可以确保所有被提出的值中,只有一个值能被选中(chosen)。如果没有值被提出,那么没有值会被选中。如果一个值被选中了,那么进程应该可以学习(learn)这个被选中的值。简单来说,就是确保只有一个值被选中。
知道了共识算法是干哈的之后,对于共识算法,一般有两个重要的特性:
1. 安全性(Safety),要求如下:1)只有被提出的值才可以被选中;2)只有一个值能被选中;3)除非值被选中了,否则进程不会知道它被选中了,即:进程只学习已经被选中的值;也就是,如果满足这三点,我们称共识算法满足了安全性。
2.灵活性(liveness)。灵活性的目标是确保某个被提出的值最终可以被选中,并且如果一个值被选中,进程最终可以学习该值。
Paxos算法设计的过程实际上是想方设法尽力满足这两种特性的过程。据此,大神在设计Paxos算法中,设计了三种角色:
1.提出者,主要负责提出值
2.接受者,主要负责接受值,在确保一个值被选中的过程中,发挥重要作用
3.学习者,学习选中的值
其中,每个进程都可以同时扮演这三种角色。具体每种角色会做什么,接下来会详细介绍。
至此,是一些Paxos算法设计的背景介绍。接下来,大神首先从安全性出发,尝试使Paxos算法可以满足安全性。
首先,1)只有被提出的值才可以被选中,不难满足,只要让所有的进程只处理提出者提出的值,尝试令其选中,即可满足。
但是,2)只有一个值能被选中,是设计的难点。想一下,有很多值可以被提出,两个不同的进程