Paxos算法原理与推导

Paxos算法在分布式领域具有非常重要的地位 。但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难 。
网上有很多讲解Paxos算法的文章,但是质量参差不齐 。看了很多关于Paxos的资料后发现,学习Paxos最好的资料是论文《Paxos Made Simple》,其次是中、英文版维基百科对Paxos的介绍 。本文试图带大家一步步揭开Paxos神秘的面纱 。
Paxos是什么

Paxos算法是基于消息传递且具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一 。
google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,那就是Paxos,其它的算法都是残次品 。
虽然Mike Burrows说得有点夸张,但是至少说明了Paxos算法的地位 。然而,Paxos算法也因为晦涩难懂而臭名昭著 。本文的目的就是带领大家深入浅出理解Paxos算法,不仅理解它的执行流程,还要理解算法的推导过程,作者是怎么一步步想到最终的方案的 。只有理解了推导过程,才能深刻掌握该算法的精髓 。而且理解推导过程对于我们的思维也是非常有帮助的,可能会给我们带来一些解决问题的思路,对我们有所启发 。
问题产生的背景
在常见的分布式系统中,总会发生诸如机器宕机或网络异常(包括消息的延迟、丢失、重复、乱序,还有网络分区)等情况 。Paxos算法需要解决的问题就是如何在一个可能发生上述异常的分布式系统中,快速且正确地在集群内部对某个数据的值达成一致,并且保证不论发生以上任何异常,都不会破坏整个系统的一致性 。
注:这里某个数据的值并不只是狭义上的某个数,它可以是一条日志,也可以是一条命令(command) 。。。根据应用场景不同,某个数据的值有不同的含义 。
Paxos算法原理与推导

文章插图
 
 
相关概念
在Paxos算法中,有三种角色:
  • Proposer
  • Acceptor
  • Learners
在具体的实现中,一个进程可能同时充当多种角色 。比如一个进程可能既是Proposer又是Acceptor又是Learner 。
还有一个很重要的概念叫提案(Proposal) 。最终要达成一致的value就在提案里 。
注:
  • 暂且认为『提案=value』,即提案只包含value 。在我们接下来的推导过程中会发现如果提案只包含value,会有问题,于是我们再对提案重新设计 。
  • 暂且认为『Proposer可以直接提出提案』 。在我们接下来的推导过程中会发现如果Proposer直接提出提案会有问题,需要增加一个学习提案的过程 。
Proposer可以提出(propose)提案;Acceptor可以接受(accept)提案;如果某个提案被选定(chosen),那么该提案里的value就被选定了 。
回到刚刚说的『对某个数据的值达成一致』,指的是Proposer、Acceptor、Learner都认为同一个value被选定(chosen) 。那么,Proposer、Acceptor、Learner分别在什么情况下才能认为某个value被选定呢?
  • Proposer:只要Proposer发的提案被Acceptor接受(刚开始先认为只需要一个Acceptor接受即可,在推导过程中会发现需要半数以上的Acceptor同意才行),Proposer就认为该提案里的value被选定了 。
  • Acceptor:只要Acceptor接受了某个提案,Acceptor就任务该提案里的value被选定了 。
  • Learner:Acceptor告诉Learner哪个value被选定,Learner就认为那个value被选定 。
 
Paxos算法原理与推导

文章插图
 
 
问题描述
假设有一组可以提出(propose)value(value在提案Proposal里)的进程集合 。一个一致性算法需要保证提出的这么多value中,只有一个value被选定(chosen) 。如果没有value被提出,就不应该有value被选定 。如果一个value被选定,那么所有进程都应该能学习(learn)到这个被选定的value 。对于一致性算法,安全性(safaty)要求如下:
  • 只有被提出的value才能被选定 。
  • 只有一个value被选定,并且
  • 如果某个进程认为某个value被选定了,那么这个value必须是真的被选定的那个 。
我们不去精确地定义其活性(liveness)要求 。我们的目标是保证最终有一个提出的value被选定 。当一个value被选定后,进程最终也能学习到这个value 。
Paxos的目标:保证最终有一个value会被选定,当value被选定后,进程最终也能获取到被选定的value 。
假设不同角色之间可以通过发送消息来进行通信,那么:


推荐阅读