分布式与一致性协议之PBFT算法(二)

PBFT算法

如何替换作恶的主节点

虽然PBFT算法可以防止备份节点作恶,因为这个算法是由主节点和备份节点组成的,但是,如果主节点作恶(比如主机点接收到了客户端的请求,但就是默不作声,不执行三阶段协议),那么无论正常节点数有多少,备份节点肯定无法达成共识,整个集群也将无法正常运行。针对这个问题,我们该如何解决呢?
答案是视图变更,也就是通过领导者选举楚新的主节点,并替换掉作恶的主节点。(其中的"视图"可以理解为领导者任期内不同的视图值对应不同的主节点,比如,视图值为1时,主节点为A;视图值为2时,主节点为B)
需要注意的是,对于领导者模型算法而言,不管是非拜占庭容错算法(比如Raft算法)还是拜占庭容错算法(比如PBFT算法),领导者选举都是它们实现容错能力非常重要的一环。比如,对Raft算法而言,领导者选举实现了领导者节点的容错能力,避免了因领导者节点故障而导致的整个集群不可用的问题。而对PBFT算法而言,视图变更,除了能解决主节点故障导致的集群不可用的问题之外,还能解决主节点是恶意节点的问题。
既然领导者选举这么重要,那么PBFT算法到底是如何实现视图变更的呢?

主节点作恶会出现什么问题

在PBFT算法中,主节点作恶有如下几种情况:

  • 1.主节点接收到客户端请求后不做任何处理,也就是默不作声
  • 2.主节点接收到客户端请求后给不同的预准备请求分配不同的序号
  • 3.主节点只给部分系欸但发送预准备消息
    需要注意的是,不管出现哪种情况,共识都是无法达成的,也就是说,如果恶意节点当选了主节点,此时无论忠诚节点数有多少,忠诚节点们都将无法达成共识。而这种情况肯定是无法接受的,这需要我们设计一个机制,在发现主节点可能作恶时,将作恶的主节点替换掉,并保证最终只有忠诚的节点担任主节点。这样,PBFT算法才能保证当节点数为3f+1(其中f为恶意节点数)时,忠诚的节点们能就客户端提议的指令达成共识,并执行一致的指令。
    那么,在PBFT算法中,视图变更是如何选举出新的主节点并替换掉作恶的主节点呢?

如何替换作恶的主节点

在我看来,视图变更是保证PBFT算法稳定运行的关键。当系统运行异常时,客户端或备份节点出发系统的视图变更,通过"轮流上岗"的方式(公式是(V+1) mod |R|, 其中v为当前视图的值,|R|为节点数)选出下一个视图的主节点,最终选出一个忠诚、稳定运行的新主节点,并保证了共识的达成。为了更好地理解视图变更的原理,继续以苏秦为例展开分析,这次,咱们把叛徒楚当作"大元帅",让它扮演主节点的角色,如图所示。在这里插入图片描述

首先,苏秦联系楚,向楚发送包含作战指令"进攻"的请求,如图所示。在这里插入图片描述

当楚接收到苏秦的请求之后,为了达到破坏作战计划的目的,它选择默不作声,心想:我就是不执行三阶段协议,不执行你的指令,也不通知其他将军执行你的指令,你能把我怎么办?
结果,苏秦始终没有接收到两个相同的响应消息。待过了约定的事件后,苏秦会认为也许各位将军们出了什么问题。这时苏秦会直接给各位将军发送作战指令,如图所示。在这里插入图片描述

当赵、魏、韩接收到来自苏秦的作战指令时,它们会将作战指令分别发送给楚,并等待一段时间,如果在这段事件内它们仍未接收到来自楚地预准备消息,那么它们就认为楚可能已经叛变了,并发起视图变更(采用"轮流上岗"的方式选出新的大元帅,比如赵),向集群所有节点发送视图变更消息,如图所示。在这里插入图片描述

当赵接收到两个视图变更消息后,它就会发送新视图消息给其他将军,告诉大家,我是大元帅了,如图所示。在这里插入图片描述

其他将军在接收到新视图消息后,就认为选出了新的大元帅。然后,忠诚的将军们就可以一致地执行来自苏秦的作战指令了。
你看,叛变的大元帅就这样被发现和替换掉了,而最终大元帅一定是忠诚的。
回到计算机的世界中,我们应该如何理解呢?其实现原理与签名一样,这里不再赘述。不过为了更全面地理解视图变更,补充几点。
首先,当一个备份节点在定时器超时出发了视图变更后,它将暂时停止接收和处理除了检查点(CHECKPOINT)、视图变更、新视图之外的消息。你可以这样理解,这个节点认为现在集群处于异常状态,所以不能再处理客户端请求相关的消息。
其次,除了演示中触发备份节点进行视图变更的情况,下面几种情况也会触发视图变更,列举如下:

  • 1.备份节点发送了准备消息后,在约定的时间内未接收到来自其他节点的2f个相同的准备消息
  • 2.备份节点发送了提交消息后,在约定的时间内危机收到来自其他节点的2f个相同的提交消息
  • 3.备份节点接收到异常消息,比如视图值、序号和已接收的消息相同,但内容摘要不同。
    也就是说,视图变更除了能解决主节点故障和作恶的问题,还能避免备份节点长时间阻塞等待客户端请求被执行的情况。
    最后需要大家注意的是,Raft算法的而领导者选举和日志提交都是由集群的节点来完成的。但在PBFT算法中,客户端参与了拜占庭容错的实现,比如,客户端实现定时器,等待接收来自备份节点的响应,如果等待超时,则发送请求给所有节点

注意

相比Raft算法完全不适应有人作恶的场景,PBFT算法能容忍(n-1)/3个恶意节点(也可以是故障节点)。另外,相比Pow算法,PBFT算法的有点是不消耗算力,所以在日常实践中,PBFT算法比较适用于相对"可信"的场景,比如联盟链

PBFT算法的局限、解决办法和应用

如同一枚硬币具有正反两面,任何一个算法也会有优缺点,PBFT算法也不例外。接下来,将介绍PBFT算法的局限、解决办法,以及实际应用情况。
首先,在一般情况下,每个节点都需要持久化保存状态数据(比如准备消息),以便后续使用,但随着系统运行,数据会越来越多,最终肯定会出现存储空间不足的情况,那么,怎么解决这个问题?
答案是检查点机制,PBFT算法实现了检查点机制,来定时清理节点缓存在本地但已经不再需要的历史数据(比如预准备消息、准备消息和提交消息),节省了本地的存储空间,且不会影响系统的运行。
其次,我们都知道基于数字签名的加解密非常消耗性能,这也是为什么在一些对加解密要求高的场景中,大家常直接在硬件中实现加解密,比如IPSEC VPN。如果在PBFT算法中,所有消息都是签名消息,那么肯定非常消耗性能,且会极大地制约PBFT算法的落地场景,那么有什么办法优化这个问题吗?
答案是将数字签名和消息验证码(MAC)混合使用。具体来说,在PBFT算法中,只有视图变更消息和新视图消息采用签名消息,其他消息则采用消息验证码,这样一来,就可以节省大量加解密的性能开销。
最后,PBFT算法是一个能在实际场景中落地的拜占庭容错算法,它和区块链也结合紧密,具体有以下几个应用:

  • 1.相对可信、有许可限制的联盟链,比如Hyperledger Sawtooth
  • 2.与其他拜占庭容错算法结合来落地公有链,比如Zilliqa,将Pow算法和PBFT算法结合起来,实现公有链的共识协商。具体来说,PoW算法用于认证,证明节点不是"坏人",PBFT算法用于实现共识。针对PBFT算法消息数过多、不适应大型分布式系统的痛点,Zilliqa实现了分片(Sharding)技术。
    另外,也有团队因为PBFT算法消息数过多、不适应大型分布式系统的痛点,放弃使用PBFT算法,而是通过法律来约束"节点作恶"的行为,比如IBM的Hyperledger Fabric。技术是发展的,适合的才是最好的。在实际工作中,建议根据场景的可信度来决定是否采用PBFT算法,是否改进和优化PBFT算法。

重点总结

  • 1.PBFT算法是通过签名(或消息认证码MAC)来约束恶意节点的行为,同时采用三阶段协议,基于大多数原则达成共识的。另外,与口信消息型拜占庭问题之解(以及签名消息型拜占庭问题之解)不同的是,PBFT算法实现的是一系列值得共识,而不是单值的共识。
  • 2.客户端通过等待f+1个相同响应消息超时来发现主节点可能在作恶,此时客户端会发送客户端请求给所有集群节点,从而触发可能的视图变更。与Raft算法在领导者期间服务不可用类似,在视图变更时,PBFT集群也是无法提供服务的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二叉搜索数使用,底层原理及代码实现

1:二叉搜索树的定义 二叉搜索树的底层是一个二叉链表 二叉搜索树又称二叉排序树,它或者是一棵空树 ,或者是具有以下性质的二叉树 : 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所…

js逆向-某投资平台参数分析

声明 本文仅供学习参考,如有侵权可私信本人删除,请勿用于其他途径,违者后果自负! 如果觉得文章对你有所帮助,可以给博主点击关注和收藏哦! 分析 aHR0cDovLzIyMS4yMTQuOTQuNTE6ODA4MS9pY2l0eS9pcHJvL2hhb…

4.5网安学习第四阶段第五周回顾(个人学习记录使用)

本周重点 ①部署域环境(Win2008) ②域组策略 ③域内信息收集 ④(重点)哈希传递攻击PTH ⑤MS14-068 提权漏洞 ⑥黄金票据伪造 ⑦白银票据伪造 ⑧ZeroLogon (CVE-2020-1472) 漏洞复现 本周主要内容 ①部署域环境(Win2008)…

.net core WebApi 部署 IIS

安装 IIS 下载需要的 net 版本安装 前往 .net core WebApi 项目打包 Program.cs var builder WebApplication.CreateBuilder(args);// 输出 builder.Services.AddControllers().AddJsonOptions(options > {options.JsonSerializerOptions.PropertyNamingPolicy null;…

.NET_NLog

步骤 1. 添加依赖 ①Microsoft.Extensions.DependencyInjection ②NLog.Extensions.Logging(或Microsoft.Extensions.Logging.___) Tutorial NLog/NLog Wiki GitHub 2.添加nlog.config文件(默认名称, 可改为其他名称, 但需要另行配置) 文件的基础…

第13节 第二种shellcode编写实战(2)

在第二种shellcode编写实战(1)的基础上,新增加一个CAPI类,将所有用到的函数都在这个类中做动态调用的处理,这样使得整个shellcode功能结构更加清晰。 1. 新建类CAPI(即api.h和api.cpp两个文件): api.h&…

绍兴ISO27001认证:信息安全认证的金钥匙

🌈🌈绍兴ISO27001认证:✌️信息安全认证的金钥匙🔑 💘随着信息技术的飞速发展,💁信息安全问题日益凸显。🔐为了提升信息安全管理水平,👮保障企业数据资产安全…

PROTEUS仿真软件的使用及存储器的设计

proteus proteus,即EDA工具软件。Proteus软件是英国Lab Center Electronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是比较好的仿真单片机及外围器件的工具。虽然国内推广刚起步,但已受到…

SpringBoot基于微信小程序的星座配对(源码)

博主介绍:✌程序员徐师兄、10年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅&#x1f447…

数列排序C++

题目&#xff1a; 思路&#xff1a; 创建一个数组a&#xff0c;循环遍历输入&#xff0c;然后使用函数sort进行上升排序&#xff0c;最后循环遍历输出a[i]. #include <bits/stdc.h> using namespace std; int main(){int a[201];int n;cin>>n;//输入for(int i0;i&l…

数据链路层——计算机网络学习笔记三

使用点对点信道的数据链路层 前言&#xff1a; 1.数据链路层的重要性&#xff1a;网络中的主机、路由器都必须实现数据连输层&#xff1b; 2.数据链路层中使用的信道&#xff1a; 点对点信道&#xff1a;这种信道是一对一的通信方式&#xff1b; 广播信道&#xff1a;使用一对多…

VMware虚拟机故障:“显示指定的文件不是虚拟磁盘“,处理办法

一、故障现象 由于虚拟机宕机&#xff0c;强制重新启动虚拟机后显示错误&#xff0c;没有办法启动虚拟机。 虚拟机有快照&#xff0c;执行快照还原&#xff0c;结果也不行&#xff0c;反复操作&#xff0c;在虚拟机文件目录出现很多莫名文件 二、故障原因 根据故障提示&#…

StarRocks 【新一代MPP数据库】

1、StarRocks 1.1、StarRocks 简介 StarRocks 是新一代极速全场景 MPP (Massively Parallel Processing&#xff0c;MPP数据库是一种基于大规模并行处理技术的数据库系统&#xff0c;旨在高效处理大量数据。) 数据库。StarRocks 的愿景是能够让用户的数据分析变得更加简单和敏…

【Cesium】Cesium核心类、坐标系与着色器简介

核心类&#xff1a; Viewer: Viewer 是 Cesium 中最基本的视图容器&#xff0c;用于显示地球、地图、三维场景等。它提供了创建和管理场景的功能&#xff0c;可以配置视图的各种属性和行为。 Scene: Scene 是 Cesium 中的核心类之一&#xff0c;代表了一个三维场景&#xff0c…

py黑帽子学习笔记_环境准备

1 下载os装os 下载一个kali虚机镜像然后用虚机管理软件创虚机&#xff0c;装完如下图&#xff0c;我用的版本是2024.1的版本kali-linux-2024.1-installer-amd64&#xff0c;可以从镜像站下载&#xff0c;官网下的慢还断网Index of /kali-images/kali-2024.1/ | 清华大学开源软…

序列到序列模型在语言识别Speech Applications中的应用 Transformer应用于TTS Transformer应用于ASR 端到端RNN

序列到序列模型在语言识别Speech Applications中的应用 A Comparative Study on Transformer vs RNN in Speech Applications 序列到序列(Seq2Seq)模型在语音识别(Speech Applications)中有重要的应用。虽然Seq2Seq模型最初是为了解决自然语言处理中的序列生成问题而设计的…

力扣例题(用栈实现队列)

目录 链接. - 力扣&#xff08;LeetCode&#xff09; 描述 思路 push pop peek empty 代码 链接. - 力扣&#xff08;LeetCode&#xff09; 描述 思路 push 例如我们将10个元素放入栈中&#xff0c;假设最左边为栈顶&#xff0c;最右侧为栈底 则为10,9,8,7,6,5,4,3,…

windows使用Docker-Desktop部署lobe-chat

文章目录 window安装docker-desktop下载和启动lobe-chatAI大语言模型的选择lobe-chat设置大模型连接 window安装docker-desktop docker-desktop下载地址 正常安装应用&#xff0c;然后启动应用&#xff0c;注意启动docker引擎 打开右上角的设置&#xff0c;进入Docker Engine设…

ZFS 文件系统结构及 ZFS 文件系统数据恢复

ZFS是一种革命性的文件系统&#xff0c;它遵循完全不同的文件系统管理方法&#xff0c;同时提供目前其他文件系统无法提供的新功能和优势。ZFS 可靠、可扩展且易于管理。 它放弃了卷的概念&#xff0c;从而摆脱了传统的文件系统原则。另外&#xff0c;ZFS 提供更复杂的存储池&…

torch_geometric安装(CPU版本)

①打开官方安装网址&#xff1a;https://pytorch-geometric.readthedocs.io/en/2.3.0/install/installation.html ②对根据Pytorch选择相应版本。此前一直用CUDA不成功&#xff0c;这次使用CPU版本&#xff08;因为不用对应cuda&#xff0c;pytorchcudageometric三者对应起来很…