Basic Paxos
[TOC]
什么是Basic Paxos
确定一个值
Basic Paxos描述的是多个节点如何就某个值达成共识。
三种角色
在Basic Paxos中,有提议者(Proposer)、接受者(Acceptor)、学习者(Learner)三种角色:
- 提议者(Proposer):提议一个值,用于投票表决。一般来说,客户端扮演提议者的角色。
- 接受者(Acceptor):对每个提议的值进行投票,并存储接受的值。一般来说,集群中的所有节点都扮演接受者的角色,参与共识协商,并接受和存储数据。
- 学习者(Learner):被告知投票结果,存储达成共识的值,不参与投票。一般来说,学习者是数据备份节点。
如何达成共识
paxos是一个二阶段提交协议,包括准备阶段和接受阶段。
准备阶段
提议者向所有接受者发送包含提案编号(注意:不需要包含提议值)的准备请求。
-
接受者接收到准备请求后,
如果准备请求的提案编号,小于等于接受者已经响应的准备请求的提案编号,那么接受者将承诺不响应这个准备请求。
如果接受者之前没有通过提案,就发回一个尚无提案的准备响应。
如果接受者之前有通过提案,那么接受者将承诺,会在准备请求的响应中,包含已经通过的最大编号的提案信息。
-
提议者接收到响应后,
如果提议者接收到的准备响应少于半数节点,不发送接受请求。
如果提议者接收到不少于半数节点的响应,根据响应中提案编号最大的提案的值,设置接受请求中的值。
接受阶段
提议者发送接受请求。
-
接受者接收到接受请求后,
- 如果接受请求中的提案的提案编号,小于接受者已经响应的准备请求的提案编号,那么接受者将承诺不通过这个提案。
- 否则,接受者存储这个值,并将其通知给所有的学习者。
如果集群中有学习者,当接受者通过了一个提案时,就通知给所有的学习者。当学习者发现不少于半数的接受者都通过了某个提案,那么它也通过该提案,接受该提案的值。