第9章 PAXOS

简介

PAXOS是为了在有机器挂掉的时候,也能让提案决议得到通过,而不用一直等待(2PC的做法)而产生。经常被用来选举MASTER(当原MASTER挂了的时候)。
实现的核心是,1.发出提案, 2.针对这个提案,收集PROMISE。
PROMISE里可能带了VALUE,可能是空。
如果收到的PROMISE超过一半,并且全为空。提议者可以自己定一个VALUE,进入ACCEPT阶段。
如果有不为空的,会选择提案号最大的V,当做自己的VALUE,进入ACCEPT阶段。

PAXOS 的V 什么时候会被确定? 当大多数ACCEPT 都同意了一个V,并更新了自己VA,NA(落库)了。这个V就不会变了。
之后的努力都是对这个V 在所有机器上达成一致。

详细介绍

机器间备份的状态要一致。
2个机器初始状态一样,经过确定的操作,终止状态一致。


image.png

第一个naive的实现。


image.png

但是不能保证所有机器的OPS的顺序一致。
为了解决这个问题


image.png

但是这个OPS,BACKUP SERVER 机器挂了怎么办?
这就要用到上一章说的2PC


image.png

这个不SCALE,增加更多的机器反而使得性能更差。一个优化是读操作,就不备份了。只有WRITE去备份。
但是读如果去任一台机器读的话,可能会读到旧的。如下图。这个顺序又会有不一致。


image.png
image.png

上述3个CHANLLENGE, 第2个可能会发生 出现多个 primary, 第3个会在PRIMARY切换时,出现状态不一致。
所以既要保证R/W的正确,还要保证在FAILURE时的正确。

之前介绍的2PC,在一个机器挂了,就会一直等,等最简单,保证一致性会简单。但是你如果想要在一台机器挂了的时候,可以切换,继续做下去,这个就会复杂。

image.png

这个一致共识的目标,就是在超过半数的节点还好的时候,整个PROCESS不会被BLOCK。并且所有节点会对一个结果达成一致。


image.png

消息会丢失,消息会被多次发送,消息可能会重排序(因为在分布式网络中这些无法避免)
这里有个假设,消息不会被篡改。
这个算法在2P+1的NODE中,可以允许P个NODE FAILURE。

PAXOS因为其协议的复杂性,所以会和2PC结合起来用,如果在没有FAILURE的情况下,我们依然用2PC来解决问题。 如果出现了FAILURE,为了不用等待,就要用PAXOS。


image.png

PAXOS 的特点是正确和容错,但是它没法保证TERMINATION(理论上会有活锁,实际情况很难发生)。

image.png

2PC 有固定的TC, PAXOS有其中一个PROPOSER扮演一个TC。
Acceptor 类似于2PC 的NODE,参与者。进行表决。议案不要求所有人通过,当多数人通过,其他人都要服从。
Learner 最后负责把状态修改完把消息告诉CLIENT。

image.png
image.png
image.png

一个值的修改,可以讨论多次,所以PROPOSAL NUMBER 是讨论当前这个VALUE 第N次尝试。

image.png

什么情况下ACCEPTOR会见到比它更大PROPOSAL?
比如MESSAGE 会REORDER。
如果当前PID 大于之前的所有PID, 他会返回之前同意的最大的PROPOSAL NUMBER and VALUE。
对于一个ACCEPTOR,返回它同意过的最大值。如果没有同意过,就会返回NULL。如果看得P ID 太小,直接IGNORE。


image.png

Acceptor 还有一次机会来判断这个N是不是最大。如果是的话,就在ACCPEROT这里通过了,他会告诉LEADER 和 LEARNER ACCEPTED

image.png
image.png

为什么要按照上述的方式做呢?

下面介绍了几种失败的情况


image.png

NA,VA,NH 这3个值是一定要落库的。WAL。(write ahead log的方式)

然后看下面实现的伪代码。


image.png
image.png
image.png

一个最简单的情况。

image.png
image.png

有多个LEADER 会同时进入第2个PHASH,但是不会有多多个LEADER通过第2轮。

image.png

大多数的ACCEPT 收到了ACCEPT, N,V,并且ACCEPT了。这个V就被确定了。

但是很多MASTER 申请去做LEADER, Nh就会被反复更新的更大,造成活锁,造成无法TERMINATION。
但是再实际中,不会有这么皮的情况。LEADER都不会那么频繁,也可以加一个时间间隔去发起LEADER申请。

如果一个机器挂了,第一个提案结束了,结论有了。都到了第二个提案,这个节点才醒来,那么该如何追赶第一个提案的结果。
它前面那个PAXOS还没完成,他只要自己去做下LEADER就可以,他那个PROPOSAL,会被REJECTED,他再发一个大的PROPOSAL,别人会把之前同意过的值还给他,他就有了。

image.png

上图的意思,A发起提案1 给A,C(因为那时B挂了),他在ACCEPT后,挂了。这个时候C已经把自己的NA,VA设置成1,foo. 当B醒来后,他发起PROMISE,他会收到B的FOO,他的提案也只能是FOO了。最后会对FOO达成一致。不可能是别的。
也就是说有了MARJORITY的ACCEPT后,V就不能改了。


image.png

image.png

最后看一下PAXOS,是怎么运用在rsm里的。
主要是为了当一个MASTER(TC)挂了的时候,他们重新对LEADER的选举达成一致。一旦一个新的LEADER被选举出了,那么接下来还是用2PC来做。


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Paxos是什么 Paxos算法是基于消息传递且具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有...
    jiangmo阅读 5,403评论 0 6
  • 此文知识来自于:《从Paxos到Zookeeper分布式一致性原理与实践》第二章分布式入门基础知识,由于博主对其理...
    李文文丶阅读 5,966评论 0 0
  • paxos通俗说就是 发起提案之前首先判断当前是否是最新的 如果不是 则把最新的值赋值 如果是则不用赋值即 ...
    时待吾阅读 4,306评论 0 0
  • 最近在思考一致性的问题,网上有很多这方面的资料了,这里谈谈我对一致性以及paxos算法的理解。 1 一致性 什么是...
    分布式存储JerryYang阅读 5,095评论 0 9
  • 来源:维基百科(https://zh.wikipedia.org/wiki/Paxos%E7%AE%97%E6%B...
    苍山雪麓阅读 2,976评论 0 0