携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情 >>
简介
Paxos是最常见的共识算法之一。共识就是达成统一意见。共识算法是允许在具有一致性约束的分布式系统中满足一致性约束的机制之一。
为什么系统需要达成共识?
-
因为单机性能有限,需要多台机器解决计算和存储问题。
-
多台机器存在听哪个的问题
- 如果是主从架构,需要使用共识算法选出主节点;
- 如果没有主节点,需要共识算法达成一致
从 CAP 看 Paxos 算法
Paxos 算法的目的是要 在消息可能会延迟、丢失、重复的基于消息传递通信模型的分布式系统中就某个值最终达成一致。
Lamport 提出的 Paxos 算法包括两个部分:
- Basic Paxos 算法:多节点如何就某个值达成共识
- Multi Paxos 思想:执行多个 Basic Paxos ,就一系列的值达成共识
paxos有三个角色
- proposers:提案者/提议者:提议一个值,用于被投票决议
- acceptors:附议者/接受者:对每个提议进行投票(只接受其中一个提案)
- learners:学习者/被告知者:被告知投票决议的结果,对其学习,不参与投票过程
ps:
- 一个节点可以同时担任多个角色,节点必须知道总节点有多少
- 节点数据必须要持久化,不能忘记已经达成一致的数据
- 目的是达成一个共识。一旦达成共识,不能提出新的提案
Paxos算法流程:
Paxos分准备阶段和批准阶段两个阶段完成,每个阶段后还需要判断该阶段的结果是否有效是否需要重来,另外需要注意提案编号全局递增且唯一。
-
第一阶段:prepare准备阶段(只需携带提案号):
-
Proposer请求prepare
- proposer选择一个提案编号PID并将prepare请求发送给所在分区中的所有acceptor;
- PID必须唯一,超时就重新发一个更大的PID
-
Acceptor响应promise
- 情况1:PID < acceptor的最大PID MaxN 不回应或回应错误提醒
- 情况2:acceptor从未承诺(promise)过提案 acceptor记录最大PIDMaxN为n,回应 ok
- 情况3:PID > acceptor的最大PID MaxN acceptor记录最大提案编号MaxN为n,回应 ok,如果已经接受过提案,则将接受过的PID和值(AcceptN和AcceptV)一并回复
-
-
判断:如果propose收到超过半数的ok,则进入批准阶段,否则重新回到准备阶段
-
第二阶段:批准阶段(携带PID和值):
-
Proposer请求Propose proposer向所有回复ok的acceptor发送accept请求,包括编号n和 上一阶段拿到的最大的AcceptN 所对应的 AcceptV(如果没有已经接受的value,那么它可以自由决定value)。
-
Acceptor响应Accept
- 情况1:PID < acceptor的最大提案编号 MaxN 不回应或回应错误提醒
- 情况2:PID >= acceptor的最大提案编号 MaxN 批准请求,回应 ok,记录AcceptN=n,AcceptV=value(如果之前已经有AcceptN和AcceptV,这个时候也会覆盖!)
-
-
判断:如果Proposer收到超过半数的ok,则选举结束,将结果通知给 Learner,否则重新回到准备阶段
-
补充
- Basic-Paxos只会选择一个值。基于此需要一个两阶段协议,对于已经Chosen的值,后面的提案也要使用相同的值