导读
paxos算法为什么是这么设计?Paxos协议为什么是两阶段?为什么第一阶段的时候需要取一个最大编号?本文尝试从一个简单场景一步步构建出理论框架并转化为可工程化的算法
历史
paxos从诞生至今已经近30年,从开始工业化至今也有10来年历史,但至今仍然难以理解。本文尝试从最简单的场景入手,一步步尝试去推导及理解理论约束中的各个细节点,其中不免有理解不对的地方,请大家能够指正。
解决的问题
首先明确解决的问题,paxos的目的是解决一致性问题。举个简单例子:三个人在三个不同的城市,如果手上只有一支笔和一张不可修改的羊皮纸。大家可以互相写信,经过一段时间,大家羊皮纸上的内容必须完全一样。这就是这个协议要解决的一个根本问题。
理论分析
只有一个Acceptor
先看下最简单的场景,如果只有一个Acceptor,要解决一个Acceptor的共识问题很简单,谁先来提交提议,那我就接受谁的就行了。因为没有多个,不会有提议冲突问题。因为,提出一个约束:
P1:一个Acceptor必须接受他收到的第一个提议。
原论文表述:
P1. An acceptor must accept the first proposal that it receives.
通过满足P1即可解决。这个应该不需要证明。如果真要证明,那用反证即可。
两个Acceptor
假如两个Acceptor,分别为A1,A2。只有一个提议者,这个提议者先对A1提了一个提议(1, V1),对A2提了一个提议(2, V2),假设V1!=V2。 那么按照P1的约束,这里A1和A2都会接受提议。那么此时,A1与A2他们的认知,就会不一致,因此P1无法保证两个Acceptor情况下集群的认知会一致。因此,需要对其进行加强约束。这里因为会存在多个编号,这里为了方便,逻辑上假设每个提议者提交的编号都是递增。
因此,对于多个提议被选定这件事情,我们如果一个提议V被chosen,那后续提交的提议被chosen的也只能是V,这样就能保证所有的被chosen的提议就是V了。
P2:一旦一个具有 value v 的提案被批准(chosen),那么之后批准(