1. paxos算法的背景
Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一,其解决的问题就是在分布式系统中如何就某个值(决议)达成一致。Paxos算法的前提假设是不存在拜占庭将军问题,即:信道是安全的(信道可靠),发出的信号不会被篡改。
1.1 Paxos算法
在Paxos算法中,有三种角色:
- Proposer:提案Proposal提出者
- Acceptor:决策者,可以批准议案
- Learner:最终决策的学习者
Paxos算法安全性前提如下:
- 只有被提出的value才能被选定。
- 只有一个value被选定,并且如果某个进程认为某个value被选定了,那么这个value必须是真的被选定的那个。
Paxos算法类似于两阶段提提交,其算法执行过程分为两个阶段。具体如下
- prepare阶段
- proposer提出一个编号为N的proposal,发送给半数以上的acceptor。
- acceptor收到编号为N的prepare请求后:
- 如果小于它已经相应过的请求,则拒绝回复或者回复error;
- 如果N大于该Acceptor已经响应过的所有Prepare请求的编号,那么它就会将它已经接受过(已经经过第二阶段accept的提案)的编号最大的提案(如果有的话,如果还没有的accept提案的话返回{pok,null,null})作为响应反馈给Proposer,同时该Acceptor承诺不再接受任何编号小于N的提案。(分为两种情况:如果acceptor已经接受过提案,返回接受提案的最大value;如果还没有接受过提案,就返回{pok,null,null})
- accept阶段
- 如果proposer收到半数以上的acceptor回复的编号为N的提案的prepare响应,那么会发送一个针对[N,V]提案的Accept请求给半数以上的Acceptor。注意:V就是收到的响应中编号最大的提案的value。如果响应中不包含任何提案,那么V就由Proposer自己决定,可以是任意值。
- 如果Acceptor收到一个针对编号为N的提案的Accept请求,只要该Acceptor没有对编号大于N的Prepare请求做出过响应,它就接受该提案。如果N小于Acceptor以及响应的prepare请求,则拒绝,不回应或回复error(当proposer没有收到过半的回应,那么他会重新进入第一阶段,递增提案号,重新提出prepare请求)。

图来自:Zookeeper系列(3)--Paxos算法的原理及过程透彻理解_冷面寒枪biu的博客-优快云博客_zookeeper算法 从上一篇我们了解了2PC和3PC之后,我们可以发现,无论是二阶段提交还是三阶段提交都无法彻底解决分布式的一致性问题以及无法解决太过保守及容错性不好。Google Chubby的作者Mike Burrows说过,世上只有一种一致性算法,那就是Paxos,所有其他一致性算法都是Paxos算法的不完整版。Paxos算法是公认的晦涩,很难可能能将清楚,但是工程上也很难实现,所以有很多Paxos算...
https://blog.youkuaiyun.com/u013679744/article/details/79222103
过半的acceptor都接受提案后,learner会自动感知到,并开始学习提案。(同一个进程可以同时扮演多个角色)
1.2 Learner的学习过程
learner学习过程包含两种场景:
- Learner所在节点参与了提案选举,Learner需要知道其接受(accept)的提案值是否被选中(chosen)。
- Learner所在节点已落后于其他节点,Learner需要选择合适的策略快速完成追赶,并重新参与到提案选举当中。
1、选中通知
正常情况下,所有节点处于online状态,共同参与paxos选举。为了避免instance id冲突,paxos建议只由主节点的proposer发起提案,保证接受提案和习得提案编号一致。此时,Learn习得的提案值实际上就是本节点Accept的数据,因此learner只更新内存状态即可,无需再次落盘(acceptor已落盘)。最后,如果存在follower节点,数据同步到follower(follower节点不参与paxos算法,相当于某个paxos节点的同步备)。
2、提案值追赶
一旦节点处于落后状态,它无法再参与到paxos提案选举中来。这时需要由learner发起主动学习完成追赶。Paxos启动时,启动learner定时器,定时发送learn请求到各个节点,发送请求携带本节点的Instance ID、Node ID信息。各节点收到该请求后,回复数据自主完成学习过程。

1.3 paxos常见问题:
问:learner如何知道某个提案是否被选中呢?
答:“3.1 选中通知”是通知各个learner值是否已被选中的一种常规方式。
问:如果某个值被选中后,提案发起节点异常,选中消息未发出会如何?
答:重新发起选举,新的被选中的提案编号不同,但提案值保持不变。
问:“3.1 选中通知”中,只更新了内存状态

本文深入解析Paxos、Raft及ZAB算法,探讨分布式一致性问题解决方案。涵盖算法原理、执行流程、安全性保证及应用场景,适合分布式系统研究者与开发者。
最低0.47元/天 解锁文章
7037

被折叠的 条评论
为什么被折叠?



