本文翻译自:伊利诺伊大学厄巴纳-香槟分校助理教授 Ling Ren 开设的讨论课:CS598 Consensus Algorithm
参考论文:
1998原论文,贼难懂lamport.azurewebsites.net 2001简单版本,Lamport觉得我们太蠢了www.microsoft.com前言
前两篇文章我们证明了FLP不可能原理———在一个异步混沌的环境下,只要有一方可能发生错误,就不存在一个算法能够达成共识(同时达到安全性和存活性)。
那岂不是这个领域没有继续研究下去的必要了?Lamport想出了一个取巧的方法——放宽这个异步网络的定义,从而让存活性达到可能。这就是部分同步网络(partial synchronized network)的由来
部分同步网络的一种定义
我们知道在异步网络中,消息的传递时间是没有上限的。在部分异步网络中,我们定义这个消息在一个未知的时间上限内会到达。
这个定义和异步有什么区别呢?区别在于:我们可以在算法中等待一条消息的到达。在算法的存活性证明中我们可以声明”因为消息一定会到达,所以算法一定会进行下去“;
那这个定义和同步网络有什么区别呢?区别在于,我们不能在算法中使用这个值
Paxos问题描述
Paxos需要解决的问题是状态机复制问题(state machine replication):
在一个系统中有一群客户端和一群服务端,要求服务端提供一种服务,让所有客户端发出请求(输入)后认为服务端运行的是同一个状态机(同一个服务器)
![d4dd996fcbff2823afb1c693116fb6bb.png](https://img-blog.csdnimg.cn/img_convert/d4dd996fcbff2823afb1c693116fb6bb.png)
在Paxos的算法描述中,我们简化问题为:只确定一个最终值。这个算法可以轻松的扩展为多个值的序列(引入时间戳变量,并行运行多个paxos算法),从而解决状态机复制问题
网络环境:部分同步网络
节点错误类型:故障错误
错误节点数量:n=2f+1
身份认证:不需要
算法描述
![3a2d13218b5906c1ae5b35cbeb2cb4b8.png](https://img-blog.csdnimg.cn/img_convert/3a2d13218b5906c1ae5b35cbeb2cb4b8.png)
安全性证明
下面我们将证明这个算法的安全性:
如果某个节点在第k个视图(view)提交了 v, 那么只要一个提议的视图值晚于该视图 (k的值比较大),那么这个提议一定带有值 v
证明:如果某个节点在第k个视图(view)提交了 v, 那么至少有 f+1 个节点锁定了 v 和 k。
在新的视图中,新的leader 一定会拿到 f+1 个状态信息 status,那么至少有一个节点会带有信息 v 和 k (n=2f+1)。 显然这个k的值是最大的,这个 v 一定会存在与新 leader 的提议中
总结
该算法利用了两个多数群体一定存在重叠的原理,在存在故障错误的情况下也可以保证之后新的提议也会带有原来多数人采纳的提议,使接纳这个提议的人数越来越多,最终一定能够达到共识 (因为success消息最终一定会传播给所有节点)。这个算法看上去简单,实际上却是十分巧妙的。