西海数据丨推荐 有史以来最晦涩的算法——Paxos算法!

Posted NoSQLt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了西海数据丨推荐 有史以来最晦涩的算法——Paxos算法!相关的知识,希望对你有一定的参考价值。

每天一点小知识:NoSQLt既不是行式数据库,也不是列式数据库,是粒式数据库。

西海数据丨推荐 有史以来最晦涩的算法——Paxos算法!

背景

Paxos算法是基于消息传递且具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一。

Paxos是Lamport于1990年提出的一种基于消息传递而具有高度容错特性的分布式一致性算法.这个算法是分布式中最为重要的算法,Google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,那就是Paxos,其他算法都是残次品。

西海数据丨推荐 有史以来最晦涩的算法——Paxos算法!

Paxos分析

Paxos算法解决的问题就是在一个可能发生上述异常的分布式系统中如何就某个值达成一致,保证无论发生以上任何异常,都不会破坏决议的一致性。在paxos算法中,分为3种角色:

Proposer :提议者

Acceptor:决策者

Learner:最终决策学习者

西海数据丨推荐 有史以来最晦涩的算法——Paxos算法!

上面3种角色中,提议者和决策者是很重要的,最终决策学习者在整个算法中应该算做打酱油的,Proposer就像Client的使者,由Proposer使者拿着议题去向Acceptor提议,让Acceptor来决策。这里上面出现了个新名词:最终决策。现在来系统的介绍一下paxos算法中所有的行为:

  • Proposer提出议题

  • Acceptor初步接受 或者Acceptor初步不接受

  • 如果上一步Acceptor初步接受则Proposer再次向Acceptor确认是否最终接受

  • Acceptor最终接受 或者Acceptor 最终不接受

上面Learner最终学习的目标是Acceptor们最终接受了什么议题。注意,这里是向所有Acceptor学习,如果有多数派个Acceptor最终接受了某提议,那就得到了最终的结果,算法的目的就达到了。

西海数据丨推荐 有史以来最晦涩的算法——Paxos算法!

Paxos算法描述

第一阶段(Prepare阶段)

  • Proposer:

选取提案编号n,并向大多数Acceptor发送携带编号n的prepare请求。

  • Acceptor:

如果收到的提案编号n比自己已经收到的编号都要大,则向Proposer承诺不再接收编号小于n的提案,如果之前接受过提案,则同时将接受的提案中编号最大的提案及其编号发给Proposer。

如果收到的提案编号n小于自己已经收到提案编号的最大值,则拒绝。

西海数据丨推荐 有史以来最晦涩的算法——Paxos算法!

第二阶段(Accept阶段)

  • Proposer:

首先,对接收到响应,逐条处理:

如果接收到拒绝,则暂不处理。

如果接收到同意,同时还接收到Acceptor已经接受的提案,则记下该提案及编号。

处理完响应后,统计拒绝和同意个数:

如果大多数拒绝,则准备下次提案。

如果大多数同意,从这些Acceptor已经接受的提案中选取提案编号最大的提案作为自己的提案,没有则使用自己的提案,逐个向Acceptor发送Accept消息。

  • Acceptor:

形成共识(与Prepare&Accept阶段并行)

如果收到的提案编号n小于自己已经收到最大提案编号,则拒绝。

如果收到的提案编号n等于自己已经收到最大提案编号,则接受该提案。

如果收到的提案编号n大于自己已经收到最大提案编号,则拒绝。

  • Acceptor:

每当接受一个提案,则将该提案及编号发给Learner。

  • Learner:

记录每一个Acceptor当前接受的提案,一个Acceptor先后发来多个提案,则保留编号最大的提案。

统计每个提案被接受的Acceptor个数,如果超过半数,则形成共识。

西海数据丨推荐 有史以来最晦涩的算法——Paxos算法!

Paxos算法实例

假如有Server1、Server2、Server3这样三台服务器,我们要从中选出leader,这时候Paxos派上用场了。

  • 准备阶段

  1. 每个Server都向Proposer发消息称自己要成为leader,Server1往Proposer1发、Server2往Proposer2发、Server3往Proposer3发;

  2. 现在每个Proposer都接收到了Server1发来的消息但时间不一样,Proposer2先接收到了,然后是Proposer1,接着才是Proposer3;

  3. Proposer2首先接收到消息所以他从系统中取得一个编号1,Proposer2向Acceptor2和Acceptor3发送一条,编号为1的消息;接着Proposer1也接收到了Server1发来的消息,取得一个编号2,Proposer1向Acceptor1和Acceptor2发送一条,编号为2的消息;最后Proposer3也接收到了Server3发来的消息,取得一个编号3,Proposer3向Acceptor2和Acceptor3发送一条,编号为3的消息;

  4. 这时Proposer1发送的消息先到达Acceptor1和Acceptor2,这两个都没有接收过请求所以接受了请求返回[2,null]给Proposer1,并承诺不接受编号小于2的请求;

  5. 此时Proposer2发送的消息到达Acceptor2和Acceptor3,Acceprot3没有接收过请求返回[1,null]给Proposer2,并承诺不接受编号小于1的请求,但这时Acceptor2已经接受过Proposer1的请求并承诺不接受编号小于的2的请求了,所以Acceptor2拒绝Proposer2的请求;

  6. 最后Proposer3发送的消息到达Acceptor2和Acceptor3,Acceptor2接受过提议,但此时编号为3大于Acceptor2的承诺2与Accetpor3的承诺1,所以接受提议返回[3,null];

  7. Proposer2没收到过半的回复所以重新取得编号4,并发送给Acceptor2和Acceptor3,然后Acceptor2和Acceptor3都收到消息,此时编号4大于Acceptor2与Accetpor3的承诺3,所以接受提议返回[4,null];

  • 决议阶段

  1. Proposer3收到过半(三个Server中两个)的返回,并且返回的Value为null,所以Proposer3提交了[3,server3]的议案;

  2. Proposer1收到过半返回,返回的Value为null,所以Proposer1提交了[2,server1]的议案;

  3. Proposer2收到过半返回,返回的Value为null,所以Proposer2提交了[4,server2]的议案;

  4. Acceptor1、Acceptor2接收到Proposer1的提案[2,server1]请求,Acceptor2承诺编号大于4所以拒绝了通过,Acceptor1通过了请求;

  5. Proposer2的提案[4,server2]发送到了Acceptor2、Acceptor3,提案编号为4所以Acceptor2、Acceptor3都通过了提案请求;

  6. Acceptor2、Acceptor3接收到Proposer3的提案[3,server3]请求,Acceptor2、Acceptor3承诺编号大于4所以拒绝了提案;

  7. 此时过半的Acceptor都接受了Proposer2的提案[4,server2],Larner感知到了提案的通过,Larner学习提案,server2成为Leader;

一个Paxos过程只会产生一个议案所以至此这个流程结束,选举结果server2为Leader。



以上是关于西海数据丨推荐 有史以来最晦涩的算法——Paxos算法!的主要内容,如果未能解决你的问题,请参考以下文章

西海数据丨推荐 让一切变得经济实惠,贪心算法浅析

西海数据丨推荐 非对称加密算法DH,RSA

西海数据丨推荐 常用数据挖掘算法从入门到精通 第十一章 支持向量机算法

号称史上最晦涩的算法Paxos,如何变得平易近人?

大白话理解“最晦涩”的Paxos算法及在数据库高可用上的使用

底层算法系列:Paxos算法