分布式之PBFT算法

news2024/12/19 16:44:59

写在前面

在分布式之拜占庭问题 一文中我们分析了拜占庭问题,并一起看了支持拜占庭容错的口信消息性和签名消息性算法,但是这两种算法都有一个非常严重的问题,就是消息数量太多,通信的成本太大,消息数量复杂度为O(n ^ (f + 1)),其中f为判将数,所以导致这两种算法都不能在工程上实际落地,本文就一起来看下一个支持拜占庭容错的改进版本的算法PBFT,该算法的消息数量复杂度是O(n ^ 2),这个时间复杂度虽然也比较差,但要比O(n ^ (f + 1))好的多了,可以算得上是瘸子里的将军了。接下来我们就一起看下这位瘸子将军吧!

1:PBFT介绍

PBFT是一个支持拜占庭容错的分布式共识算法,其消息都是加密的不可篡改(这点类似秘钥消息型拜占庭问题之解),假定叛徒数为f,总节点数为n,则二者需要满足3f + 1<=n,因为该系统假定叛徒的人数为(n - 1)/3,若叛徒人数不满足要求,则该算法将不使用,如总结点数为4,则最多允许有4-1/3=1个叛徒,当然没有或更少的叛徒肯定是可以的。另外该算法通过3阶段提交来达成共识,如下:

预准备阶段
准备阶段
提交阶段

语言不是很好描述每个阶段,我们接下来通过一个实际的例子来看下。

2:实例

4节点1叛徒场景。

假定我们有客户端苏秦,leader,follower,follower,follower楚(叛徒),如下图:

在这里插入图片描述

假定苏秦某刻向楚发送进攻消息(即客户端向leader更新数据),如下图:

在这里插入图片描述

接着就进入到三阶段提交的第一阶段预准备阶段,分别向赵魏韩楚发出指令(同步客户端的更新),如下:

在这里插入图片描述

接着进入准备阶段,赵魏韩分别将受到的消息发送给对方,一旦某个节点收到了2f(这里因为f是1,所以就是2)个一致的消息时则进入到提交阶段,本例中叛徒楚因为其也不能伪造消息,所以就选择不发任何消息来扰乱达成共识的过程。如下图:

在这里插入图片描述

接下来进入提交阶段,告知其他节点自己已经准备到提交数据,当收到了2f+1(这里因为f是1,所以就是3)个消息时,则提交消息,如下图:

在这里插入图片描述

提交消息后返回成功给苏秦(leader),代表自己已经提交数据,当苏秦收到了f+1个提交的消息,则说明集群达成共识,如下图:

在这里插入图片描述

以上过程源码模拟参考这里 ,运行结果如下图:

在这里插入图片描述

3:交互次数分析

假定 13 节点集群中(f为4),则交互次数如下:

请求消息:1
预准备阶段:leader给所有的follower发消息,这里个数为13-1=12
准备阶段消息:只有可信节点才会发消息,可信节点数为8(不包括leader),因此发送消息数为8*12=96
提交阶段消息:除叛徒外的所有节点都要发送消息,因此总结点数是9(包括leader),因此发送消息数为9*12=108
回复消息:包括leader在内的所有非叛徒节点,都回复消息给客户端,因此消息数是9

因此总消息数就是226,可以看到消息交互次数还是蛮多的,但是支持拜占庭容错的要求本身就比较麻烦,所以该类算法都是比较耗时间的,有叛徒就是会比较麻烦

写在后面

小结

本文分析了口信型拜占庭问题之解和签名消息型拜占庭问题之解因为消息通信量巨大而无法在工程上落地的问题,进而引入了本文分析的内容PBFT算法,并分析了其三阶段提交,预准备阶段,准备阶段,提交阶段,并给出了具体实例。希望本文能够帮助到你,也欢迎留言我们一起讨论。

参考文章列表

分布式之拜占庭问题 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/371658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS 环境 OpneSIPS 3.1 版本安装及使用

文章目录1. OpenSIPS 源码下载2. 工具准备3. 编译安装4. opensips-cli 工具安装5. 启动 OpenSIPS 实例1. OpenSIPS 源码下载 使用以下命令即可下载 OpenSIPS 的源码&#xff0c;笔者下载的是比较稳定的 3.1 版本&#xff0c;读者有兴趣也可前往 官方传送门 sudo git clone htt…

1个串口用1根线实现多机半双工通信+开机控制电路

功能需求&#xff1a; 主机使用一个串口&#xff0c;与两个从机进行双向通信&#xff0c;主机向从机发送数据&#xff0c;从机能够返回数据&#xff0c;由于结构限制&#xff0c;主机与从机之间只有3根线&#xff08;电源、地、数据线&#xff09;&#xff0c;并且从机上没有设…

【蓝牙mesh】access层(接入层)协议介绍

【蓝牙mesh】access层&#xff08;接入层&#xff09;协议介绍 Access层简介 Access层定义了应用层如何使用upper协议层的接口&#xff0c;它不仅定义了应用层的格式&#xff0c;还定义了应用数据在upper层的加密和解密。当收到下层的数据包时&#xff0c;它会检查数据的netke…

Web前端:选择AngularJS进行Web开发的12大理由!

无论你希望构建本地应用程序、渐进式web应用程序(PWA)&#xff0c;还是开发单页应用程序&#xff0c;每个企业都寻求具有影响力的数字形象&#xff0c;并希望构建交互式、跨平台和动态的web应用程序&#xff0c;以吸引客户。AngularJS&#xff0c;也称为Angular&#xff0c;是一…

李宏毅2023春季机器学习课程

目录2021&2022课程重磅须知我维护的其他项目更新日志课程地址课程资料直链课程作业直链其他优质课程2021&2022课程 CSDN Github 重磅须知 为方便所有网课资料与优质电子书籍的实时更新维护&#xff0c;创建一个在线实时网盘文件夹&#xff1b;   网盘获取方式&#…

C++进阶——继承

C进阶——继承 1.继承的概念及定义 面向对象三大特性&#xff1a;封装、继承、多态。 概念&#xff1a; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特 性的基础上进行扩展&#xff0c;增加功能&#xff0c;这…

MySql数据库环境部署

MySql基础与Sql数据库概述基础环境的建立MYSQL数据库的连接方法MySql的默认数据库数据库端口号数据库概述 数据库&#xff08;DataBase&#xff0c;DB)∶存储在磁带、磁盘、光盘或其他外存介质上、按定结构组织在一起的相关数据的集合。数据库管理系统〈DataBase Management S…

SpringMVC常用注释

1.RequestMapping注释&#xff1a;用来匹配客户端发送的请求&#xff0c;可以在方法上使用&#xff0c;也可以在类上使用。方法&#xff1a;表示用来匹配要处理的请求 类上&#xff1a;表示为当前类的所有方法的请求地址添加一个前置路径&#xff0c;访问的时候必须要添加此路径…

一个.Net Core开源缓存中间件,让你更加简单、方便使用缓存

上次给大家推荐过一个缓存中间件《一个C#开发的非常实用的缓存中间件》&#xff0c;今天再给大家推荐一个缓存中间件&#xff0c;两者功能差不多&#xff0c;都是提供统一接口、多级缓存、分布式缓存、支持多种Provider等。 项目简介 这是一个基于.Net Core开发的缓存中间件&…

Java虚拟机之类加载学习总结

文章目录1 什么是类加载1.1 类加载的应用1.2 类加载过程1.3 类的验证1.4 类初始化顺序2 类加载时机3 类加载器3.1 类加载分类3.2 双亲委派3.3 自定义类加载器3.4 类加载器的命名空间4 打破双亲委派4.1 线程上下文类加载器4.2 自定义类加载器5 类的卸载1 什么是类加载 Java 虚拟…

【工具】JSR-303后端参数校验框架的使用方法及说明

【工具】JSR-303后端参数校验框架的使用方法及说明 文章目录【工具】JSR-303后端参数校验框架的使用方法及说明1. 统一校验需求2. 使用说明2.1 引入依赖2.2 规则说明2.3 使用说明2.4 分组校验2.5 定制校验规则注解1. 统一校验需求 有一句话是这样说的——“前端防君子&#xf…

小知识点:Confluence + mysql 安装流程

流程一、Confluence 配置二、MySQL 配置三、启动一、Confluence 配置 访问下载地址&#xff0c;下载最新安装包 Confluence Server 下载存档 | Atlassian创建环境目录 mkdir -p /xxx/confluence/confluence-home 解压安装包 tar -zxvf atlassian-confluence-7.xx.x.tar.gz -C …

人工智能- windows10环境,配rtx 3060ti显卡,tensorflow-gpu安装

文章目录前言流程方法1.先安装网盘里的anaconda文件&#xff0c;安装后就是python3.8.8环境2.安装vs20193.vs2019安装完毕后开始安装cuda4.安装cudnn5.安装tensorflow-gpu6.测试GPU是否正常识别&#xff0c;tensorflow是否可用前言 最近显卡降价&#xff0c;入手了一块RTX3060…

ROS小车研究笔记:二维SLAM建图简介与源码分析

ROS提供了现成的各类建图算法实现。如果只是应用的话不需要了解详细算法原理&#xff0c;只需要了解其需要的输入输出即可。 1 Gmapping Gmapping使用粒子滤波算法进行建图&#xff0c;在小场景下准确度高&#xff0c;但是在大场地中会导致较大计算量和内存需求 Gmapping需要…

Go语言内存管理详解-学习笔记

1 自动内存管理 1.1 相关概念 Mutator&#xff1a;业务线程&#xff0c;分配新对象&#xff0c;修改对象指向关系Collector&#xff1a;GC线程&#xff0c;找到存活对象&#xff0c;回收死亡对象的内存空间Serial GC&#xff1a;只有一个collector&#xff08;需要暂停&#…

读书笔记//《数据分析之道》

出版时间&#xff1a;2022年 作者曾在互联网大厂做数据分析。从举例可以洞见作者的工作经历。 点评&#xff1a;作者在数据分析领域非常资深&#xff0c;尝试在书中提供一个数据分析工作框架参考。书本内容有点感觉是ppt的集合&#xff0c;辅以案例说明。不过&#xff0c;干货还…

基于ORB-SLAM2+RTAB-MAP+ROS的三维重建设计——环境配置与安装

写下这篇是为了毕设题目《基于深度相机的电缆识别系统》。使用的设备与环境如下&#xff1a;Ubuntu 20.04ROSGazebo仿真运行Kinect 2.0ORB-SLAM2论文地址&#xff1a;https://arxiv.org/abs/1610.06475GitHub&#xff1a;https://github.com/raulmur/ORB_SLAM2一、为什么要选择…

python多线程网络编程

背景 使用过flask框架后&#xff0c;我对request这个全局实例非常感兴趣。它在客户端发起请求后会保存着所有的客户端数据&#xff0c;例如用户上传的表单或者文件等。那么在很多客户端发起请求时&#xff0c;服务器是怎么去区分不同的request对象呢&#xff1f;当查看了大量的…

Android 8请求权限时弹窗BUG

弹窗BUG 应用使用requestPermissions申请权限时&#xff0c;系统会弹出一个选择窗口&#xff0c;可进行允许或拒绝&#xff0c; 此窗口中有一个”不再询问“的选择框&#xff0c; ”拒绝”及“允许”的按钮。 遇到一个Bug,单点击“不再询问”&#xff0c;“允许”这个按钮会变…

OpenAPI SDK组件介绍

背景 公司成立以来&#xff0c;积累了数以万计的可复用接口。上层的SaaS业务&#xff0c;原则上要复用这些接口开发自己的业务&#xff0c;为了屏蔽调用接口的复杂性&#xff0c;基础服务开发了apisdk组件&#xff0c;定义了一套声明OpenAPI的注解、注解解析器&#xff0c;实例…