分布式系统(五)——Paxos算法

来源:互联网 发布:数据库系统全书 编辑:程序博客网 时间:2024/05/18 05:48

注1:本文的全部内容来源于清华大学分布式计算机课程网站,网站主页为http://thu-cmu.cs.tsinghua.edu.cn/curriculum/dscourse/index.html
注2:Paxos算法是分布式领域一个很经典也是很重要的算法,本文只是自己看了之后一个简单的总结。


我们为什么需要Paxos算法

想象一下,现在我们有一个分布式数据库或者文件系统,假设这些分布式的数据库或者文件系统在刚开始的时候存储的内容或者状态是完全一致的,如果我们执行一些列指令或者操作,如果每一个副本执行的顺序是一致的,那么这些分布式的数据库或者文件系统到最后的内容也是一样的。那么我们就需要这样一个算法或者机制,来保证所有的副本执行指令的顺序是一致的。

现在,我们把这个问题简化一下,比如,我们有一个Replicated State Machine(RSM),他包含多个状态机,这些状态机执行一系列的状态操作,假设每个状态操作是一个固定的值,那么问题就是,我们需要保证所有的状态机每次执行同一个状态,即所有的状态机每次确定一个值作为共同的状态操作。

Paxos算法的基本概念

Proposer:proposer每次提出一个值作为下次状态机操作的候选值,一个系统中可以有多个proposer
Acceptor: acceptor对proposer提出的候选值进行评判,他可以选择accept it或者reject it。
Learner: 在acceptor选定了一个提案值之后,learner学习这个值,或者我们可以理解为有个人需要知道这个选定的值,并且把这个值告诉大家

那么整个系统的终极目标就是:所有的acceptor每次选定一个值
实现这个的条件就是:当有足够多的acceptor选择了这个值,那么我们就确定这个值为

一步步实现Paxos

P1

首先我们提名第一点:

每一个acceptor必须accept他所接收到的第一个值

这样的话,我们一方面可以保证可以有值会被选中,但是第一点存在很大的问题,问题在于如果有五个acceptor和两个propose,那么每个acceptor都accept他接受到的第一个值,那就有可能出现2:3的情况,不满足我们所说的绝大多数acceptor选定一个值,那么我们就更改规则,每一个acceptor不只接受一个propose,那这样我们给每个提案加一个标识,一个数字,因此一个提议是(number,value)类型,每个提案的number都不相同,而且number数字是递增的

P2

这里我们引出来第二个规定

如果一个值为v的propose被选择,那么每一个更高数字标识的提案的值都是v

这个比较难理解,那么P2保证的就是每次只有一个值被选择,那么就不会出现另一种情况,某个值被大多数选中了,然后另一个值又被提出来了,几乎在同时,然后acceptor又选择了另外一个值,这样就可能存在两个值被选中,但是我们保证另一个提出标识数字更大的值也是上一次被选中的值,那么就不存在这种情况了。
那么为了保证P2可以被确保,我们提出a,b两条规则

p2a:如果值为v的propose被选中,那么任何被选中的其他值更高的propose的值都是v

这个是从acceptor方面去保证的,下面的p2b是从proposer方面去保证的

p2b:如果值为v的propose被选中,那么其他的proposer提出的高数字标识的propose的值都是v

这样,我们大家就明白了,proposer在发出提议的时候需要考虑以下当前环境中有没有提案被选中,有的话,他只能提出值为v的提案,那这样的话,自然而然的,我们的acceptor可以肆无忌惮的去接受这样提出的提案,值肯定是v

Paxos算法

从前面,我们直到,整个流程有两部分组成,propose发提案之前的询问,我们称之为prepare和之后的accept,即被选中的流程,下面分别介绍一下这两个流程。

Prepare阶段

1、Propose准备发送一个编号为n的数据,先在prepare阶段把这个n发送给所有的acceptor
2、Acceptor收到prepare阶段的n值之后,如果发现自己刚刚accept或者回复其他的prepare的值比N要大,那么就会选择不回复,否则的话就给予回复,如果之前accept其他的值,那么就把接受到的值返回给proposer

Accept阶段

1、当一个proposer在prepare阶段获得了足够多的回复之后,他决定去发送一个提案,如果之前收到了其他acceptor的反馈值,那么它要把这个值设置这个反馈值,就是我们说的p2b,否则,他就自己设置一个值发送
2、在不违背之前的承诺前提下,(比如选中了一个值,新来的propose的N比之前大,但是V跟之前接受的不同,或者又回复了其他比N的prepare或者propose),会accept这样一个消息,并且返回

0 0