精华内容
下载资源
问答
  • 深入浅出全面理解共识算法

    千人学习 2019-01-18 12:46:12
    对于分布式系统来说,要想正常运行,必须依靠共识算法来达成共识。那么,共识算法之于分布式系统来说可以起到哪些作用?与之相关的分布式系统基础理论有哪些?不同的共识算法之间的区别、联系以及各自的应用场景又是...
  • 什么是Paxos算法 一致性就是数据保持一致,在分布式系统中,理解为多个节点中...其实在过去很长一段时间,Paxos算法可以说是分布式共识的代名词,当前最常用的一批共识算法,比如,Fast Paxos算法,Cheap Paxos算法,R

    前言

     在分布式系统中,为了提高可用性和可靠性一般采用多副本策略,虽然多副本确实能提高可靠性和可用性,但是也产生了一个新问题,那就是如何保证多个副本之间达成共识,也就是多个副本对任何一个提案(或者说 Op)是一致的。一个 Op 如何来达到共识就得采用共识算法。
      在过去很长一段时间,Paxos算法可以说是分布式共识的代名词,当前最常用的一批共识算法,比如,Fast Paxos算法,Cheap Paxos算法,比较有名的Raft算法也是基于它发展而来的。现实中,有很多基于Paxos的产品,比如Google的Chubby,Spanner,IBM的SVC等。

     Paxos算法包括两部分:

    • Basic Paxos算法。该算法描述的是多节点之间如何就某个值达成共识;
    • Multi-Paxos思想,它描述了执行多个Basic Paxos实例,就一系列值达成共识。赫赫有名的Raft算法就是一种基于Multi-Paxos思想的共识算法。
       那么,说到这这两者的关系,可以理解为Basic-Paxos是Multi-Paxos思想的核心。

    什么是“角色”

     Paxos其实也类似,它有一个最重要的概念“角色”,在Paxos有三个“角色”,提议者(Proposer)、接受者(Acceptor)和学习者(Learner)。
     其中,提议者和接受者是这里最重要的两个角色,Paxos最核心的就是定义他们之间的通讯规则来保证某个变量在分布式系统中的一致性。下面分别介绍一下他们具体的作用:

    • 提议者(Proposer):提议者是提出议案的人,每个议案都有一个议案号,议案号是区别不同议案的唯一标识,而且议案号是有大小次序的。一般来说,集群中收到客户端请求的节点,才是提议者。

    • 接受者(Acceptor):对每个提议的值进行投票,并存储接收的值。通常来说,集群中的所有节点都扮演着接受者的角色,参与共识协商,并接收和存储数据。
        所以,经常会发现集群中的节点其实可以身兼多个“角色”。如下图那样,假设集群中有3个节点,当1个节点收到了请求,那么该节点作为提议者发起了二阶段提交,然后这个节点可以和另外两个节点一起作为接受者进行共识协商。
      在这里插入图片描述

    • 学习者(Learner):被告知投票的结果,接收达成的共识值,并存储保存。不参与投票的过程。通常,学习者是备份节点,就好比“Master-Slave”中的Slave,被动地接收数据,实现容灾备份。

     通过总结,这三个角色的功能如下:

    角色功能
    提议者接入和协调,对收到的客户端请求发起二阶段提议
    接受者投票协商和存储数据,对提议值进行投票并接受达成的共识的值,然后对共识值进行存储
    学习者存储数据,不参与共识协商,只对接收的共识的值进行存储保存

    Basic Paxos算法

     在Basic Paxos是通过2PC算法达成共识的,它使用议案代表一个提议。不过在议案中除了议案号,还包括议案值。在这里,假设用[n,v]表示一个议案。其中k表示议案号,v表示议案值。
     整个共识协商分两个阶段完成。分别为准备阶段(Prepare)和接受阶段(Accept)

    Proposal Numbers

    一个Proposal是由Proposal Numbers和Proposal Value组成的。针对每一个Proposal都有一个唯一的ID,这个ID就是Proposal Numbers。它应具备以下两个特性:

    1. 它必须是全局唯一的,不管是同一个提议者提出的不同Proposal还是不同提议者提出的相同或者不同Poroposal
    2. 它是单调递增的,它的值越大则优先级越高。

    一个propsal number 有两部分组成
    在这里插入图片描述

    1. 当前是第几轮Round Number
    2. Server Id
        每个server都保存了一个maxRound,它表示server所看见的最大round number。如果产生了一个新的proposal number,则将maxRound递增,并且同server ld拼接。这个maxRound需要持久化到硬盘上,crash/重启之后不能复用原来的proposal number。

    Prepare阶段

    1. 提议者发送提案
        提议者生成全局唯一且递增的提案号(proposal ID)后,向集群中所有结点发送提案,这里面不要携带提案内容,只携带提案号。
    2. 接受者响应提议者
        如果接受者以前已经有通过提案,将返回已通过的最大proposal ID的提案信息(value)以及已接受过的提案号(Accepted Proposal ID),没有则返回空值。
        如果准备请求的proposal ID小于等于接受者已经响应的准备请求的提案编号,那么接受者将不响应该准备请求;

    Accept阶段

    1. 提议者发送接受请求
       提议者收集到多数派的响应后,从所有的响应提案中挑选那些包含value并且其proposal ID也是最大的提案。将其作为接受的提案,如果所有响应的提案的value均为空值,则可以自己决定提案value,然后携带上当前的proposal ID,向集群中的所有节点发送接受请求。

    2. 接受者响应接受请求
       如果接受请求中的提案的proposal ID小于等于接受者已经响应的接受请求的proposal ID,那么接受者将不通过这个提案。如果不违背该规则,接受者则持久化proposal ID和value。

    例子分析

    下面,我们通过一个历史故事来简单讲解下。
      战国中期,秦国商鞅变法后迅速崛起对外扩张,在函谷关外拉开大军,准备全面入侵山东国家,山东诸国惶惶不可终日,此时公孙衍犀首游说列国,并先后出任魏国韩国赵国等多个国相,提议欲抵抗秦国必须结成同盟,合纵方可破秦。最终有三个国家魏国,楚国,韩国集兵于函谷关外,各占一个山头准备攻打秦国。但是任意一个国家和秦国对抗必败,必须在三个国家中至少有两个国家达成一致,同时进攻。每个国家都有主帅(魏王,楚王,韩王)和参谋(魏相犀首,春申君黄歇),参谋给出的进攻时间必须得到魏楚韩中任意两个国家的同意,才可决议,但是派出信使有可能被秦国密探捕获,而导致信息丢失。所以达成一致的进攻时间是个难题。那么这里考虑采用Paxos协议来决议。

    在这里插入图片描述

    1. 在准备阶段,参谋犀首派出信使送信给魏楚韩(议案号为1),魏王楚王收到信息,由于信使被捕,韩王未收到信息;
    2. 魏王楚王收到消息后,派信使告诉犀首已经收到信息,等待具体指示;
    3. 同时,参谋黄歇也派出信使给送信给魏楚韩(议案号2)。这次魏王未收到,楚王、韩王收到信息;
    4. 楚王韩王收到消息后,派信使告诉参谋黄歇已经收到信息,等待具体指示。

    在这里插入图片描述
    准备阶段完成后进入接受阶段
    5. 参谋犀首收到消息后,派信使告诉魏楚王具体攻打日期是1号;
    6. 魏王收到后觉得可以,告诉犀首1号进攻可以;
    7. 楚王收到后,因他保存的最新指示议案号是2,而犀首的议案号1小于2,所以告诉犀首,1号方案不可行,正在等待2号方案;
    8. 参谋黄歇派出信使告诉楚王韩王进攻时间为下个月2号;
    9. 楚王收到后和自己的议案号对比,发现一致,则告诉参谋黄歇方案可行;
    10. 韩王收到后,觉得参谋黄歇方案可行,则告诉参谋黄歇方案可行;
    11. 参谋犀首得到的议案不是一半以上(魏王认可、楚王不认可,韩王未知),因此只有再次派出信使,通知最新的议案号为3。这里就进入了新一轮的准备阶段。如下图所示
    在这里插入图片描述

    1. 新一轮的准备阶段,魏王收到信息后,告诉参谋犀首,我上次收到你的信息,是否更改,等待最新指示;
    2. 楚王收到信息后,告诉参谋犀首,我已经收到了议案编号3,我之前的议案值为2号,等待最新指示;
      在这里插入图片描述
    3. 进入新一轮的接受阶段,参谋犀首收到信息后,通过楚王的通知已经最新议案号为2,其对应的议案值为2号,所以这次派出信使发出信息“议案号为3,议案值为进攻日期2号”;
    4. 魏王收到后,按最新的指示执行,并回复参谋犀首;
    5. 楚王收到后,同自己保存的议案号对比,发现收到的议案号和保存的一致,则接受指示,并回复参谋犀首;
    6. 这样达成一致,半数以上同意2号。

    Basic Paxos的容错

     除了实现了共识,Basic Paxos还实现了容错,它不像其它常用的分布式事务算法那样,要所有节点都同意后才提交操作,而是只要少于一半节点出错集群也是能正常工作的。

    展开全文
  • 众所周知,分布式系统可以实现海量数据处理能力和可扩展计算能力。区块链系统作为一种分布式系统,多个节点之间如果想要对某个状态达成一致结果,必须依靠共识算法来达成共识。那么,...

    640?wx_fmt=gif

    众所周知,分布式系统可以实现海量数据处理能力和可扩展计算能力。区块链系统作为一种分布式系统,多个节点之间如果想要对某个状态达成一致结果,必须依靠共识算法来达成共识。


    那么,共识算法之于分布式系统来说可以起到哪些作用?与之相关的分布式系统基础理论有哪些?不同的共识算法之间的区别、联系以及各自的应用场景又是怎样的?

     

    640?wx_fmt=jpeg

    限时免费,扫码报名


    本期公开课,营长邀请高级算法工程师,资深系统研发,清华大学博士胡志琳,为大家系统地介绍共识算法及其容错,主要涉及以下6个部分:

     

    1.  分布式系统的基本问题,以及相关的模型;

    2.  分布式系统理论,这部分主要介绍了FLP不可能定理、CAP定理、BASE定理;

    3.  分布式系统共识算法,这部分主要介绍了“拜占庭共识算法”;

    4.  典型共识算法比较;

    5.  共识算法容错分析;

    6.  共识算法应用。

     

    下面,我们先来简单预习一下本期公开课的重点内容哦~~

     

    1.分布式系统的基本问题

     

    640?wx_fmt=png

     图1  分布式系统


    简单的讲,分布式系统就是一组通过网络通信的节点,然后它们是可以协调一致地完成共同的任务。

     

    从图1右边部分可以看到,之前的中心式拓扑结构是一个在中间的中心服务器,节点呈星型分布在它(中心服务器)的周围。

     

    而在分布式系统里面,比如区块链,每个节点都是平权的,都有同样的权利,不存在中心服务器和终端的差别。

     

    这里面有一些主要的问题,例如每个节点崩溃、节点和节点之间通讯问题、恶意节点。

    640?wx_fmt=png

    图2  分布式系统模型

     

    解决上述这些问题之前,首先要把它模型化、抽象化,在这里主要就是形式化的模型。


    从网络的角度来讲,分布式系统模型可以分为两类:同步模型和异步模型;

    从故障模型这个角度来讲,非拜占庭故障、拜占庭故障。

     

    2. 分布式系统理

     

    FLP不可能原理 (FLP这三个字母是发表这个定理的作者姓名的首字母缩写) ,讲的是基于前面的异步模型,即使一个最小的模型、即使存在最简单的失效故障模型的时候,也不存在一个可以解决一致性问题的确定性算法。这里面的关键点在于,最简单的模型以及不存在一个确定性的算法。

     

    CAP原理。尤其在传统的或者经典的分布式系统里,大家都非常熟悉这个定理。比如一个系统里面不可能同时保证强一致性、可用性和分区容忍性。如果是在实际情况中往往会根据工程特点,通过弱化其中的某个特性来保证其它两个特性。

     

    BASE理论,BA是一个基本可用性,S是软状态,E就是最终一致性。通过这三个特性,稍微牺牲掉一些对一致性的约束,就能够得到一些在实际性中满足要求的分布式系统。

     

    3.分布式系统共识算法

     

    基本来讲,共识算法目前主要分为这三类:


    第一类,Paxos用来解决非拜占庭分布式异步网络共识问题;

    第二类,BFT用来解决拜占庭传统分布式异步网络共识问题;

    第三类,POW则是用来解决拜占庭区块链分布式异步网络共识问题。

     

    4.典型共识算法对

     

    具体看一下Paxos。其实对于Paxos来讲,这个理论(或原理)是经典的纯异步模型非拜占庭问题的基础算法。


    640?wx_fmt=png

    图3  共识过程——Paxos

     

    传统的分布式系统里几乎所有的算法都是Paxos的变体,或者是从Paxos中衍生出来的,它主要是这样一个过程(如图3)。具体的方式就是Leader首先会向其他的节点发票,其它节点接收到Leader的票之后,如果是承认这个节点可以作为Leader,就会返回OK,对于这个Leader节点来说,只要得到半数以上的承认,就可以确认作为Leader来进行提案了。


    Leader节点就会把它认为应该执行的命令发给各个节点,各个节点接受到这个命令之后,就会反馈给它说“我们接受这个提案”,Leader节点接收到超过半数的“大家都同意这个提案”之后,就会正式的把提案提交上去,这个就是完成共识的过程。

      

    640?wx_fmt=png

    图4  共识过程——PBFT

     

    在拜占庭问题下,PBFT是目前来讲从功能上可以实现的一个算法,它的复杂度是一个多项式级的。它达成共识的过程,可以对比一下,比前面的要复杂一些,之所以这么复杂,就是因为有很多恶意节点,为了排除这些恶意节点的影响,每个节点都要把自己的消息给广播出去,通过这种大量通信的代价,从而得到最后共识的一致性。

     

    所以Paxos和PBFT之间的区别,最明显在于后者(指PBFT)通信量是明显增加的,前者通信量可以看作是一个N的复杂度,而后者的通信量就是N的平方的复杂度。

     

    640?wx_fmt=png

    图5  共识过程——POW

     

    最后看一下 POW典型算法。它牺牲了强一致性,采用了最终一致性,在这个前提下就简化了节点间的通讯。

     

    在最开始Leader选举阶段,每一个矿工都会默认自己就是那个Leader。然后看大家谁先挖出矿来,先挖出矿的矿工就会把自己挖出矿的消息给广播下去,然后这个块会根据Gossip协议,在整个网络进行传播。其他的节点当收到新的块就会停下自己挖块的过程,然后验证接收到的新块是否正确,如果正确的话,他就会在新块基础上,然后继续的向前挖块,整个过程大家都可以看到。前面两个算法保持一致是通过多数决策,而在POW里面,能够让所有的矿工保持一致性行动是经济激励。

     

    比如对于矿工来讲,在别人广播新块的基础上来继续挖块,这时候所得到的经济利益要远远大于不管不顾别人挖出正确块时的所得利益。

     

    因此,Paxos和PBFT是通过确定性大多数的原则来实现一致性,而后POW是通过经济上的博弈原理来实现一致性。

     

    640?wx_fmt=png

    图6  共识性能

     

    在Paxos里面可以看到Leader会向N个节点发送消息,N个节点再把消息反馈回来,接收N个消息的时候至少是接收N个输入,处理之后会广播和输出,但这是一个简化的模型,在简化模型的基础上可以看做每进行一次这样的决策的耗时就是Nμi(接收N个输入)+μb(广播的时间)+μo(输出的时间),然后1除上每次出块的耗时,就得到它的TPS。

     

    对于比特币里面的POW,块的大小是固定的,出块的速度也是固定的,所以出块的速度乘以每块的大小,再除上每个交易的平均字节数,就等于它的TPS。

     

    在这两个简化模型下就可以比较清晰地看出来,随着节点数量的增多,传统的共识算法性能下降会很快,而对于POW来讲的话,能够保证一个比较恒定的出块速度。

     

    5.共识算法容错分析

     

    一个系统肯定是会有故障的,甚至一定会存在恶意节点。区块链它的容错功能和传统的算法是一样的,而且更加看重的是要怎么抵御各种各样的攻击。对于Paxos这个算法来讲,它能够容忍的是一半以上(50%以上),最多崩溃的节点不超过50%。

     

    关于拜占庭,八几年有一个经典的论文(The Byzantine Generals Problem),在论文里面详细的分析了,对于拜占庭模式有两种解决方案,在口头协议的模式下最多只能提供三分之一的容错,然后对于书面协议来讲,所有忠实节点能够在保持共同一致行动这个前提下,有任意多个叛徒节点。

     

    那么有没有可能结合我们一些实际的工程应用,在我们特定场景中获得更高的容错率呢?实际上是有这种可能的,那什么样的情况下能够实现更高的容错率呢?以太坊的创始人提出一种方案,引入了一些前提条件:

     

    第一个是引入强同步,第二个是引入观察者。


    然后是把原来的共识算法改造成延迟选择算法和阈值共识算法的结合。通过引入这些条件,可以实现“即使只有一个忠实节点,那么在强同步条件下能够实现99%的容错”。

     

    6.共识算法应用

     

    在传统分布式应用里面,主要是基于Paxos以及Paxos各种各样的变体,比如说像Raft,会在Zookeeper等现在广泛应用的系统中使用。

     

    在区块链场景中,目前公链上主要就是基于POW以及POW变体,POS、DPOS这样的来实现完全去中心化的、非常大规模的网络

     

    对于联盟链来讲,它的节点可以就几十个,这种情况下可能会采用传统共识算法的,像PBFT还有以PBFT为基础的变种,可能会达到几十个甚至上百个节点都有可能,但是想要实现上万个节点的共识网络,功能上就实现不了了。

     

    对于私有链来讲,应用场景可控性更强,所以能够选择的共识算法范围就比较宽,比如Raft、Paxos都可以用。


    — END —


    更精彩的技术解析,周四晚八点,胡博士与大家不见不散!


    适合对象:面向计算机专业本科生、研究生,相关方向从业人员;分布式系统研发人员;后台开发人员;对区块链感兴趣的爱好者和技术人员;了解分布式系统等知识更佳。


    想要了解、学习更多课程内容,扫码即可报名哦~~

    640?wx_fmt=jpeg


    推荐阅读:



    点击“阅读原文”,打开 APP 获取更多干货哟!


    好文!必须点好看


    展开全文
  • 区块链中常用共识算法总结

    万次阅读 2017-09-18 19:15:21
    本文是对区块链技术中涉及的共识算法的学习总结整理。 其中PBFT是联盟链常用共识算法,Raft是私有链常用的共识算法,而PoW(比特币采用)是公有链常用的共识算法......

    本文是对区块链技术中涉及的共识算法的学习总结整理。 其中PBFT是联盟链常用共识算法,Raft是私有链常用的共识算法,而PoW(比特币采用)是公有链常用的共识算法。

    建议对区块链的学习,要分成是公有链还是联盟链,这两种链中一般采用的共识算法是有较大不同的,P2P网络等也有较大的不同。传统的共识算法一般不适用于公有链,而一定程度上适用于联盟链。

    实用拜占庭容错系统PBFT(联盟链中常用)

    拜占庭容错技术(Byzantine Fault Tolerance,BFT)是一类分布式计算领域的容错技术,是一种解决分布式系统容错问题的通用方案。实用拜占庭容错系统(Practical Byzantine Fault Tolerance,PBFT)使拜占庭协议的运行复杂度从指数级别降低到多项式级别,使拜占庭协议在分布式系统中应用成为可能。

    拜占庭容错系统

    拜占庭容错系统是指:在一个拥有 n n n台节点的系统,整个系统,对每个请求满足如下条件:

    • 所有非拜占庭节点使用相同的输入信息,产生同样的结果;
    • 如果输入的信息正确,那么所有非拜占庭节点必须接收这个信息,并计算相应的结果。

    与此同时,在拜占庭系统的实际运行过程中一般假设系统中拜占庭节点不超过 m m m台,并且对每个请求满足2个指标:

    • 安全性——任何已经完成的请求都不会被更改,它可以在以后请求看到;
    • 活性——可以接受并且执行非拜占庭客户端的请求,不会被任何因素影响而导致非拜占庭客户端的请求不能执行。

    拜占庭系统目前普遍采用的假设条件包括:

    1. 拜占庭节点的行为可以是任意的,拜占庭节点之间可以共谋;
    2. 节点之间的错误是不相关的;
    3. 节点之间通过异步网络连接,网络中的消息可能丢失、乱序、延时到达;
    4. 服务器之间传递的信息,第三方可以知晓 ,但是不能窜改、伪造信息的内容和验证信息的完整性;

    发生故障的节点称为拜占庭节点;正常的节点为非拜占庭节点。

    状态机拜占庭系统

    状态机拜占庭系统的特点

    状态机拜占庭系统的特点是整个系统共同维护一个状态,所有节点采取一致的行动,一般包括 3 种协议:一致性协议检查点协议视图更换协议。系统正常运行在一致性协议和检查点协议下,视图更换协议则是只有在主节点出错或者运行缓慢的情况下才会启动,负责维系系统继续执行客户端请求的能力。

    状态机拜占庭系统的核心协议

    一、一致性协议
    一致性协议的目标是使来自客户端的请求在每个服务器上都按照一个确定的顺序执行。在协议中,一般有一个服务器被称作主节点,负责将客户端的请求排序;其余的服务器称作从节点,按照主节点提供的顺序执行请求。所有的服务器都在相同的配置信息下工作,这个配置信息称作view,每更换一次主节点,view就会随之变化。

    一致性协议至少包含3个阶段:发送请求、序号分配和返回结果。根据协议设计的不同,可能包含相互交互、序号确认等阶段。

    一致性协议解决一致性的方法主要有:
    1)服务器之间两两交互,服务器通过将自己获得的信息传递给其他的服务器;
    2)由客户端收集服务器的信息,将收集的信息制作成证明文件再发送给服务器。对于一个包含 3 m + 1 3m+1 3m+1台服务器的拜占庭系统,需要收集到 2 m + 1 2m+1 2m+1台服务器发送的一致信息,才能保证达成一致的非拜占庭服务器数量大于拜占庭服务器数量。

    引申思考:采用PBFT共识算法的区块链系统节点数量的下限和上限?

    二、检查点协议
    拜占庭系统每执行一个请求,服务器需要记录日志。如果日志得不到及时的清理,就会导致系统资源被大量的日志所占用,影响系统性能及可用性。另一方面,由于拜占庭服务器的存在,一致性协议并不能保证每一台服务器都执行了相同的请求,所以,不同服务器状态可能不一致。例如,某些服务器可能由于网络延时导致从某个序号开始,之后的请求都没有执行。因此,拜占庭系统中设置周期性的检查点协议,将系统中的服务器同步到某一个相同的状态。因此,周期性的检查点协议可以定期地处理日志,节约资源,同时及时纠正服务器状态。

    处理日志主要解决的问题就是区分那些日志可以清理,那些日志仍然需要保留。如果一个请求已经被 m + 1 m+1 m+1台非拜占庭服务器执行,并且某一服务器 i i i能够向其他的服务器证明这一点,那么 i i i就可以将关于这个请求的日志删除。目前,协议普遍采用的方式是服务器每执行一定数量的请求,就将自己的状态发送给所有服务器并且执行一个该协议,如果某台服务器接收到 2 m + 1 2m+1 2m+1台服务器的状态,那么其中一致的部分就是至少有 m + 1 m+1 m+1非拜占庭服务器经历过的状态,因此,这部分的日志就可以删除,同时将自己状态更新只较新状态。

    三、视图更换
    在一致性协议里,已经知道主节点在整个系统中拥有序号分配,请求转发等核心能力,支配着这个系统的运行行为。然而一旦主节点自身发生错误,就可能导致从节点接收到具有相同序号的不同请求,或者同一个请求被分配多个序号等问题,这将直接导致请求不能被正确执行。视图更换协议的作用就是在主节点不能继续履行职责时,将其用一个从节点替换掉,并且保证已经被非拜占庭服务器执行的请求不会被篡改。

    视图更换协议一般有两种触发方式:
    1)只由服务器触发,这一类触发方式中,判断服务器一致性是否达成的工作是由服务器自身负责,客户端不能从请求的整个执行过程中获得服务器运行状况的信息;
    2)客户端触发,这一类触发方式中,客户端一般负责判断服务器是否达成一致,如果不达成一致,那么就能判断服务器运行出现问题,如果是主节点的问题就会要求服务器更换主节点。

    视图更换协议需要解决的问题是如何保证已经被非拜占庭服务器执行的请求不被更改。由于系统达成一致性之后至少有 m + 1 m+1 m+1台非拜占庭服务器执行了请求,所以目前采用的方法是:由新的主节点收集至少 2 m + 1 2m+1 2m+1台服务器的状态信息,这些状态信息中一定包含所有执行过的请求;然后,新主节点将这些状态信息发送给所有的服务器,服务器按照相同的原则将在上一个主节点完成的请求同步一遍.同步之后,所有的节点都处于相同的状态,这时就可以开始执行新的请求。

    实用拜占庭容错系统PBFT详解

    实用拜占庭容错系统(Practical Byzantine Fault Tolerance,PBFT),是一类状态机拜占庭系统。

    PBFT的一致性协议如下:PBFT系统通常假设故障节点数为 m m m个,而整个服务节点数为 3 m + 1 3m+1 3m+1个。每一个客户端的请求需要经过5个阶段,通过采用两次两两交互的方式在服务器达成一致之后再执行客户端的请求。由于客户端不能从服务器端获取任何服务器运行的状态信息,PBFT中主节点是否发生错误只能由服务器监测。如果服务器在一段时间内都不能完成客户端的请求,则会触发视图更换协议。
    这里写图片描述

    上图显示了一个简化的PBFT的协议通信模式,其中 C C C为客户端, N 0 N_0 N0~ N 3 N_3 N3表示服务节点,特别的, N 0 N_0 N0为主节点, N 3 N_3 N3为故障节点。整个协议的基本过程如下:
    1)客户端发送请求,激活主节点的服务操作;
    2)当主节点接收请求后,启动三阶段的协议以向各从节点广播请求;

    1. 序号分配阶段,主节点给请求赋值一个序号 n n n,广播序号分配消息和客户端的请求消息 m m m,并将构造pre-prepare消息给各从节点;
    2. 交互阶段,从节点接收pre-prepare消息,向其他服务节点广播prepare消息;
    3. 序号确认阶段,各节点对视图内的请求和次序进行验证后,广播commit消息,执行收到的客户端的请求并给客户端响应。

    3)客户端等待来自不同节点的响应,若有 m + 1 m+1 m+1个响应相同,则该响应即为运算的结果;

    Raft

    Raft是在非拜占庭故障下达成共识的强一致协议在区块链系统中,使用Raft实现记账共识的过程可以描述如下:首先选举一个leader,接着赋予leader完全的权利管理记账。leader从客户端接收记账请求,完成记账操作,生成区块,并复制到其他记账节点。有了leader简化了记账操作的管理。如果leader失效或与其他节点失去联系,这时,系统就会选出新的leader。

    Raft基础

    一个Raft集群通常包含5个服务器,允许系统有2个故障服务器。每个服务器处于3个状态之一:leader、follower或candidate。正常操作状态下,仅有一个leader,其他的服务器均为follower。follower是被动的,不会对自身发出的请求而是对来自leader和candidate的请求做出响应。leader处理所有的客户端请求(若客户端联系follower,则该follower将转发给leader)。candidate状态用来选举leader。

    Raft阶段主要分为两个,首先是leader选举过程,然后在选举出来的leader基础上进行正常操作,比如日志复制、记账等。

    leader选举

    当follower在选举超时时间内未收到leader的心跳消息,则转换为candidate状态。为了避免选举冲突,这个超时时间是一个150~300ms之间的随机数。

    一般而言,在Raft系统中:
    1)任何一个服务器都可以成为一个候选者candidate,它向其他服务器follower发出要求选举自己的请求。
    2)其他服务器同意了,发出OK。如果在这个过程中,有一个follower宕机,没有收到请求选举的要求,此时候选者可以自己选自己,只要达到 N / 2 + 1 N/2+1 N/2+1的大多数票,候选人还是可以成为leader。
    3)这样这个候选者就成为了leader领导人,它可以向follower发出指令,比如进行记账。
    4)以后可以通过心跳进行记账的通知。
    5)一旦这个leader崩溃了,那么follower中有一个成为候选者,并发出邀票选举。
    6)follower同意后,其成为leader,继续承担记账等指导工作。
    在这里插入图片描述

    记账过程

    Raft的记账过程按以下步骤完成:
    1)假设leader领导人已经选出,这时客户端发出增加一个日志的要求;
    2)leader要求follower遵从他的指令,都将这个新的日志内容追加到他们各自日志中;
    3)大多数follower服务器将交易记录写入账本后,确认追加成功,发出确认成功消息;
    4)在下一个心跳中,leader会通知所有follower更新确认的项目。
    对于每个新的交易记录,重复上述过程。

    如果在这一过程中,发生了网络通信故障,使得leader不能访问大多数follower,那么leader只能正常更新它能访问的那些follower服务器。而大多数的服务器follower因为没有了leader,它们将重新选举一个候选者作为leader,然后这个leader作为代表与外界打交道,如果外界要求其添加新的交易记录,这个新的leader就按上述步骤通知大多数follower,如果这时网络故障修复了,那么原先的leader就变成follower,在失联阶段,这个老leader的任何更新都不能算确认,都回滚,接收新的leader的新更新。

    如果想更直观的理解Raft协议,可以看动画演示
    论文原文:In Search of an Understandable Consensus Algorithm
    学习参考:The Raft Consensus Algorithm

    PoW

    PoW的原理可参看这篇博文哈希算法及在区块链中的应用中哈希函数难题友好性这一节,理解了难题友好性,就基本理解了PoW机制的原理。结合比特币去理解PoW。比特币PoW的过程,就是将不同的nonce值作为输入,尝试进行SHA256哈希运算,找出满足给定数量前导0的哈希值的过程。要求的前导0的个数越多,代表难度越大。比特币节点求解工作量证明问题的步骤归纳如下:

    1)生成铸币交易,并与其他所有准备打包进区块的交易组成交易列表,通过Merkle树算法生成Merkle跟哈希;
    2)把Merkle根哈希及其他相关字段组装成区块头,将区块头的80字节数据作为工作量证明的输入;
    3)不停地变更区块头中的随机数nonce,并对每次变更后的区块头做双重SHA256运算,将结果值与当前网络的目标难度做比对,如果满足难度条件,则解题成功,工作量证明完成。

    参考资料:
    拜占庭共识算法之PBFT
    Raft动画演示
    The Raft Consensus Algorithm

    展开全文
  • 共识算法

    2021-07-05 23:44:57
    常见的共识算法有raft(reliable,replicated,redundant,And fault-tolerated)和Poxos算法,raft算法相对更清晰好理解,是poxos的替代,如etcd。poxos比较复杂难懂,用于zookeeper。 典型的分布式三节点场景N1,...

    共识算法(consensus A7M),即达成共识的过程,而非一致性算法。一致性(consistency)是终态,共识算法是达成一致性的一种实现手段和过程。

    常见的共识算法有raft(reliable,replicated,redundant,And fault-tolerated)和Poxos算法,raft算法相对更清晰好理解,是poxos的替代,如etcd。poxos比较复杂难懂,用于zookeeper。

    典型的分布式三节点场景N1,N2,N3,刚启动触发 leader election,节点状态分leader,candidater,follower,选主采用抢注机制,完成选主后为了保证leader是靠谱的,需要有keepalive机制,若leader保活超时会触发新一轮选举。

    leader节点会负责资源分配,负载均衡(LB),同时会负责log同步,状态机对齐等共识决策,以此来达成数据一致性。

    展开全文
  • 30 种共识算法完全列表

    万次阅读 2019-04-05 10:32:02
    共识算法是所有区块链 /DAG 的基础,它们构成了区块链 /DAG 平台中的最重要部分。 如果没有共识算法,我们得到只是一个不可写的哑(dummy)数据库。 ...另:本文假定读者理解共识算法及其在区...
  • Raft共识算法

    2020-05-29 23:21:30
    Raft共识算法在分布式系统中是常用的共识算法之一,论文原文In Search of an Understandable Consensus Algorithm ,作者在论文中指出Poxas共识算法的两大问题,其一是难懂,其二是应用到实际系统存在困难。...
  • 共识算法汇总

    2018-11-23 11:55:58
    共识算法汇总 前言 共识算法并不是只有POW,POS,DPOS,PBFT,RAFT等,还有很多小众的共识算法。笔者不可能全部了解共识算法,但是将他们汇总在一起,将来遇到了也有一个知识库查询,而不是到时候再来百度谷歌查询。 ...
  • 共识算法是近年来分布式系统研究的热点,也是区块链技术的核心要素。如何理解共识算法重要性及评价体系?如何认清当前主流的共识算法及背后发展脉络?接下来共识算法发展的趋势与阻碍...
  • 文章目录为什么需要共识算法Raft paper: In Search of an Understandable Consensus Algorithm (Extended Version) 为什么需要共识算法 为了保证服务的稳定性(解决单点故障问题),人们提出了副本技术...
  • 文章目录共识算法针对的问题为什么对 Paxos、Raft 等的研究很重要Paxos、Multi-Paxos、Raft 共识算法针对的问题 分布式系统中,基础的 共识算法(Consensus Algorithm) 希望解决的是如下问题:消息有乱序、丢失、...
  • 区块链共识算法简介

    千次阅读 2019-04-05 10:32:55
    共识算法是区块链项目中最核心的部分。有分布式,就需要达成共识。目前为止,对于区块链项目争议最大的之一也是共识算法,比如EOS的DPoS机制。回到共识机制本身,我们如何来理解背后的本质呢?而不是人云亦云呢?从...
  • 区块链:3、共识算法 PoS机制 概念、三个关键要素、POS过程、共识记账、能否解决拜占庭将军问题
  • 区块链中的共识算法: 1、Pow工作量证明:工作量证明最初提出是为了防止垃圾邮件,后来由中本聪在比特币区块链设计共识机制中引入。工作量证明是通过解决是一个不容易解答但是容易验证的问题来争取记账权以达到共识...
  • 理解:分布式共识就是多个应用在某一项决策上达成共识并通过决策,然后将决策应用到每一个应用上。 应用:区块链、redis的哨兵选举机制 问题:如何实现分布式共识? 目前有三种算法: paxos算法:Chubby分布式锁 ...
  • Tendermint共识算法

    千次阅读 2019-01-06 22:08:34
    Tendermint共识算法1 Abstract2 Introduction3 Algorithm Details3.1 NewHeight3.2 Propose3.3 Prevote3.4 Precommit3.5 Commit4 Algorithm Analysis4.1 Safety4.2 Liveness5 Summary6 Reference 1 Abstract 区块链...
  • 区块链基础:共识算法

    千人学习 2018-11-28 15:28:53
    在区块链网络中,谁获得记账权是... 共识算法即这种“共识”的算法/代码体现; 共识算法解决了拜占庭将军问题,即让一群人在彼此不信任的情况下还能在一起自动协调工作; 本套课程带你认识常用的共识算法及其代码实现;
  • 拜占庭容错共识算法介绍

    千次阅读 2020-12-22 17:34:07
    区块链的共识算法中,除了常见的工作量证明(PoW,Proof of Work)和权益证明(PoS,Proof of Stake)外,还有拜占庭容错(Byzantine Fault Tolerance, BFT)共识算法。 拜占庭容错(Byzantine Fault Tolerance, BFT...
  • 本套课程带你认识常用的共识算法及其代码实现 课程简介 @课程收益: 掌握劳动量证明(PoW)算法及其实现;  课程配套学习资料,建议学员学习过程中跟着视频教程实操,可理解更加深入。技术问题可在下方留言,每晚8...
  • 共识算法PBFT算法

    2019-05-15 10:45:59
    链客,专为开发者而生,有问必答!...根据拜占庭问题演变而来的算法PBFT算法,无论执行流程的复杂度还是算法的效率来说,PBFT是效率最好的算法,其是1999年卡斯特罗和利斯科夫提出来的,将算法复...
  • 共识算法解读-天下武功唯快不破Conflux共识算法 串行交易引发的吞吐量瓶颈 上次我们讲到GHOST算法,它在中本聪共识的基础上提出的确定主链的算法,在保障了在高吞吐量的同时还保障了安全性(即不容易分叉,依然保证...
  • 共识算法之开篇

    2017-12-07 21:21:00
    共识算法是区块链的核心,因此想要真正弄懂什么是区块链,首先就要理解什么是共识算法,为什么要用共识算法共识算法并不是伴随着比特币的产生而出现的,早在1997年 Adam Back 设计出Hashcash,最初是为了预防...
  • 区块链共识算法总结

    千次阅读 2020-03-13 12:01:57
    常见共识算法介绍 在异步系统中,需要主机之间进行状态复制,以保证每个主机达成一致的状态共识。而在异步系统中,主机之间可能出现故障,因此需要在默认不可靠的异步网络中定义容错协议,以确保各个主机达到安全...
  • 文章出处:... 区块链共识算法知多少?(POW、POS、DPOS、PBFT区块链共识算法) ...区块链 共识算法&...POW、POS、DPOS、PBFT区块链共识算法区块链区块链是一种去中心化的分布式账本系统,它可...
  • Paxos共识算法

    2019-02-21 11:35:06
    Paxos共识算法 paxos是一族用来解决分布式系统共识的基础算法,共识过程就是在一组节点上达成一个一致的结果。由于节点可能会错误,通讯消息也可能会丢失,所以建立共识是一个比较复杂的过程。 paxos算法的假定 ...
  • Pow共识算法

    2019-10-06 16:05:11
    谈到哈希算法,每个程序员都不陌生,但是谈到比特币共识算法PoW,如果没有接触过的技术人员可能觉得应该会很复杂,毕竟全球的比特币节点数量如此庞大,达成共识的算法应该不会很简单。但其实如果你已掌握哈希算法,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,677
精华内容 7,070
关键字:

如何理解共识算法