众所周知,分布式系统可以实现海量数据处理能力和可扩展计算能力。区块链系统作为一种分布式系统,多个节点之间如果想要对某个状态达成一致结果,必须依靠共识算法来达成共识。
那么,共识算法之于分布式系统来说可以起到哪些作用?与之相关的分布式系统基础理论有哪些?不同的共识算法之间的区别、联系以及各自的应用场景又是怎样的?
限时免费,扫码报名
本期公开课,营长邀请高级算法工程师,资深系统研发,清华大学博士胡志琳,为大家系统地介绍共识算法及其容错,主要涉及以下6个部分:
1. 分布式系统的基本问题,以及相关的模型;
2. 分布式系统理论,这部分主要介绍了FLP不可能定理、CAP定理、BASE定理;
3. 分布式系统共识算法,这部分主要介绍了“拜占庭共识算法”;
4. 典型共识算法比较;
5. 共识算法容错分析;
6. 共识算法应用。
下面,我们先来简单预习一下本期公开课的重点内容哦~~
1.分布式系统的基本问题
图1 分布式系统
简单的讲,分布式系统就是一组通过网络通信的节点,然后它们是可以协调一致地完成共同的任务。
从图1右边部分可以看到,之前的中心式拓扑结构是一个在中间的中心服务器,节点呈星型分布在它(中心服务器)的周围。
而在分布式系统里面,比如区块链,每个节点都是平权的,都有同样的权利,不存在中心服务器和终端的差别。
这里面有一些主要的问题,例如每个节点崩溃、节点和节点之间通讯问题、恶意节点。
图2 分布式系统模型
解决上述这些问题之前,首先要把它模型化、抽象化,在这里主要就是形式化的模型。
从网络的角度来讲,分布式系统模型可以分为两类:同步模型和异步模型;
从故障模型这个角度来讲,非拜占庭故障、拜占庭故障。
2. 分布式系统理论
FLP不可能原理 (FLP这三个字母是发表这个定理的作者姓名的首字母缩写) ,讲的是基于前面的异步模型,即使一个最小的模型、即使存在最简单的失效故障模型的时候,也不存在一个可以解决一致性问题的确定性算法。这里面的关键点在于,最简单的模型以及不存在一个确定性的算法。
CAP原理。尤其在传统的或者经典的分布式系统里,大家都非常熟悉这个定理。比如一个系统里面不可能同时保证强一致性、可用性和分区容忍性。如果是在实际情况中往往会根据工程特点,通过弱化其中的某个特性来保证其它两个特性。
BASE理论,BA是一个基本可用性,S是软状态,E就是最终一致性。通过这三个特性,稍微牺牲掉一些对一致性的约束,就能够得到一些在实际性中满足要求的分布式系统。
3.分布式系统共识算法
基本来讲,共识算法目前主要分为这三类:
第一类,Paxos用来解决非拜占庭分布式异步网络共识问题;
第二类,BFT用来解决拜占庭传统分布式异步网络共识问题;
第三类,POW则是用来解决拜占庭区块链分布式异步网络共识问题。
4.典型共识算法对比
具体看一下Paxos。其实对于Paxos来讲,这个理论(或原理)是经典的纯异步模型非拜占庭问题的基础算法。
图3 共识过程——Paxos
传统的分布式系统里几乎所有的算法都是Paxos的变体,或者是从Paxos中衍生出来的,它主要是这样一个过程(如图3)。具体的方式就是Leader首先会向其他的节点发票,其它节点接收到Leader的票之后,如果是承认这个节点可以作为Leader,就会返回OK,对于这个Leader节点来说,只要得到半数以上的承认,就可以确认作为Leader来进行提案了。
Leader节点就会把它认为应该执行的命令发给各个节点,各个节点接受到这个命令之后,就会反馈给它说“我们接受这个提案”,Leader节点接收到超过半数的“大家都同意这个提案”之后,就会正式的把提案提交上去,这个就是完成共识的过程。
图4 共识过程——PBFT
在拜占庭问题下,PBFT是目前来讲从功能上可以实现的一个算法,它的复杂度是一个多项式级的。它达成共识的过程,可以对比一下,比前面的要复杂一些,之所以这么复杂,就是因为有很多恶意节点,为了排除这些恶意节点的影响,每个节点都要把自己的消息给广播出去,通过这种大量通信的代价,从而得到最后共识的一致性。
所以Paxos和PBFT之间的区别,最明显在于后者(指PBFT)通信量是明显增加的,前者通信量可以看作是一个N的复杂度,而后者的通信量就是N的平方的复杂度。
图5 共识过程——POW
最后看一下 POW典型算法。它牺牲了强一致性,采用了最终一致性,在这个前提下就简化了节点间的通讯。
在最开始Leader选举阶段,每一个矿工都会默认自己就是那个Leader。然后看大家谁先挖出矿来,先挖出矿的矿工就会把自己挖出矿的消息给广播下去,然后这个块会根据Gossip协议,在整个网络进行传播。其他的节点当收到新的块就会停下自己挖块的过程,然后验证接收到的新块是否正确,如果正确的话,他就会在新块基础上,然后继续的向前挖块,整个过程大家都可以看到。前面两个算法保持一致是通过多数决策,而在POW里面,能够让所有的矿工保持一致性行动是经济激励。
比如对于矿工来讲,在别人广播新块的基础上来继续挖块,这时候所得到的经济利益要远远大于不管不顾别人挖出正确块时的所得利益。
因此,Paxos和PBFT是通过确定性大多数的原则来实现一致性,而后POW是通过经济上的博弈原理来实现一致性。
图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 —
更精彩的技术解析,周四晚八点,胡博士与大家不见不散!
适合对象:面向计算机专业本科生、研究生,相关方向从业人员;分布式系统研发人员;后台开发人员;对区块链感兴趣的爱好者和技术人员;了解分布式系统等知识更佳。
想要了解、学习更多课程内容,扫码即可报名哦~~
推荐阅读:
ETC遭受51%算力攻击,压垮PoW的最后一根稻草
资源 | 最新版区块链术语表(中英文对照)
STO不会火,比特大陆不会死,币安会去非洲:区块链行业的63个预测
MongoDB背锅、58同城中枪,2亿简历遭泄露竟祸起程序员爬虫?
程序员崩溃了!想拿的年终奖怎么说黄就黄?!
维基百科联手谷歌翻译,结果“惨不忍睹”!
对不起,我就是喜欢问你Spring构造器注入原理
刚刚!程序员集体荣获2个冠军,这份2018 IT报告还说这些!
点击“阅读原文”,打开 APP 获取更多干货哟!