分布式系统中只存在“一种”一致性算法,那就是Paxos算法。前面提到的一致性看起来很容易实现,但是这都是建立在无故障或者允许无限等待或恢复的基础上。比如2PC就是无限等待协议,投票需要所有人都在。显然,这种方式在容错方面表现不好。Paxos是容错的分布式一致性算法,尽管节点可能会出错,网络会发生故障或者延迟,但所有节点都会同意相同的值。
一致性的要求
正确性:满足一致性的定义;
容错:少部分节点挂了不影响整个过程;
可停止。
但是Paxos算法只能保证前两项。Paxos的目标是让所有的接受者同意提案。
Paxos中出现的角色
客户端:发起请求
提议者(Proposer):接收请求并执行协议,领导者(Leader)为选举出来的协调者;
接受者(Acceptor):记住协议的状态,法定人数(Quorum)为任意大部分接受者的集合;
学习者(Learner):当一致意见抵达时,学习者执行请求或者发送回复给客户端。
粗略的过程:一个提议者决定成为一个leader,leader提出一个值并让大多数接受者接受。leader宣布结果或者重新再提议。
每个节点同时为一个提议者,一个接受者,一个学习者。
详细流程
阶段0:客户端发送请求给一个提议者;
阶段1a:指挥者创建提议N,发送给法定人数(N比该提议者使用的任何之前提议的编号都要大);
阶段1b:接受者收到提议,如果提议N比之前提议大,那么回复leader过去提议最高的编号和值,并承诺忽视所有小于N的提议;如果提议N比之前的提议小,直接忽略掉,提议被拒绝。
阶段2a:leader如果收到了足够的允诺,则设定提议的值为V,V可以是决定好的也可以是最新的值,并发送带有N和V的接收请求给法定人数。
阶段2b:对于接受者,如果提议仍然保留,注册V值,发送已接收信息给提议者和学习者;否则,忽略该请求。
阶段3:学习者回复客户端或对请求进行操作。