初探一致性协议 Paxos 算法
Posted 随笔涂鸦的小黑板
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初探一致性协议 Paxos 算法相关的知识,希望对你有一定的参考价值。
初探一致性协议(二) Paxos 算法
一、简介
Paxos 算法是一个解决分布式系统中,多个节点之间就某个值(注意是某一个值,不是一系列值)达成一致的通信协议,能够处理在少数派离线的情况下,剩余的多数派节点仍然能够达成一致。
在分布式一致性问题上,有两个著名的问题"拜占庭将军问题"与"两军问题"。
拜占庭将军问题 : 由于不能保证传输过程中消息被篡改,可能导致接收者收到错误的消息;
两军问题 : 在一个不可靠的通信链路上的信息传输问题。
但需要明确的是,Paxos 算法不存在信息被篡改和信道可靠性问题。
Paxos 算法的核心是一个一致性算法(synod 算法),有三种参与角色 :
Proposer : 提议者,产生议题并向 Acceptor 发出提议;
Acceptor : 决策者,决定是否接受 Proposer 的提议。
Learner : 决策学习者,学习最终达成一致性结果。
一般情况下,由 Proposer 产生提议并提交给 Acceptor;如果 Accepter 初步接受提议,则由 Proposer 再次向 Acceptor 确认是否最终接受。如果有多数派个(一半以上)个 Acceptor 最终接受了某提议,并由 Learner 最终学习。所以我们可以看出,Paxos 算法协议的交互逻辑主要集中在 Proposer 和 Acceptor 两种角色身上。
二、算法详解
基于 Paxos 协议构建的系统,只要系统中超过半数的节点在线且相互通信正常就可以对外提供服务,结合Proposer和Acceptor对于提案的处理,可以得到类似于两阶段提交的算法执行过程 : 准备阶段(prepare phase)和提议阶段(accept phase)。
1、准备阶段(Prepare)
Proposer 选择一个提案编号是M0,然后向Acceptor的某个超过半数的子集发送编号为M0的 Prepare 请求。
如果一个Acceptor收到一个编号为M0的 Prepare 请求,且编号M0大于该Acceptor已经响应过的所有Prepare请求编号,那么Acceptor将已经批准过的最大编号作为Proposer的响应,并将不再批准任何编号小于M0的编号。
注意,如果Acceptor因为收到过更大编号的Prepare请求而忽略某个编号更小的Prepare请求或Accept请求,那么它将通知对应的Proposer。
2、提议阶段(Accept)
如果Proposer收到来自半数以上的Acceptor对于其发出编号为M0的Prepare请求的响应,就将发送一个针对于编号M0的提案的Accept请求给Acceptor。
如果Acceptor收到这个编号为M0提案的Accept请求,只要该Acceptor尚未对编号大于M0的Prepare请求做出响应,它就可以通过这个提案。
3、提取提案
在由Acceptor选出提案后,将由Learner获取提案,大体上有几种方案:
最简单的方案,一旦Acceptor批准了一个提案,就将该提案发送给所有的Learner。但是,该方案有一个致命的缺点:每个Acceptor要与所有的Learner逐个进行一次通信。
所有的Acceptor将提案统一发送给一个特定的Learner,并由其负责通知其他的Learner。虽然通信次数大大减少了,但引进了一个新的不稳定因素:主Learner随时可能出现故障。
针对于第二个方案的改进:Acceptor将提案发送给一个特定的Learner集合,集合中的Learner都可以在收到提案后通知其他的Learner。该方案,如果集合中Learner个数越多,可靠性越好,但网络通信的复杂度越高。
三、算法细节
1、提案编号的全局唯一性
获取一个ProposalId,为了保证ProposalId递增,可以采用时间戳+serverId方式生成。
2、编号递增的提案
提案的序号是抢占式的。假设存在这样一种极端情况:有两个Proposer依次提出了一系列编号递增的提案,导致最终都无法选定提案。
解决方案:通过选取主Proposer,就可以保证Paxos算法的活性。
以上是关于初探一致性协议 Paxos 算法的主要内容,如果未能解决你的问题,请参考以下文章