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

news2024/11/24 14:59:17

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集群也是无法提供服务的。

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

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

相关文章

C脚本实现Wincc弹窗重复调用

文章目录 前言一、步骤及解析二、运行画面演示三、总结 前言 在常见的Wincc上位机画面中,点击按钮或控件弹出弹窗,由于不同的弹窗内容不同,变量前缀不同,通常情况下一个弹窗就需要调用一个画面窗口,但画面窗口过多会导…

Redis经典问题:数据不一致

大家好,我是小米,今天我想和大家聊一聊Redis的一个经典问题——数据不一致。在使用Redis的过程中,你是否曾遇到过这样的问题?缓存和数据库中的数据不一致,可能导致应用程序的功能异常。下面,我将详细介绍数据不一致的原因,以及一些有效的解决方案。 什么是数据不一致 …

【muzzik 分享】Cocos 物理帧同步

# 前言 之前没研究帧同步,这是我前端时间没上班时边玩边搞做的 Demo 研究成果,总共时间一周(实际2-3天),发布的目的也很简单,打破技术垄断,才能诞生更高端的技术成果。而且就算我没发这篇帖子&…

The 2023 ICPC Asia Hefei Regional Contest

目录 B. Queue Sorting 应该还会再补几题 B. Queue Sorting 题解: Dilworth定理: 【偏序关系与偏序集、Hasse图、极大元、极小元、全序关系、最大元、良序集/三小时讲不完离散数学之集合论/考研复试/期末复习考前冲刺/近世代数/抽象代数】https://www.bilibili.c…

【ARM 嵌入式 C 入门及渐进 16.1 -- C 代码实现CRC32校验函数】

请阅读【嵌入式开发学习必备专栏】 文章目录 CRC32校验函数CRC32 表与函数CRC32 测试函数测试结果 对比测试结果 CRC32校验函数 在C语言中,实现CRC32计算的函数需要一个CRC算法的实现。以下是一个使用查表法实现CRC32的简单例子。这种方法通过预先计算好的CRC表来快…

推导 模型矩阵的逆转置矩阵求运动物体的法向量

一个物体表面的法向量如何随着物体的坐标变换而改变,取决于变换的类型。使用逆转置矩阵,可以安全地解决该问题,而无须陷入过度复杂的计算中。 法向量变化规律 平移变换不会改变法向量,因为平移不会改变物体的方向。 旋转变换会改…

Excel办公技巧之下拉菜单

在日常办工中,经常需在单元格中输入特定的值,此时我们可以使用下拉菜单解决,输入错误和错误值,可以一劳永逸的解决固定数据输入问题。 使用Excel下拉菜单时,它在数据输入和验证方面发挥着重要作用通过点击单元格的下拉…

Mp3tag for Mac:音乐标签,轻松管理

还在为杂乱无章的音乐文件而烦恼吗?Mp3tag for Mac,让您的音乐库焕然一新!它支持多种音频格式,批量编辑标签,让音乐管理变得简单高效。同时,自动获取在线数据库的音乐元数据,确保您的音乐库始终…

8种区块链开发者必须知道的顶级编程语言!

我来问你一个问题:请说出一种技术,它以去中心化、不可篡改和透明性等核心特征席卷了全球。 这个问题的答案是,当然是区块链,它在近些年进入大家的视野并颠覆了工商业,没有任何其他技术能够做到这一点。 预计从2020年…

Linux-vi、vim

使用Xshell远程登录到Linux主机进行操作 命令行不用全部掌握, 一般编辑大文件,比较复杂的情况下, 我们还是使用Xftp工具, down下来再恢复回去。

1065: 无向图的连通分量计算

解法&#xff1a; dfs求连通性 1.设节点表vis[] 2.遍历节点表dfs标记&#xff0c;每次得到一个连通分量 #include<iostream> #include<vector> using namespace std; int arr[100][100]; void dfs(vector<bool>& vis, int v) {//不用终止条件&#x…

day10-Set集合

1.Set 那接下来我们来看Collection单列集合体系的第二部分 Set集合。 1.1 Set集合概述和特点 Set集合特点 1.可以去除重复 2.存取顺序不一致 3.没有带索引的方法&#xff0c;所以不能使用普通fori循环遍历&#xff0c;也不能通过索引来获取&#xff0c;删除Set集合里面的元…

WebSocket 详解加入门实操理解加深

WebSocket 介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输。 HTTP协议和WebSocket协议对比&#xff1a; HTTP是短连接…

基于SpringBoot的竹宣非遗宣传网站

摘要 随着互联网的普及和数字化时代的到来&#xff0c;竹编等非物质文化遗产的保护与传承面临新的机遇和挑战。该研究旨在使用SpringBoot后端框架与Vue前端框架&#xff0c;构建一个竹编非遗宣传网站&#xff0c;通过丰富的展示形式和交互体验&#xff0c;提升公众对竹编这一非…

怎么解决端口被占用

目录 一、引言 二、解决方法 一、引言 最近用vscode写网页&#xff0c;老是遇见端口被占用&#xff0c;报错如下&#xff1a; listen tcp :8080: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted. 二、解决方法 1.换…

OpenHarmony 实战开发 - 如何在源码中编译复杂应用(4.0-Release)

文档环境 开发环境&#xff1a;Windows 11 编译环境&#xff1a;Ubuntu 22.04 开发板型号&#xff1a;DAYU 200&#xff08;RK3568&#xff09; 系统版本&#xff1a;OpenHarmony-4.0-Release 功能简介 在 OpenHarmony 系统中预安装应用的 hap 包会随系统编译打包到镜像中&a…

数字水印 | 基于小波变换的数字水印技术

&#x1f34d;原文&#xff1a; 基于小波变换的数字水印技术 &#x1f34d;写在前面&#xff1a; 本文属搬运博客&#xff0c;自己留存学习。 正文 小波变换 把一个信号分解成由基本小波经过移位和缩放后的一系列小波&#xff0c;它是一种 “时间——尺度” 信号的多分辨率分…

# 从浅入深 学习 SpringCloud 微服务架构(十七)--Spring Cloud config(1)

从浅入深 学习 SpringCloud 微服务架构&#xff08;十七&#xff09;–Spring Cloud config&#xff08;1&#xff09; 一、配置中心的 概述 1、配置中心概述 对于传统的单体应用而言&#xff0c;常使用配置文件来管理所有配置&#xff0c;比如 SpringBoot 的 application.y…

面试中算法(金矿)

有一位国王拥有5座金矿&#xff0c;每座金矿的黄金储量不同&#xff0c;需要参与挖掘的工人人数也不同。 例如&#xff0c;有的金矿储量是5ookg黄金&#xff0c;需要5个工人来挖掘;有的金矿储量是2ookg黄金&#xff0c;需要3个工人来挖掘...... 如果参与挖矿的工人的总数是10。…

HTTP 连接详解

概述 世界上几乎所有的 HTTP 通信都是由 TCP/IP 承载的&#xff0c;客户端可以打开一条TCP/IP连接&#xff0c;连接到任何地方的服务器。一旦连接建立&#xff0c;客户端和服务器之间交换的报文就永远不会丢失、受损或失序 TCP&#xff08;Transmission Control Protocol&…