理解分布式一致性:拜占庭容错与PBFT
理解分布式一致性:拜占庭容错与PBFT
之前的几篇文章我们讲了分布式协议里面的Paxos协议和Raft协议。这两个协议主要适用于可信节点的情况,所谓可信节点就是节点只会出现因为系统或者网络问题的宕机情况,不会有恶意节点。
那么如果有恶意节点的情况下,我们怎么去达成共识呢?一个很简单的办法就是少数服从多数,下面我们看一下拜占庭是做的。
拜占庭问题
先看一下我们要解决的问题,也叫做拜占庭将军问题。
话说有一天有n个拜占庭将军相约于魔法师大峡谷中,他们的目标就是推掉对方的塔。塔有点强大,只有不少于m个将军同时去推塔才能成功,如果一个一个的去推塔,就免不了身死道消的结果。那时候他们的微信版本还比较低,不能建群聊天,只能一对一的通信。
将军之间并不是表面上看起来的一条心,假如一个将军想组织大家在下午两点钟去偷塔,那需要怎么样操作才能保证不少于m个将军同时执行”两点钟偷塔“这个命令呢?
这个问题就叫做拜占庭将军问题,是指在不可信任环境下的分布式一致性问题。
这里我想强调一点,分布式一致性是指各个节点之间的数据同步一致,跟数据正确与否没有关系。
拜占庭容错BFT
拜占庭容错是分布式协议的一种属性,如果这种协议可以解决不可信任环境下的分布式一致性问题,那么它就是拜占庭容错。
PBFT(Practical Byzantine Fault Tolerance)
PBFT是拜占庭容错的一种实现。它的性能很高并且低延时,能够解决不信任节点的问题。
其有如下几个特征:
1. 同一时间只有一个Leader向外发送消息,其它节点只是被动接收消息。
2. 所有的节点互相之间通信,并且将其收到的消息转发给其他节点,从而达成多数共识。
3. 节点之间的消息需要保证:A:节点收到的消息确实是某个节点转发的。B:消息在发送过程中不会被篡改。

如果想让PBFT正常工作,那么恶意节点个数不能大于总节点个数的1/3。
正常来讲,节点个数越多,恶意节点所占有的比率就会越低,系统就会越稳定,但是因为所有的节点之间需要两两通信,节点个数的增多会带来节点之间通信的压力。
下面看下PBFT的工作流程:
- 客户端发给服务器说我要执行命令A。
- Leader将该命令分发给所有被动节点。
- 客户端收到f+1(f 是系统能够承受的最大恶意节点个数,即系统总节点个数为3f+1)个相同的结果,那么客户端即认为共识完成。
这里Leader是随机选择出来的,如果选出来的Leader在给定的时间内并没有发出广播,那么系统会自动挑选新的Leader并进入下一轮。
why 3f+1 ?
很多同学可能不理解为什么对于f个恶意节点来说,至少要3f+1个节点才能正常工作。这里给大家解释一下。
之前在Paxos和Raft协议里面,我们给大家讲过在可信任节点的环境里面,达成共识的条件是收到的消息需要>n/2 ,即要收到大多数节点的反馈才能表示共识完成。
那么在有不可信节点f的情况下,我们的可信任节点个数是n-f个,我们收到的可信任节点个数的反馈必须>(n-f)/2才表示绝大多数可信任节点已经收到消息了。同时我们也可能收到f个不信任节点发来的消息,那么当(n-f)/2 > f 的时候,根据多数原则,我们可以区分出哪些是信任消息,哪些是不可信任消息,因此得出 n> 3f .
PBFT 的优点
- 一致性结果一旦产出,不会更改。在区块链世界,像是比特币,以太坊,经常会听到区块确认的概念,这个就是结果不确定的问题,他们用的POW算法是以链的长度来决定最终的区块,当有更长的链产生的时候,之前的交易会被完全推翻。而PBFT不会存在这个问题。
- 相对于POW,PBFT对能源的消耗会少很多很多,再也不用浪费资源去挖坑了。
PBFT 的缺点
说完优点说缺点。其实前面我们也提到了,PBFT需要节点之间两两通信,当节点个数太多的话,节点之间通信的消耗会大大增加。所以PBFT只适合用在联盟内部少数节点的情况。像是Hyperledger这样的联盟链。
同时,PBFT也可能会受到女巫攻击(Sybil attack),这个后面我们有时间再单独讲。
更多教程请参考flydean的博客
理解分布式一致性:拜占庭容错与PBFT的更多相关文章
- 实用拜占庭容错算法PBFT
实用拜占庭容错算法PBFT 实用拜占庭容错算法PBFT 96 乔延宏 2017.06.19 22:58* 字数 1699 阅读 4972评论 0喜欢 11 分布式架构遭遇的问题 分布式架构会遭遇到以下 ...
- 理解分布式一致性:Paxos协议之Generalized Paxos & Byzantine Paxos
理解分布式一致性:Paxos协议之Generalized Paxos & Byzantine Paxos Generalized Paxos Byzantine Paxos Byzantine ...
- 理解分布式一致性与Raft算法
理解分布式一致性与Raft算法 永远绕不开的CAP定理 出于可用性及负载方面考虑,一个分布式系统中数据必然不会只存在于一台机器,一致性简单地说就是分布式系统中的各个部分保持数据一致 但让数据保持一致往 ...
- 理解分布式一致性:Paxos协议之Cheap Paxos & Fast Paxos
理解分布式一致性:Paxos协议之Cheap Paxos & Fast Paxos Cheap Paxos Message flow: Cheap Multi-Paxos Fast Paxos ...
- 理解分布式一致性:Paxos协议之Multi-Paxos
理解分布式一致性:Paxos协议之Multi-Paxos Multi-Paxos without failures Multi-Paxos when phase 1 can be skipped Mu ...
- 理解分布式一致性:Paxos协议之Basic Paxos
理解分布式一致性:Paxos协议之Basic Paxos 角色 Proposal Number & Agreed Value Basic Paxos Basic Paxos without f ...
- 理解分布式一致性:Raft协议
理解分布式一致性:Raft协议 什么是分布式一致性 Leader选举 日志复制流程 term选举周期 timeout 选举和选举timeout 选举分裂 日志复制和心跳timeout 在分布式系统中, ...
- 区块链共识算法 PBFT(拜占庭容错)、PAXOS、RAFT简述
共识算法 区块链中最重要的便是共识算法,比特币使用的是POS(Proof of Work,工作量证明),以太币使用的是POS(Proof of Stake,股权证明)使得算理便的不怎么重要了,而今PO ...
- Raft 为什么是更易理解的分布式一致性算法
一致性问题可以算是分布式领域的一个圣殿级问题了,关于它的研究可以回溯到几十年前. 拜占庭将军问题 Leslie Lamport 在三十多年前发表的论文<拜占庭将军问题>(参考[1]). 拜 ...
随机推荐
- Ruby学习计划-(1)搭建开发环境
环境搭建 工欲善其事,必先利其器.要学习一门新的语言当然也需要搭建好开发环境,这样才能更加高效的完成工作提高自身的工作效率.PS:由于自己使用的是MacBookPro,因此之后的所有问题 ...
- vulnhub~sunset:dusk1
晚上闲来无事,准备做个target,结果是各种错误.在睡觉前还是没有顺利的做出来.先将TroubleSHOOTing 总结如下: 在用hydra爆破mysql的时候,发现 'MySql Host is ...
- E - E CodeForces - 1100E(拓扑排序 + 二分)
E - E CodeForces - 1100E 一个n个节点的有向图,节点标号从1到n,存在m条单向边.每条单向边有一个权值,代表翻转其方向所需的代价.求使图变成无环图,其中翻转的最大边权值最小的方 ...
- html 中video标签视频不自动播放的问题
有个需求,客户想做个打开官网自动播放一段视频,楼主使用了video标签,即下面的代码::于是我在video标签上添加了属性 autoplay=“autoplay” loop=“loop”然而通过地址栏 ...
- Jenkins Pipeline 持续集成
Jenkins Pipeline 持续集成 Pipeline Script 执行流程 在使用Pipeline之前请确保Jenkins是2.x版本以上,并且安装了Pipeline插件. Jenkins提 ...
- Linux网络基础,路由的追踪
一.traceroute traceroute [-46ndFT] [-f<存活数值>] [-g<网关>] [-i(--interface)<device>] [- ...
- Java字符串的应用
字符串的简单应用 public class join { public static void main (String args[]){ String s1 = new String (" ...
- Java Array 常见报错ArrayIndexOutOfBoundsException NullPointerException
本文介绍array报错, 数组索引越界异常: ArrayIndexOutOfBoundsException, 空指针:NullPointerException package myArray; /* ...
- 数据结构和算法(Golang实现)(8.1)基础知识-前言
基础知识 学习数据结构和算法.我们要知道一些基础的知识. 一.什么是算法 算法(英文algorithm)这个词在中文里面博大精深,表示算账的方法,也可以表示运筹帷幄的计谋等.在计算机科技里,它表示什么 ...
- php开发中如何判断 是否微信访问
在开发中遇到了这样一个需求,仅允许在微信中访问,所以就要对微信浏览器访问进行判断,本篇博文讲述如何判断是否是微信访问. /** * 判断是否微信访问 * @return bool */ functio ...