一、算法故事
希腊岛屿Paxon 上的执法者(legislators,后面称为牧师priest)在议会大厅(chamber)中表决通过法律,并通过服务员传递纸条的方式交流信息,每个执法者会将通过的法律记录在自己的账目(ledger)上。问题在于执法者和服务员都不可靠,他们随时会因为各种事情离开议会大厅,并随时可能有新的执法者进入议会大厅进行法律表决,使用何种方式能够使得这个表决过程正常进行,且通过的法律不发生矛盾。
说明:不难看出故事中的议会大厅就是我们的分布式系统,牧师对应节点或进程,服务员传递纸条的过程就是消息传递的过程,法律即是我们需要保证一致性的值(value)。牧师和服务员的进出对应着节点/网络的失效和加入,牧师的账目对应节点中的持久化存储设备。上面表决过程的正常进行可以表述为进展需求(progress requirements):当大部分牧师在议会大厅呆了足够长时间,且期间没有牧师进入或者退出,那么提出的法案应该被通过并被记录在每个牧师的账目上。
此段摘自百度百科
二、阶段
1、Prepare/Promise阶段
客户端发送由序列号和最新值封装好发送到接受进程,接收进程比较当前持有序列号:如果新序列号大,则发出promise不再接收更小的序列号发送的消息,这个promise发送到准备提交建议新值的进程。
当回复许诺的进程数占所有进程过半数时[X > n/2 + 1],默认达成共识。
2、Propose/Accept阶段
达成共识后,提交建议新值的进程向所有许诺进程发送建议,若所有许诺进程都接受了新值且反馈,则这个新建议将被所有其他进程接受,整个算法过程结束。
如果接受accept过程出现问题,那么此时读操作是会失败的,不过系统此时已经是一致性的状态,paxos会去重复接受阶段让大部分进程接受,读进程只要确认到过半数的一致性新值即可,完成算法过程。
这些只是个人的理解,在此处描述出来。