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

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

Generalized Paxos

我们大家都知道,分布式一致性的最大问题就是数据同步的问题,而产生问题的原因就是冲突,按照之前讲到的各种Paxos协议方案,发生了冲突之后就必须解决冲突然后重新发送请求,这样就会提高数据同步的成本和时间,那么有没有更好的方式来解决这个问题呢?

答案肯定是有。在分布式系统中,冲突是不可避免的,遇到冲突的时候是不是每次都解决冲突然后重新发送请求呢?我们举个例子:

如果Client1发送请求ReadA,Client2 发送请求ReadB,系统4个Acceptors,有2个接收ReadA,有2个接收ReadB,在共识层面来说,因为没有达到最大的共识个数,达不成共识,需要重新发送。但是如果我们仔细观察一下两个请求,ReadA,ReadB这两个命令是没有任何联系的,无论先执行哪一个都是同样的效果。那么我们可以认为这种情况是没有冲突的,我们在执行层面自行安排两个请求的顺序,而不用再次共识。 这就叫做Generalized Paxos。

这种共识的前提就是不同命令的先后顺序无关。下面以序列图的形式更加详细的介绍:

Client1Client2LeaderAcceptor1Acceptor2Acceptor3LearnerAccept!(ReadA)Accept!(ReadA)Accept!(ReadA)Accept!(ReadA)Accept!(ReadB)Accept!(ReadB)Accept!(ReadB)Accept!(ReadB)Leader and Acceptor1Accepted(N,<ReadA,ReadB>), Acceptor2and Acceptor3Accepted(N,<ReadB,ReadA>),顺序无关,不冲突,最终值Accepted(N,<ReadA,ReadB>)Accepted(N,<ReadA,ReadB>)Accepted(N,<ReadA,ReadB>)Accepted(N,<ReadA,ReadB>)Accepted(N,<ReadA,ReadB>)下面是冲突的情况,WriteA和ReadA同时发生,产生冲突时,Leader自行解决冲突,需要重发请求Accept!(ReadA)Accept!(ReadA)Accept!(ReadA)Accept!(ReadA)Accept!(WriteA)Accept!(WriteA)Accept!(WriteA)Accept!(WriteA)Accepted(N,<ReadA,WriteA>)Accepted(N,<ReadA,WriteA>)Accepted(N,<WriteA,ReadA>)Accepted(N,<WriteA,ReadA>)冲突产生,Leader根据协议自行决定执行顺序,这里是<ReadA,WriteA>,N+1Accept!(N+1,<ReadA,WriteA>)Accept!(N+1,<ReadA,WriteA>)Accept!(N+1,<ReadA,WriteA>)Accepted(N+1,<ReadA,WriteA>)Accepted(N+1,<ReadA,WriteA>)Accepted(N+1,<ReadA,WriteA>)Client1Client2LeaderAcceptor1Acceptor2Acceptor3Learner

Byzantine Paxos

最后一个我们要讲的Paxos协议是Byzantine Paxos。熟悉虚拟货币的人应该对拜占庭协议并不陌生,这里我们也不多讲拜占庭协议,后面我会用单独的文章来详细介绍拜占庭协议。

上面我们讲到的所有的Paxos协议,只讲到了服务出错的情况,并没有考虑服务伪造篡改信息的情况,即并没有考虑到恶意节点。而拜占庭协议就是为了解决这个问题而产生的。

Byzantine Paxos比正常的Paxos协议多了一个消息验证的过程,这个验证使用了拜占庭协议。

Byzantine Multi-Paxos

下面是个Byzantine Multi-Paxos的序列图:

ClientProposerAcceptor1Acceptor2Acceptor3LearnerRequestAccept!(N,I,V)Accept!(N,I,V)Accept!(N,I,V)验证消息Verify(N,I,V) - BROADCASTVerify(N,I,V) - BROADCASTVerify(N,I,V) - BROADCASTVerify(N,I,V) - BROADCASTAccepted(N,V)Accepted(N,V)Accepted(N,V)Accepted(N,V)Accepted(N,V)Accepted(N,V)Response(V)ClientProposerAcceptor1Acceptor2Acceptor3Learner

Fast Byzantine Multi-Paxos

同样的也会有Fast Byzantine Multi-Paxos,为了更加Fast,本协议将Verify和Accepted进行融合,放在一步完成。

ClientAcceptor1Acceptor2Acceptor3LearnerAccept!(N,I,V)Accept!(N,I,V)Accept!(N,I,V)验证消息,同时AcceptedAccepted(N,I,V) - BROADCASTAccepted(N,I,V) - BROADCASTAccepted(N,I,V) - BROADCASTAccepted(N,I,V) - BROADCASTAccepted(N,I,V) - BROADCASTAccepted(N,I,V) - BROADCASTAccepted(N,I,V) - BROADCASTResponse(V)ClientAcceptor1Acceptor2Acceptor3Learner

更多教程请参考flydean的博客

理解分布式一致性:Paxos协议之Generalized Paxos & Byzantine 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协议之Cheap Paxos & Fast Paxos

    理解分布式一致性:Paxos协议之Cheap Paxos & Fast Paxos Cheap Paxos Message flow: Cheap Multi-Paxos Fast Paxos ...

  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. Python 程序慢的像蜗牛,我该怎么办?

    1. “一猿小讲”的风格就是多元化,偶尔会真情吐露一下程序猿的内心:偶尔也结合自己的经历畅聊一些经验杂谈:其中也不乏幽默风趣的技术故事.分享是件快乐的事情,工作之余,有时间我就尽力多码字,多推几篇文章 ...

  2. 深入解读ES6系列(四)

    来自老曾es6的前言: 哈喽小伙伴们,爱说'废'话的Z又回来了,欢迎来到Super IT曾的博客时间,上一节说了字符串,面向对象以及json的知识,这一节我们继续我们知识的海洋,一起奋斗不秃头!不足的 ...

  3. Nordic nRF52820超低功耗蓝牙5.2 SoC芯片-低端无线连接方案首选

    nRF52820是功耗超低的低功耗蓝牙 (Bluetooth Low Energy /Bluetooth LE).蓝牙mesh.Thread.Zigbee和2.4 GHz专有低端无线连接解决方案.nR ...

  4. std::string::assign函数

    string& assign (const string& str); string& assign (const string& str, size_t subpos ...

  5. iOS技能 - 最新美团、百度、腾讯、头条、阿里 面试题目记录

    关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教.主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧. 美团 一面 1.简历上写的项目问了一遍,然 ...

  6. 利用numpy实现多维数组操作图片

    1.上次介绍了一点点numpy的操作,今天我们来介绍它如何用多维数组操作图片,这之前我们要了解一下色彩是由blue ,green ,red 三种颜色混合而成,0:表示黑色 ,127:灰色 ,255:白 ...

  7. stand up meeting 12/17/2015

    part 组员                今日工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云  建立基本的pdf阅读器界面框架    4  开始实现界面框架   4 foxit PDF ...

  8. M - Help Hanzo LightOJ - 1197 (大区间素数筛法)

    题解:素数区间问题.注意到a和b的范围是1<<31,所以直接暴力打表肯定不可以.如果一个数是合数,他的两个因子要么是两个sqrt(x),要么就分布在sqrt(x)两端,所以我们可以根据sq ...

  9. 详解 Lambda表达式

    Lambda表达式 概述: Lambda 是一个匿名函数, 我们可以把 Lambda表达式理解为是一段可以传递的代码 (将代码像数据一样进行传递) 可以写出更简洁.更灵活的代码. 作为一种更紧凑的代码 ...

  10. 【题解】POJ3041 Asteroids - 图论 - 二分图匹配

    声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 POJ3041 Asteroids 题目描述 假如你现在正处在一个 \(N*N\ ...