分布式存储架构 与分布式一致性协议
分布式存储架构可以分为无中心节点架构和有中心节点架构。它们的设计在系统中的角色分配、数据管理、协调方式等方面有所不同。
1. 无中心节点架构(Decentralized/Peer-to-Peer Architecture)
在无中心节点的分布式存储架构中,所有节点都是平等的,没有单一的控制节点或协调器。这种架构下的系统没有中心化的控制,所有节点共同协作完成数据存储、查询和更新等操作。
特点:
- 对等(P2P)关系:每个节点既可以存储数据,也可以提供服务,通常没有一个负责管理整个系统的中心节点。
- 高可扩展性:由于没有中心节点,系统可以通过增加更多节点来扩展存储能力和计算能力。
- 容错性好:单个节点故障对整体系统的影响较小,数据可以被复制到多个节点以确保高可用性。
- 去中心化协调:节点通过分布式算法进行协调(如DHT,分布式哈希表)和一致性协议(如Raft、Paxos)来管理数据。
优点:
- 无单点故障,系统更具弹性和容错能力。
- 支持大规模扩展。
缺点:
- 系统协调复杂,需要处理一致性、负载均衡等问题。
- 由于没有中心协调,可能会导致一定的延迟。
代表技术:
- BitTorrent等P2P协议
- IPFS(InterPlanetary File System)
- Ceph(当以完全对等模式运行时)
2. 有中心节点架构(Centralized/Distributed Master-Slave Architecture)
有中心节点架构中,通常存在一个或多个中心节点(Master/Coordinator)来负责协调和管理整个系统的操作。其他节点则作为从节点(Slave),负责存储数据或执行具体的任务。
特点:
- 主从结构:中心节点负责全局管理,比如元数据管理、节点状态监控、任务分发等。普通节点负责数据存储和处理。
- 集中控制:中心节点承担了更多的协调和决策任务,因此系统管理较为集中。
- 一致性控制:中心节点可以方便地控制数据的一致性和分布,从而简化一致性协议的设计。
优点:
- 易于管理:由于有中心节点,数据的管理和调度相对简单。
- 数据一致性更容易维护:中心节点可以集中处理一致性问题,降低了节点间的复杂协调。
- 性能优化:中心节点可以调度资源,优化性能。
缺点:
- 单点故障风险:如果中心节点出现故障,系统的协调和管理能力会受影响,甚至会导致系统不可用。
- 扩展性受限:中心节点需要处理较大的元数据或协调请求,可能会成为扩展瓶颈。
代表技术:
- Hadoop HDFS(NameNode作为中心节点)
- GFS(Google File System,使用Master节点管理文件系统元数据)
- Ceph(在运行有中心节点的模式下,使用Monitor和Manager角色)
总结:
- 无中心节点架构:去中心化,所有节点平等,适合大规模扩展和分布式存储,但协调更复杂。
- 有中心节点架构:中心化协调,管理方便,但存在单点故障和扩展性问题。
一致性协议是在分布式系统中确保多个节点之间对共享数据达成一致的机制。它们在分布式存储、数据库、区块链等系统中尤为重要,尤其是在节点可能出现故障或网络分区的情况下。
下面介绍几种常见的分布式一致性协议:
1. Paxos协议
Paxos 是一种经典的分布式一致性算法,由 Leslie Lamport 提出。Paxos 协议专注于在多个节点之间达成共识,确保即使一些节点出现故障,系统依然可以正常运行。
Paxos的核心思想:
- 提议者(Proposer):提出提议,希望在系统中就某个值达成一致。
- 接受者(Acceptor):接受提议并投票给提议的值。只有当大多数接受者同意某个提议时,该提议才会被确认。
- 学习者(Learner):学习最终被接受的值。
Paxos协议的设计相对复杂,但它可以处理大多数网络分区和节点故障问题。
Paxos的优点:
- 强一致性:保证在网络或节点失效的情况下,最终只有一个值被选定。
- 容错性强:即使少数节点失败,系统仍能正常工作。
Paxos的缺点:
- 实现复杂,开发和维护成本较高。
- 在实际大规模生产环境中,效率可能不如某些改进版协议高。
2. Raft协议
Raft 是一种比 Paxos 更易理解和实现的分布式一致性协议。Raft 的设计目的是为开发者提供一种简单、高效的共识算法,同时保留类似 Paxos 的强一致性保证。
Raft的核心角色:
- Leader(领导者):负责处理客户端请求并广播到其他节点。
- Follower(追随者):仅接受领导者的命令。
- Candidate(候选者):在选举过程中尝试成为新的领导者。
Raft 协议通过选举机制来选择领导者,并通过日志复制的方式保证各个节点状态的一致。
Raft的优点:
- 易于理解和实现,代码相对简单。
- 有效解决了分布式系统中的选主问题。
- 性能和可扩展性相对较好。
Raft的缺点:
- 与 Paxos一样,由于强一致性要求,可能会有较高的延迟。
- 领导者选举可能导致短暂的系统不可用。
3. Zab协议
Zab(Zookeeper Atomic Broadcast)协议是一种专门为 Zookeeper 分布式协调服务设计的原子广播协议,旨在为分布式系统提供高可靠性、高一致性的操作。
Zab协议的特点:
- 主备模式:Zab协议的核心机制类似于 Raft,其中也有 Leader 节点负责协调其他节点。
- 数据一致性:通过原子广播机制,Zab保证在 Leader 故障后,新的 Leader 会继续未完成的广播,从而确保数据一致性。
Zab协议广泛用于需要高可靠性和分布式协调的系统中,比如 Zookeeper 的核心一致性机制。
4. 两阶段提交(2PC,Two-Phase Commit)
两阶段提交是一种较为简单的分布式事务协议,用于协调多个节点在分布式事务中达成一致。
两阶段提交的流程:
- 准备阶段(Prepare Phase):协调者向所有参与节点发送准备请求,询问它们是否可以提交。
- 提交阶段(Commit Phase):如果所有节点都同意提交,则协调者发送提交请求;如果任何一个节点拒绝,则发出回滚请求。
两阶段提交的优点:
- 实现简单,适合简单的分布式事务场景。
- 一致性较好。
两阶段提交的缺点:
- 阻塞问题:如果协调者在提交阶段崩溃,系统会陷入阻塞状态,直到协调者恢复。
- 不支持容错:如果某个参与者在提交过程中崩溃,系统可能无法继续进行事务。
5. 三阶段提交(3PC,Three-Phase Commit)
三阶段提交是对两阶段提交的改进,增加了一个“预提交”阶段,以进一步减少阻塞问题。
三阶段提交的流程:
- CanCommit阶段:协调者询问各节点是否可以执行事务。
- PreCommit阶段:如果所有节点都同意,协调者发送预提交命令。
- DoCommit阶段:协调者发送最终提交命令。
三阶段提交的优点:
- 相较于两阶段提交,增加了预提交阶段,减少了系统因协调者故障导致的阻塞问题。
三阶段提交的缺点:
- 仍然存在一定的复杂性,且在网络分区的情况下可能无法解决一致性问题。
一致性协议的选择
-
强一致性协议(如 Paxos、Raft):适用于对一致性要求极高的系统,如分布式数据库、协调服务(如 Zookeeper、etcd)。这些协议确保在故障情况下不会出现分歧,但代价是性能可能受限。
-
两阶段提交、三阶段提交:适用于分布式事务的场景,如分布式数据库的事务提交,虽然简单,但阻塞问题仍然是其主要挑战。
-
Zab协议:适用于需要高可用性和协调功能的系统,如 Zookeeper。
总结:
- Paxos 和 Raft 是分布式系统中常见的强一致性协议,Raft相对更易理解和实现。
- 2PC 和 3PC 适用于分布式事务场景,但需要权衡一致性和性能。
- Zab 用于高度可用的协调服务,保证系统的全局一致性。
你是否想深入了解某个特定的一致性协议,或者需要对其应用场景做进一步讨论呢?
拜占庭问题(Byzantine Generals Problem)是分布式系统中的一个经典问题,它描述了在不可靠或恶意节点存在的情况下,如何让系统中的各个节点达成一致性。这一问题引申出了拜占庭容错(Byzantine Fault Tolerance, BFT)的概念,用来解决系统在恶意节点存在时仍然能够保证一致性和正确性的挑战。
拜占庭将军问题的描述
拜占庭问题最早由计算机科学家 Leslie Lamport 在 1982 年提出。问题的核心情景是:一群拜占庭将军围攻一座城市,他们需要共同决定是进攻还是撤退,所有将军必须达成一致。如果有部分将军选择进攻,另一些将军选择撤退,那么他们的进攻将失败,且可能全军覆没。然而,通信并不可靠,某些将军可能会背叛,发送虚假的信息,企图破坏整体决策。
问题的挑战
- 恶意节点:在分布式系统中,某些节点可能因为软件故障、网络问题,甚至是恶意攻击而表现不正常(例如发送错误信息),这些节点可能会通过错误或恶意的决策来破坏系统的一致性。
- 达成一致:在这种不可靠的通信环境中,如何确保所有忠诚的将军(节点)能够就同一个行动(决定)达成一致,是拜占庭问题的核心挑战。
拜占庭容错(BFT)算法
为了解决拜占庭问题,设计了一些拜占庭容错算法,用于在不超过三分之一的节点表现异常(包括恶意节点)的情况下,确保系统的可靠性和一致性。以下是几种主要的拜占庭容错算法:
1. PBFT(Practical Byzantine Fault Tolerance)
PBFT 是最广为人知的拜占庭容错算法之一,由 Miguel Castro 和 Barbara Liskov 于1999年提出。PBFT 是为实用性设计的,在满足条件下,系统可以容忍至多 fff 个拜占庭故障节点,但需要总节点数量至少为 3f+13f + 13f+1,即至少有 2f+12f + 12f+1 个忠诚节点才能达成一致。
PBFT的工作原理:
PBFT 的过程通常分为三个阶段:
- 预准备阶段(Pre-prepare):主节点(Leader)向其他副本节点发送请求,开始进行共识。
- 准备阶段(Prepare):副本节点接收请求后,向其他副本节点广播“准备”信息。
- 提交阶段(Commit):如果一个节点收到来自足够多(2f+12f + 12f+1)节点的准备信息,它会进入提交阶段,执行请求。
优点:
- 能够在不超过三分之一节点是恶意节点的情况下,提供容错。
- 相比早期的拜占庭容错算法,PBFT 的效率更高,适合实际应用。
缺点:
- 随着节点数量增加,通信开销呈指数增长,这使得 PBFT 在大规模系统中不太高效。
- 需要信任某个初始的领导节点(在某些情况下可能成为单点故障)。
2. Tendermint
Tendermint 是一种基于拜占庭容错的共识算法,广泛应用于区块链技术。它是一种结合了拜占庭容错和 PoS(Proof of Stake,权益证明)机制的协议,特别适用于分布式账本系统。
工作原理:
Tendermint 使用投票机制来选择共识中的领导者,确保分布式系统在有限的时间内能完成交易验证。它基于 PBFT,但对其进行了优化,减少了通信开销。
优点:
- 提高了效率,降低了延迟,适合区块链系统的高并发要求。
- 可以容忍 f=(N−1)/3f = (N-1)/3f=(N−1)/3 的拜占庭节点。
3. HoneyBadgerBFT
HoneyBadgerBFT 是一种专为异步网络环境设计的拜占庭容错算法。异步环境下,消息传递的时间是不确定的(无法保证消息在有限时间内送达),这在传统拜占庭容错算法中是一个难点。
特点:
- 能够在异步网络中运行,不依赖于定时器或网络的同步假设。
- 采用随机化技术来提高系统的公平性和安全性。
优点:
- 在异步网络环境中保持高安全性和容错能力。
- 尤其适合不确定性高的环境,比如分布式金融系统。
4. Algorand
Algorand 是一种创新的拜占庭共识算法,特别用于区块链中。它通过随机选择一小部分节点来进行共识决策,从而大大减少了通信开销。
工作原理:
- 在每一轮共识中,Algorand 通过加密的抽签随机选择一小部分节点,负责达成一致决策,而不是所有节点都参与投票。
- 这种方法有效地解决了拜占庭容错系统中的通信瓶颈问题。
优点:
- 极大减少了通信复杂度,使其适合大规模区块链网络。
- 提供了高效的容错机制,能够在不依赖于中心节点的情况下达成共识。
拜占庭容错应用场景
-
区块链:拜占庭容错算法是区块链系统中共识算法的基础。例如,PBFT 被应用于Hyperledger Fabric,Tendermint 应用于Cosmos区块链。
-
分布式数据库:在需要高可用性和一致性的分布式数据库中,BFT 算法可以用于处理数据复制和一致性维护。
-
分布式金融系统:金融系统对于安全性和一致性要求极高,尤其是在异步网络环境下,HoneyBadgerBFT 等算法有助于维护系统的稳定性和安全性。
总结
- 拜占庭问题 解决了分布式系统中存在恶意节点时的一致性挑战。
- 拜占庭容错(BFT)算法,如 PBFT、Raft(部分实现)、Tendermint 和 HoneyBadgerBFT,在处理节点故障和恶意攻击时,能够保证系统的一致性和安全性。
- 这些协议广泛应用于 区块链、分布式数据库 和 金融系统 等对容错和一致性要求极高的场景。
相关文章:

分布式存储架构 与分布式一致性协议
分布式存储架构可以分为无中心节点架构和有中心节点架构。它们的设计在系统中的角色分配、数据管理、协调方式等方面有所不同。 1. 无中心节点架构(Decentralized/Peer-to-Peer Architecture) 在无中心节点的分布式存储架构中,所有节点都是…...

Unity Apple Vision Pro 保姆级开发教程 - Simulator 模拟器使用
教程视频 Apple VisionPro Simulator 模拟器使用教程 VsionOS Simulator 简介 visionOS Simulator 是一个用于开发和测试 visionOS 应用程序的工具。它模拟 Apple Vision Pro 的运行环境,帮助开发者在没有硬件设备的情况下创建、调试和优化他们的应用程序。VisionO…...

Vue 之 插件与组件的区别
在 Vue.js 中,插件(Plugin)和组件(Component)都是用来扩展 Vue 功能的重要工具,但它们的应用场景和使用方式有所不同。本文将通过对比的方式,帮助开发者更好地理解两者的区别,并通过…...

了解 ChatGPT 中的公平性问题
了解 ChatGPT 中的公平性问题 最近,OpenAI 又发布了一篇新的博客。他们谈论了一个有趣又重要的话题——用户的身份如何影响 ChatGPT 的回答。 这项研究揭示了一个鲜明的事实,那就是 AI 可能会无意间对人类产生刻板印象。很可能这些刻板印象源自 AI 训练过程中使用的数据,而这…...

【PHP】安装swoole时报错:No package ‘libbrotlienc‘ found
一、环境 Debian 11(bullseye) PHP 8.2.14 Swoole 5.1.4 二、过程 今天在安装Swoole 5.1.4的时候报错,错误信息如下: configure: error: Package requirements (libbrotlienc) were not met:No package libbrotlienc foundConsider adjusting the PK…...

postgresql执行计划解读案例
简介 SQL优化中读懂执行计划尤其重要,以下举例说明在执行计划中常见的参数其所代表的含义。 创建测试数据 -- 创建测试表 drop table if exists customers ; drop table if exists orders ; drop table if exists order_items ; drop table if exists products ;…...

Matlab实现粒子群优化算法优化随机森林算法模型 (PSO-RF)(附源码)
目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 粒子群优化算法(PSO)是一种启发式搜索方法,灵感来源于鸟类群体觅食的行为。在PSO中,每个解都是搜索空间中的一个“粒子”,这些粒子以一定的速度飞行&am…...

使用 EasyExcel 相邻数据相同时行和列的合并,包括动态表头、数据
前言 在处理 Excel 文件时,经常会遇到需要对表格中的某些单元格进行合并的情况,例如合并相同的行或列。Apache POI 是一个强大的工具,但它使用起来相对复杂。相比之下,EasyExcel 是一个基于 Apache POI 的轻量级 Excel 处理库&am…...

985研一学习日记 - 2024.10.16
一个人内耗,说明他活在过去;一个人焦虑,说明他活在未来。只有当一个人平静时,他才活在现在。 日常 1、起床6:00√ 2、健身1个多小时 今天练了二头和背部,明天练胸和三头 3、LeetCode刷了3题 旋转图像:…...

安装mysql 5.5.62
1>先检查是否存在其他版本mysql rpm -qa|grep -i mariadb 存在则卸载 yum -y remove maria* 2>下载mysql 5.5.62 wget https://cdn.mysql.com/archives/mysql-5.5/mysql-5.5.62-linux-glibc2.12-x86_64.tar.gz 3>确认系统是否安装libaio库 yum -y install libai…...

AnaTraf | 网络性能监控系统的价值
目录 1. IT运维工程师 2. 网络管理员 3. 安全团队(网络安全工程师) 4. 业务部门(应用开发人员、产品经理) 5. 管理层与决策者(CTO/CIO、IT经理) 6. 最终用户(普通员工) 总结&…...

决策树和集成学习的概念以及部分推导
一、决策树 1、概述 决策树是一种树形结构,树中每个内部节点表示一个特征上的判断,每个分支代表一个判断结果的输出,每个叶子节点代表一种分类结果 决策树的建立过程: 特征选择:选择有较强分类能力的特征决策树生成…...

servlet基础与环境搭建(idea版)
文章目录 环境变量配置安包装环境变量配置JDK 配置 静态网页动态网页(idea)给模块添加 web框架新版本 2023 之后的 idea,使用方法二idea 目录介绍建立前端代码启动配置 环境变量配置 tomcat 环境变量 安包装 环境变量配置 JDK 配置 静态网页…...

【10月最新】植物大战僵尸杂交版新僵尸预告(附最新版本下载链接)
【BOSS僵尸】埃德加二世 【新BOSS僵尸】埃德加二世 “埃德加博士的克隆体。驾驶着最新一代小型化机甲,致力于为戴夫博士扫清障碍。” -体型(模型大小)小于原版僵王的头 -血量120000(原版僵王复仇的2倍),免疫…...

网络编程-UDP以及数据库mysql
UDP通信流程 服务端客户端有一个邮箱socket()有一个邮箱socket()绑定地址bind()发送数据sendto接收数据recvfrom关闭close()关闭colse() //服务端 #include "head.h" // ./server 10001 int main(int argc,char *argv[]) {// 1、创建socket套接字// 参数1ÿ…...

ubuntu 20.04 安装ros1
步骤 1:设置系统 首先,确保系统环境是最新的: sudo apt update sudo apt upgrade 步骤 2:设置源和密钥 添加 ROS 软件源: 首先,确保 curl 和 gnupg 已安装: sudo apt install curl gnupg2…...

ShardingSphere-Proxy 数据库中间件MySql分库分表环境搭建
一. ShardingSphere-Proxy简介 1、简介 Apache ShardingSphere 是一款开源分布式数据库生态项目,旨在碎片化的异构数据库上层构建生态,在最大限度的复用数据库原生存算能力的前提下,进一步提供面向全局的扩展和叠加计算能力。其核心采用可插…...

Pytest+selenium UI自动化测试实战实例
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 今天来说说pytest吧,经过几周的时间学习,有收获也有疑惑,总之最后还是搞个小项目出来证明自己的努力不没有白费 环境准备 1 …...

服务器技术研究分析:存储从HBM到CXL
服务器变革:存储从HBM到CXL 在《从云到端,AI产业的新范式(2024)》中揭示,传统服务器价格低至1万美金,而配备8张H100算力卡的DGX H100AI服务器价值高达40万美金(约300万人民币)。 从供…...

下载并安装 WordPress 中文版
下载并安装 WordPress 中文版 1. 安装 LAMP 环境(Linux, Apache, MySQL, PHP)1. 安装 Apache2. 安装 MySQL3. 安装 PHP1. 下载并安装 WordPress 中文版1. 下载 WordPress2. 配置文件权限3 . 创建 MySQL 数据库4 . 配置 WordPress1. 安装 LAMP 环境(Linux, Apache, MySQL, PH…...

从零开始的LeetCode刷题日记:515.在每个树行中找最大值
一.相关链接 题目链接:515.在每个树行中找最大值 二.心得体会 这道题也是层序遍历,只需要记录每一层的最大值即可,反复比较记录最大值。 三.代码 class Solution { public:vector<int> largestValues(TreeNode* root) {vector<…...

C语言 | Leetcode C语言题解之第492题构造矩形
题目: 题解: class Solution { public:vector<int> constructRectangle(int area) {int w sqrt(1.0 * area);while (area % w) {--w;}return {area / w, w};} };...

在FastAPI网站学python:虚拟环境创建和使用
Python虚拟环境(virtual environment)是一个非常重要的工具,它允许开发者为每个项目创建独立的Python环境,隔离您为每个项目安装的软件包,从而避免不同项目之间的依赖冲突。 学习参考FastAPI官网文档:Virt…...

安全风险评估(Security Risk Assessment, SRA)
安全风险评估(Security Risk Assessment, SRA)是识别、分析和评价信息安全风险的过程。它帮助组织了解其信息资产面临的潜在威胁,以及这些威胁可能带来的影响。通过风险评估,组织可以制定有效的风险管理策略,以减少或控…...

SQL Injection | SQL 注入 —— 布尔盲注
关注这个漏洞的其他相关笔记:SQL 注入漏洞 - 学习手册-CSDN博客 0x01:布尔盲注 —— 理论篇 布尔盲注(Boolean-Based Blind Injection)是一种常见的 SQL 注入技术,它适用于那些 SQL 注入时,查询结果不会直…...

stm32 bootloader写法
bootloader写法: 假设app的起始地址:0x08020000,则bootloader的范围是0x0800,0000~0x0801,FFFF。 #define APP_ADDR 0x08020000 // 应用程序首地址定义 typedef void (*APP_FUNC)(void); // 函数指针类型定义 /*main函数中调用rum_app&#x…...

Unity3D 物体表面水滴效果详解
在游戏开发中,逼真的水滴效果能够显著提升游戏场景的真实感和沉浸感。Unity3D作为一款强大的游戏开发引擎,提供了丰富的工具和技术来实现这种效果。本文将详细介绍如何在Unity3D中实现物体表面的水滴效果,包括技术详解和代码实现。 对惹&…...

若依框架中spring security的完整认证流程,及其如何使用自定义用户表进行登录认证,学会轻松实现二开,嘎嘎赚块乾
1)熟悉之前的SysUser登录流程 过滤器链验证配置 这里security过滤器链增加了前置过滤器链jwtFilter 该过滤器为我们自定义的,每次请求都会经过jwt验证 ok我们按ctrl alt B跳转过去来看下 首先会获取登录用户LoginUser 内部通过header键,获…...

selenium:操作滚动条的方法(8)
selenium支持几种操作滚动条的方法,主要介绍如下: 使用ActionChains 类模拟鼠标滚轮操作 使用函数ActionChains.send_keys发送按键Keys.PAGE_DOWN往下滑动页面,发送按键Keys.PAGE_UP往上滑动页面。 from selenium import webdriver from se…...

Discuz | 起尔开发 传奇开服表游戏公益服发布论坛网站插件
Discuz | 起尔开发 传奇开服表游戏公益服发布论坛网站插件 插件下载:源码 - 起尔开发的插件下载 演示地址:discuz.72jz.com 标黄和非标黄自动分开 在标黄时间内显示在上面置顶,标黄过期后自动显示在下面白色区域。 后台可以设置非标黄默认…...