zookeeper基础(最简单的2PC 与 3PC 算法入门)

如何理解2PC 与 3PC算法

    • 简介
    • 描述
      • 3PC算法过程描述
        • (1)prepare 阶段
        • (2)accept 阶段
        • (3)commit阶段
      • 2PC算法过程描述

简介

Paxos 对于提案的提交算法有两种方案,2PC以及3PC。
2PC(Two Phase Commit)即 Prepare => Accept。3PC 即 Prepare=> Accept =>Commit。
它们的区别主要在于 accept 阶段中是否包含 commit 功能。

描述

3PC算法过程描述

Paxos算法的3PC执行过程划分为三个阶段:准备阶段prepare 、接受阶段accept,与提交阶段commit。
zookeeper基础(最简单的2PC 与 3PC 算法入门)_第1张图片

(1)prepare 阶段

  1. 提案者(Proposer)准备提交一个编号为N的提议,于是其首先向所有表决者(Acceptor)发送prepare(N) 请求,用于试探集群是否支持该编号的提议。
  2. 每个表决者(Acceptor)中都保存着自己曾经accept 过的提议中的最大编号MaxN。当一个表决者接受到其他主机发送来的prepare(N) 请求时,其会比较N与MaxN的值。有以下几种情况:
    a) 若N小于MaxN,则说明该协议已过时,当前表决者采取不回应或回应Error 的方式拒绝该prepare请求;
    b) 若N大于MaxN,则说明该提议是可以接受的,当前表决者会首先将N记录下来,并将其曾经已经accept的编号最大提案Proposal(myid,maxN,value)反馈给提案者,以向提案者展示自己支持的提案意愿。其中第一个参数myid 表示该提案的提案者标识id,第二参数表示其曾接受的最大编号MaxN,第三个参数表示该提案的真正内容value。当然,若当前表决者还未曾accept 过任何提议,则会将Proposal(null,null,null)反馈给提案者。
    c) 在prepare阶段N不可能等于MaxN。这是由N的生成机制决定的。要获得N的值,其必定会在原来数值的基础上采用同步锁方式加1。

(2)accept 阶段

  1. 当提案者(proposer)发出prepare(N) 后,若收到了超过半数的表决者(Accepter)的反馈,那么该提案者就会将其真正的提案Proposal(myid,N,value)发送给所有的表决者。
  2. 当表决者(Accepter)接收到提案者发送的Proposal(myid,N,value)提案后,会再次拿出自己曾经accept 过的提议中的最大编号MaxN,或曾经记录下的prepare的最大编号,让N与它们进行比较,若N大于等于这两个编号,则当前表决者accept该提案,并反馈给提案者。反之,则表决者采取不回应或回应Error的方式来拒绝该提议。
  3. 若提案者没有接受到超过半数的表决者的accept反馈,则有两种可能的结果产生。一是放弃该提案,不再提出;二是重新进入prepare 阶段,递增提案号,重新提出prepare请求。

(3)commit阶段

若提案者接收到的反馈数量超过了半数,则其会向外广播两类信息:

  1. 向曾accept 其提案的表决者发送 ‘可执行数据同步信号’,即让它们执行其曾接收到的提案;
  2. 向未曾向其发送accept反馈的表决者发送 ‘提案 + 可执行数据同步信号’,即让它们接收到该提案后马上执行。

2PC算法过程描述

2PC与3PC的区别是,在提案者接收到超过半数的表决者对于prepare阶段的反馈后,其会向所有表决者发送真正的提案Proposal。当表决者接受到Proposal后就直接将其同步到了本地,不用再等待commit消息了。
那么,为什么不直接使用2PC,而是用3PC呢?是因为2PC中存在较多的弊端(这里不展开说,其实可以从上面看出一点,安全性肯定不如3PC)。所以很多Paxos工业实现使用3PC提交。但是2PC的提交效率高于3PC。所以在保证不出问题的情况下,是可以使用2PC的。

你可能感兴趣的:(zookeeper)