学习了1个多月,现在回头看,觉得要理解paxos算法,需要阅读下面三篇论文:
The part-time parliament [英文] [中文]
Paxos Made Code [英文]
前两篇更多的是理论,第三篇介绍了paxos的实现。
阅读第三篇还是很有必要的,在看第三篇之前,我一直不理解一个paxos的instance到底指的是什么。
术语
ballot、提案、提议:一轮投票
决议、decree:状态proposed候选的值,同时发起的请求的值,可能取的值;状态passed确定的唯一值,一致的值,写到律簿的值
投票、vote:同意该提案的值
承诺、promise:出现在承诺不再接受某些提案
律簿、法典、ledger:记录通过的决议,包括一个编号,以及对应的内容。
实例编号、instance No、decree number:对应律簿中的编号
提案编号、ballot No:每个提案的编号不能重复
法定人数集、quorum:牧师这群人中的一部分,一般是多数派就行。
Leader、president:从proposer中选出来的,只让它发起提案
Basic Paxos算法能从众多的请求中唯一地确定一个值,Multi Paxos则是多次运行Paxos实例,从而得到一个唯一的序列。
Paxos算法角色
Proposer 发出提议 (提案:一个提案proposal,提案中含有决议(value))
Acceptor 参与投票
Learner 学习通过的决议
Acceptor被动参与投票。Paxos算法规定了Proposer和Acceptor的原则。
一个一致性算法需要保证:一次选举中只批准一个决议(value),只有被提出(proposed)的决议才能被批准,只有已经被批准的决议才能被学习(即可以执行或保存这个决定的内容)。
1.决议(value)只有在被 proposers 提出后才能批准(未经批准的决议称为“提案(proposal)”);
2.在一次 Paxos 算法的执行实例中,只批准一个 Value;
3.learners 只能获得被批准(chosen)的Value。
safety condition:If in round M a proposal V is chosen, then every higher-numbered proposal must have value V.
数学结论(β:表决集合)
B2(β):β中任意两个表决的法定人数集(quorum)至少有一个牧师是相同的。
B3(β):对β中任一表决B,如果B的法定人数集中有牧师在之前的表决投过赞成票。那么,表决B的 法令的内容应与那些投票的表决中最近的那轮的法令一致。
# | decree | |||||
2 | α | A | B | F | ∆ | |
5 | β | A | B | F | E | |
14 | α | B | ∆ | E | ||
27 | β | A | F | ∆ | ||
29 | β | B | F | ∆ |
A1:因为可能有多个Proposer提出议案,它们提出的议案的编号是没有交集的。每个牧师都有一个无限的表决编号集合单独供自己使用。
满足B1(β), B2(β), B3(β)
保证一致性:同一个法令编号,一旦达成结果。今后都将会是同一个结果,因为B3,无法篡改。只达成一条一致的法令
不保证进展性
初级协议 Preliminary protocol
使B2成立: 选择法定人数集
使B3成立:p在发起表决前,需要找出Maxvote(b,Q,β)dec,也就是对于Q中的每一个q找出Maxvote(b,p,β)(编号最大的投票)。
一个牧师p在发起表决之前,需要找出MaxVote(b, Q,