分布式算法-Paxos

  • Post author:
  • Post category:其他


分布式算法-Paxos

最近工作中遇到了分布式相关的问题,由于我们业务场景的要求,需要我们实现强一致性并且目前采用了CAP协议,满足CP舍弃了A。下面就让我们一起学习一下这个大名鼎鼎的Paxos算法吧。

这个是分布式算法高频的面试考点哦。

一、简介


Paxos算法

是Leslie Lamport在1990年提出的一种基于消息传递且具有高度容错特性的共识(consensus)算法。它是一组协议,用于在不可靠或易出错的处理器组成的网络中解决一致性问题。协商一致意见是一组与会者就一项结果达成一致意见的过程。

自Paxos问世以来就持续垄断了分布式一致性算法,Paxos这个名词几乎等同于分布式一致性。Google的很多大型分布式系统都采用了Paxos算法来解决分布式一致性问题,如Chubby、Megastore以及Spanner等。开源的ZooKeeper,以及MySQL 5.7推出的用来取代传统的主从复制的MySQL Group Replication等纷纷采用Paxos算法解决分布式一致性问题。

二、角色

Paxos算法一共存在三个角色分别为

proposers



acceptors

,和

learners

(允许身兼数职)。


  • proposers

    提出提案,提案信息包括提案编号和提议的 value;


  • acceptor

    收到提案后可以接受(accept)提案,若提案获得多数派(majority)的 acceptors 的接受,则称该提案被批准(chosen);


  • learners

    只能“学习”被批准的提案。划分角色后,就可以更精确的定义问题:

  1. 决议(value)只有在被 proposers 提出后才能被批准(未经批准的决议称为“提案(proposal)”);

  2. 在一次 Paxos 算法的执行实例中,只批准(chosen)一个 value;

  3. learners 只能获得被批准(chosen)的 value。

三、Basic Paxos算法

Paxos算法分为两个阶段,具体如下:

3.1 Prepare-阶段一

  • a).Proposer 收到client请求或发现本地有未提交的值,选择一个提案编号N,然后想半数以上的Acceptor发送编号为N的Prepare请求。

  • b).Acceptor收到一个编号为N的Prepare请求,如果该轮Paxos

    1.本节点已经有

    已提交的

    value记录,对比记录的编号和N,大于N则拒绝回应,或者返回该记录value及编号

    2.没有已提交记录,判断本地是否有编号N1,N1>N,则拒绝回响,否则讲N1改为N(如果没有N1,则记录N),并响应prepare

3.2 Accept-阶段二

  • a).如果Proposer收到半数以上Acceptor对其发出的编号N的prepare请求的响应,那么它就会发送一个针对[N,V]提案的Accept请求给半数以上的Acceptor。V就是收到响应中编号最大的value,如果响应中不包含任何value,那么V就是由Proposer自己决定。

  • b).如果Acceptor收到一个针对编号为N的提案的Accept请求,Acceptor对比本地的记录编号,如果小于等于N,则接受该值,并提交记录value,否则拒绝请求

Proposer如果收到大多数的Acceptor响应,则选定该value值,并同步给leaner,使未响应的Acceptor达成一致。

四、参考


  1. https://en.wikipedia.org/wiki/Paxos_(computer_science)


  2. 分布式算法 – Paxos算法 | Java 全栈知识体系



版权声明:本文为u013234555原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。