Lamport描述了一个名为Paxos的希腊城邦(算法得名于此),这个城邦是按照民主的议会制度来进行选举的,所有的居民进行提议和投票来选出决议。但是居民们不想花时间一直在选举上,大家都不定时地来提议、了解提议、投票、看进展等等
CAP定理指 在一个分布式系统中,无法同时满足 CAP 3个特性。 在分布式系统中,分区是必须面对的问题,因此P是一定要成立的。
在满足分区容错性(P)的前提下,一个分布式系统只能满足 一致性(C)或者 可用性(A)
像zk之类的配置中心对一致性要求较高,一般都是CP
共识算法可以理解为了实现分布式一致性协议而产生的一系列流程与规则。 共识算法大体分为两种类型:
Paxos:达成共识的方式-少数服从多数;也就是典型的“多数人暴政” 在Paxos中,包含三种角色:
在 Paxos 算法中,使用提案表示一个提议,提案包括提案编号和提议的值。接下来,我们使用 [n, v] 表示一个提案,其中,n 是提案编号,v 是提案的值。
首先一台机器接受到了客户端写操作,设置为提案者,然后该节点提出提案给其他机器。(注意在准备阶段,请求中不需要指定提议的值,只需要包含提案编号即可。) [图片上传失败...(image-517a14-1663294562999)]
其他的接收者没有收到其他提案时,就直接投票了,赞成提案(同意提议)。
Paxos两阶段提交:
前提:Acceptor如果还没有正式通过提案(即还没有Accept使操作生效),就可以接受编号更大的Prepare请求。 因为网络等一些问题,提案者到达接收者的顺序也不同。假设提案者1的提案先到达接受者1上;提案者2的提案先导致接受者2上。
假设有多个提案提出,此时接收者3正好是此时编号最大的提案,按照正常情况,编号为3的提案是最终会达成共识的提案。但此时接受者3在生效提案之前挂掉了,那么就会陷入一个不断重试报错的循环。 为了解决这个问题,加入如下规则:允许Proposer在提案遭到过半数的拒绝时,更新自己的提案编号,用新的更大的提案编号,去发起新的Prepare请求。
上述的问题也会引起活锁的问题;(一直被拒绝,一直更新编号)。
Basic-Paxos是一次达成共识的过程,如果有多个值,那么需要多次的网络通信,和活锁问题。
因此提出Multi-Paxos的方式,此种算法也是可以应用于工业生产的共识原型。
Google Chubby组件便是使用了类Multi-Paxos的方式