在前面一篇文章我们讲到了理解分布式一致性:Paxos协议之Multi-Paxos,本篇文章我会讲解Paxos协议的另外两个变种:Cheap Paxos和Fast Paxos。

Cheap Paxos

Cheap Paxos 是Basic Paxos 的继承版本。其实所有的Paxos变种都来自与Basic Paxos,都是基于它来进行改进的。那么Cheap Paxos有什么特点呢?

在Basic Paxos中,我们知道,共识如果想要正常进行的话,出错的节点数目必须小于n/2, 也就是说必须要有大于n/2的节点正常运行才能共识成功。节点运行就不可避免的会占用资源,有没有什么办法可以即节省资源又可以保证节点正常共识呢?

办法就是Cheap Paxos:我们在Cheap Paxos里面引入了辅助节点的概念,辅助节点只有在必须需要它来达成共识的情况下才会启动。举个例子,如果我们总共有N+1个节点,那么我们只能够忍受N/2个节点出错,否则系统不能达成共识。但是当我们再引入N个辅助节点,即使有N个节点出错,只要额外的N个辅助节点启动并正常工作,就能达成共识并保证系统的正常运行,辅助节点在正常节点恢复工作后会自动停止,这样只是在必要的时候才启动辅助资源,就大大的解约了分布式系统的成本,所以叫它Cheap Paxos.

Message flow: Cheap Multi-Paxos

下图是3个正常节点+1个辅助节点的流程,如果系统规定的共识节点个数是3个,那么当一个正常节点挂掉之后,辅助节点会起来帮助完成共识工作。

ProposerAcceptor1Acceptor2Acceptor3Aux-- Phase 2 --Accept!(1,I,V)Accept!(1,I,V)Accept!(1,I,V)Accepted(1,I,V)Accepted(1,I,V)Acceptor3 is down共识数目不够,重发请求给辅助节点Accept!(1,I,V)Accept!(1,I,V)Accept!(1,I,V)Accepted(1,I,V)Accepted(1,I,V)Accepted(1,I,V)共识成功,将最小共识节点减一,停止辅助节点继续下一轮Accept!(1,I+1,W)Accept!(1,I+1,W)Accepted(1,I+1,W)Accepted(1,I+1,W)ProposerAcceptor1Acceptor2Acceptor3Aux

Fast Paxos

在之前提到的Paxos协议中,消息最后到达Learner一般都要经历 Client–>Proposer–>Acceptor–>Learner 总共3个步骤。

那么有没有更快的方法让消息到达Learner呢?毕竟Learner是真正执行任务的,我们希望这个任务更加快速的为Learner所知。方法就是如果Proposer本身没有数据需要被确认的话,那么Client可以直接发送Accept请求给Acceptor,从而跳过Proposer这一步,这样的操作叫做Fast Paxos。

这里还要注意一点,Client 发送请求给Proposer是直接发送给Leader,也就是发送一次就够了,但是发给Acceptor的话就要所有的Acceptors都发一遍。

Message flow: Fast Paxos, non-conflicting

下图列出了正常运行的情况,没有冲突正常执行。

ClientLeaderAcceptor1Acceptor2Acceptor3Acceptor4LearnerAccept!(N,I,W)Accept!(N,I,W)Accept!(N,I,W)Accept!(N,I,W)Accepted(N,I,W)Accepted(N,I,W)Accepted(N,I,W)Accepted(N,I,W)Accepted(N,I,W)Accepted(N,I,W)Accepted(N,I,W)Accepted(N,I,W)Response(W)ClientLeaderAcceptor1Acceptor2Acceptor3Acceptor4Learner

Message flow: Fast Paxos, conflicting proposals

当有多个Client同时发送Accept请求的时候就有可能产生冲突。这时候有两种解决办法。

  1. Leader检测到冲突之后,根据规定的算法从冲突中选择一个数据,重新发送Accept请求。如下图所示:
Client1Client2LeaderAcceptor1Acceptor2Acceptor3Acceptor4LearnerAccept!(N,I,V)Accept!(N,I,V)Accept!(N,I,V)Accept!(N,I,V)Accept!(N,I,W)Accept!(N,I,W)Accept!(N,I,W)Accept!(N,I,W)Accepted(N,I,V)Accepted(N,I,V)Accepted(N,I,V)Accepted(N,I,V)Accepted(N,I,W)Accepted(N,I,W)Accepted(N,I,W)Accepted(N,I,W)Leader收到了2个Accepted(N,I,V),2个Accepted(N,I,W),产生了冲突,Leader选择W,重新发起一轮Accept请求Accept!(N+1,I,W)Accept!(N+1,I,W)Accept!(N+1,I,W)Accept!(N+1,I,W)Accepted(N+1,I,W)Accepted(N+1,I,W)Accepted(N+1,I,W)Accepted(N+1,I,W)Accepted(N+1,I,W)Accepted(N+1,I,W)Accepted(N+1,I,W)Accepted(N+1,I,W)Response(W)Response(W)Client1Client2LeaderAcceptor1Acceptor2Acceptor3Acceptor4Learner
  1. 当检测到冲突的时候,如果Acceptors自己就能解决冲突,那么就完全不需要Leader再次发送Accept请求了,这样就又减少了一次请求,节省了时间。如下图所示:
Client1Client2LeaderAcceptor1Acceptor2Acceptor3Acceptor4LearnerAccept!(N,I,V)Accept!(N,I,V)Accept!(N,I,V)Accept!(N,I,V)Accept!(N,I,W)Accept!(N,I,W)Accept!(N,I,W)Accept!(N,I,W)Accepted(N,I,V)Accepted(N,I,V)Accepted(N,I,V)Accepted(N,I,V)Accepted(N,I,W)Accepted(N,I,W)Accepted(N,I,W)Accepted(N,I,W)Acceptors检测到冲突,直接根据协议自行解决,这里选择W为最终结果Accepted(N+1,I,W)Accepted(N+1,I,W)Accepted(N+1,I,W)Accepted(N+1,I,W)Accepted(N+1,I,W)Accepted(N+1,I,W)Accepted(N+1,I,W)Accepted(N+1,I,W)Response(W)Response(W)Client1Client2LeaderAcceptor1Acceptor2Acceptor3Acceptor4Learner

Message flow: Fast Paxos with uncoordinated recovery, collapsed roles

下图是所有的角色集合到一个Server的情况,是更加简洁的实现。

Client1Client2Server1Server2Server3Server4Accept!(N,I,V)Accept!(N,I,V)Accept!(N,I,V)Accept!(N,I,V)Accept!(N,I,W)Accept!(N,I,W)Accept!(N,I,W)Accept!(N,I,W)Accepted(N,I,V)Accepted(N,I,V)Accepted(N,I,W)Accepted(N,I,W)Servers检测到冲突,直接根据协议自行解决,这里选择W为最终结果Accepted(N+1,I,W)Accepted(N+1,I,W)Accepted(N+1,I,W)Accepted(N+1,I,W)Response(W)Response(W)Client1Client2Server1Server2Server3Server4

更多教程请参考flydean的博客

理解分布式一致性:Paxos协议之Cheap Paxos & Fast Paxos的更多相关文章

  1. 理解分布式一致性:Raft协议

    理解分布式一致性:Raft协议 什么是分布式一致性 Leader选举 日志复制流程 term选举周期 timeout 选举和选举timeout 选举分裂 日志复制和心跳timeout 在分布式系统中, ...

  2. 理解分布式一致性:Paxos协议之Basic Paxos

    理解分布式一致性:Paxos协议之Basic Paxos 角色 Proposal Number & Agreed Value Basic Paxos Basic Paxos without f ...

  3. 理解分布式一致性:Paxos协议之Generalized Paxos & Byzantine Paxos

    理解分布式一致性:Paxos协议之Generalized Paxos & Byzantine Paxos Generalized Paxos Byzantine Paxos Byzantine ...

  4. 理解分布式一致性:Paxos协议之Multi-Paxos

    理解分布式一致性:Paxos协议之Multi-Paxos Multi-Paxos without failures Multi-Paxos when phase 1 can be skipped Mu ...

  5. 理解分布式一致性:拜占庭容错与PBFT

    理解分布式一致性:拜占庭容错与PBFT 拜占庭问题 拜占庭容错BFT PBFT(Practical Byzantine Fault Tolerance) why 3f+1 ? PBFT 的优点 PBF ...

  6. 理解分布式一致性与Raft算法

    理解分布式一致性与Raft算法 永远绕不开的CAP定理 出于可用性及负载方面考虑,一个分布式系统中数据必然不会只存在于一台机器,一致性简单地说就是分布式系统中的各个部分保持数据一致 但让数据保持一致往 ...

  7. 从分布式一致性到共识机制(一)Paxos算法

    从分布式系统的CAP理论出发,关注分布式一致性,以及区块链的共识问题及解决. 区块链首先是一个大规模分布式系统,共识问题本质就是分布式系统的一致性问题,但是又有很大的不同.工程开发中,认为系统中存在故 ...

  8. 11张PPT介绍Paxos协议

    之前翻译了<The Part-Time Parliament>一文,论文非常经常,强烈推荐读一读原文.翻译完论文后,希望自己能用简单的描述来整理自己的理解,所以花了一些时间通过PPT的形式 ...

  9. 分布式一致性算法:Raft 算法(论文翻译)

    Raft 算法是可以用来替代 Paxos 算法的分布式一致性算法,而且 raft 算法比 Paxos 算法更易懂且更容易实现.本文对 raft 论文进行翻译,希望能有助于读者更方便地理解 raft 的 ...

随机推荐

  1. flink 一分钟入门篇

    1. 业务说:“…… bulabula……,这个需求很简单,怎么实现我不管?” 面对霸气侧漏的业务需求,由于没有大数据知识储备,咱心里没底,咱也不敢问,咱也不敢说,只能静下来默默储备.默默寻觅解决方案 ...

  2. PTA数据结构与算法题目集(中文) 7-25

    PTA数据结构与算法题目集(中文)  7-25 7-25 朋友圈 (25 分)   某学校有N个学生,形成M个俱乐部.每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈.一个学生可以同时属于若干 ...

  3. 原理解密 → Spring AOP 实现动态数据源(读写分离),底层原理是什么

    开心一刻 女孩睡醒玩手机,收到男孩发来一条信息:我要去跟我喜欢的人表白了! 女孩的心猛的一痛,回了条信息:去吧,祝你好运! 男孩回了句:但是我没有勇气说不来,怕被打! 女孩:没事的,我相信你!此时女孩 ...

  4. python redis 实现简单的消息订阅

    python + redis 实现简单的消息订阅 订阅端 import redis from functools import wraps class Subscribe: def __init__( ...

  5. 29.2 Iterator 迭代器

    /* * 集合的遍历方式: * 1.toArray(),可以把集合转换成数组,然后遍历数组即可 * 2.iterator(),可以返回一个迭代器对象,我们可以通过迭代器对象来迭代集合 * * Iter ...

  6. 8.4 StringBuilder的介绍及用法(String 和StringBuilder区别)

    * StringBuilder:是一个可变的字符串.字符串缓冲区类.** String和StringBuilder的区别:* String的内容是固定的.(方法区的内容)* StringBuilder ...

  7. rdd简单操作

    1.原始数据 Key value Transformations(example: ((1, 2), (3, 4), (3, 6)))  2. flatMap测试示例 object FlatMapTr ...

  8. Java虚拟机类装载的原理及实现(转)

    Java虚拟机类装载的原理及实现(转) 一.引言 Java虚拟机(JVM)的类装载就是指将包含在类文件中的字节码装载到JVM中, 并使其成为JVM一部分的过程.JVM的类动态装载技术能够在运行时刻动态 ...

  9. MVC学习的心路历程

    2020/4/17 之前接触过三层架构,但是没有接触过mvc,所以有点蒙,所以现在在一步步构建思路. 1.了解MVC的发展,做一个简单的项目.

  10. Hash记录字符串

    Hash记录字符串模板: mod常常取1e9+7,base常常取299,,127等等等....有的题目会卡Hash,因为可能会有两个不同的Hash但却有相通的Hash值...这个时候可以用双Hash来 ...