分布式一致性协议的深度解析:Paxos与Raft
分布式系统的复杂性源于节点失效、网络分区、消息丢失等诸多不确定性。在这种背景下,分布式一致性问题应运而生,成为解决这些问题的核心。本文将从理论到实践,深入探讨两种经典的一致性协议:Paxos与Raft。文章适合有一定分布式系统开发经验的工程师,希望通过更系统的学习理解一致性协议的设计思想与实现细节。
1. 什么是一致性问题
在分布式系统中,一致性问题的实质是多个节点如何就某个状态或值达成一致。这一问题的典型例子是分布式数据库中不同节点对某条数据的存储状态。当某个客户端对数据进行更新操作时,如何保证所有节点对这条数据的一致性,避免不一致的状态出现,是我们要解决的核心问题。
1.1 分布式一致性与CAP理论
CAP理论指出,分布式系统中无法同时满足一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance),最多只能同时满足其中两项。在设计一致性协议时,我们需要在这些特性之间进行权衡。
一致性意味着所有节点在同一时刻对某个数据具有相同的值。可用性表示系统始终能够提供响应服务,即使是返回旧数据。分区容错性意味着即使网络发生分区,系统依然能够继续运行。Paxos和Raft协议主要聚焦于在保证分区容错的情况下实现数据的一致性。
1.2 分布式一致性协议的分类
分布式一致性协议可以分为经典的一致性协议(如Paxos)和后续衍生的改进协议(如Raft)。Paxos是一种较为复杂且理论性强的协议,而Raft通过更清晰和易于理解的方式实现了一致性,获得了更广泛的应用。
2. Paxos协议
Paxos协议由计算机科学家Leslie Lamport提出,是分布式一致性协议的奠基石之一。它解决了在多个节点中如何就某个值达成一致的问题,即使部分节点出现故障。
2.1 Paxos协议的基本思想
Paxos协议的核心思想是通过角色的划分和多轮投票来保证节点对某一值的达成一致。在Paxos协议中,节点主要扮演以下三种角色:
- Proposer(提议者):提出某个提议,建议将某个值写入。
- Acceptor(接受者):对提议进行投票并保存同意的提议。
- Learner(学习者):得知被选定的提议。
Paxos通过多轮通信使得即使部分节点故障,其余节点仍能就某个提议达成共识。整个过程可以分为两个阶段:准备阶段(Prepare)和接受阶段(Accept)。
2.2 Paxos协议的步骤详解
-
Prepare 阶段
- 提议者选择一个提议编号
n
并向所有接受者发送Prepare(n)
请求。 - 如果接受者收到的提议编号大于其之前接受的所有提议编号,则接受者承诺不会再接受编号小于
n
的提议,并向提议者回复之前已经接受的最大提议。
- 提议者选择一个提议编号
-
Accept 阶段
- 如果提议者从大多数接受者处收到了针对
Prepare(n)
的响应,则可以确定提议值v
,并向所有接受者发送Accept(n, v)
请求。 - 接受者如果没有承诺比
n
更高的提议编号,则接受该提议并回复确认。
- 如果提议者从大多数接受者处收到了针对
-
达成共识
- 当提议者从大多数接受者处收到确认响应时,提议
v
被确定为共识值。
- 当提议者从大多数接受者处收到确认响应时,提议
2.3 Paxos协议的代码实现
以下是Paxos协议的简化Python实现,用于展示主要的流程逻辑。
class Acceptor:def __init__(self):self.promised_n = Noneself.accepted_n = Noneself.accepted_value = Nonedef prepare(self, n):if self.promised_n is None or n > self.promised_n:self.promised_n = nreturn True, self.accepted_n, self.accepted_valuereturn False, None, Nonedef accept(self, n, value):if self.promised_n is None or n >= self.promised_n:self.accepted_n = nself.accepted_value = valuereturn Truereturn Falseclass Proposer:def __init__(self, acceptors):self.acceptors = acceptorsdef propose(self, value):n = 1 # 简化起见,假设提议编号为1prepare_responses = [acceptor.prepare(n) for acceptor in self.acceptors]if sum(response[0] for response in prepare_responses) > len(self.acceptors) // 2:accepted_value = valuefor acceptor in self.acceptors:acceptor.accept(n, accepted_value)print(f"提议 {accepted_value} 被接受!")else:print("提议失败,未能获得多数响应。")# 示例用法
acceptors = [Acceptor() for _ in range(5)]
proposer = Proposer(acceptors)
proposer.propose("一致性值")
2.4 Paxos的优缺点
优点:
- Paxos能够在部分节点失效的情况下达成一致性,具有较强的容错性。
- 是理论上证明可以达成一致性的协议,安全性高。
缺点:
- Paxos协议实现复杂,涉及多轮通信,难以理解和实现。
- 在实际工程中性能有限,尤其是在大规模系统中,通信开销较大。
3. Raft协议
Raft协议作为一种替代Paxos的协议,目标是通过更易于理解的方式实现分布式一致性。Raft将一致性问题分为多个子问题,采用领导者选举、日志复制等机制,极大地降低了协议的复杂性。
3.1 Raft协议的基本思想
Raft通过角色划分和状态转换来实现一致性,集群中的节点可以是以下三种状态之一:
- Leader(领导者):负责处理客户端请求,将日志复制给其他节点。
- Follower(跟随者):被动地接收并响应来自Leader的指令。
- Candidate(候选者):当节点无法与Leader通信时,成为候选者发起选举。
3.2 Raft的核心步骤
-
领导者选举
- 当集群中的某个Follower未收到Leader的心跳消息时,会转换为Candidate状态,并发起选举。
- 通过向其他节点发送选举请求并获得多数节点同意后,该Candidate成为Leader。
-
日志复制
- Leader接收到客户端请求后,将请求作为日志条目追加到自身日志中,然后并行地向所有Follower发送复制请求。
- 当多数Follower确认日志复制成功后,Leader提交日志并响应客户端。
-
故障恢复
- 如果Leader发生故障,Follower会在超时后发起新的选举,选出新的Leader,以保证系统的可用性。
3.3 Raft协议的代码实现
以下是Raft协议领导者选举过程的简化Python实现。
import random
import timeclass Node:def __init__(self, node_id):self.node_id = node_idself.state = "Follower"self.voted_for = Noneself.term = 0def start_election(self, nodes):self.state = "Candidate"self.term += 1self.voted_for = self.node_idvotes = 1 # 自己的选票for node in nodes:if node.node_id != self.node_id and node.request_vote(self.term):votes += 1if votes > len(nodes) // 2:self.state = "Leader"print(f"节点 {self.node_id} 成为了领导者,任期 {self.term}")else:self.state = "Follower"def request_vote(self, term):if term > self.term:self.term = termself.voted_for = Nonereturn Truereturn False# 示例用法
nodes = [Node(i) for i in range(5)]
random.choice(nodes).start_election(nodes)
3.4 Raft协议的优缺点
优点:
- Raft协议通过领导者选举和日志复制的方式,逻辑清晰,易于实现。
- 相较于Paxos,Raft更易于理解,并且实现起来更直接。
缺点:
- Raft在选举过程中依赖Leader,Leader的故障会引起短暂的不可用。
- 如果集群规模较大,选举过程的开销也可能较大。
4. Paxos与Raft的对比
特性 | Paxos | Raft |
---|---|---|
复杂性 | 理论复杂,难以实现 | 逻辑清晰,易于实现 |
性能 | 通信开销大,效率较低 | 相对较高,但依赖Leader |
理解难度 | 较难理解 | 易于理解 |
应用场景 | 理论验证,分布式一致性 | 工程实现,广泛应用 |
Paxos和Raft在解决一致性问题时各有千秋。Paxos更为通用且理论性强,但在实际开发中,Raft凭借其较为简洁的实现和明确的步骤成为了更受欢迎的选择。Raft通过将一致性问题分解为领导选举、日志复制等子问题,降低了协议的复杂度,使其更适合工程实践。
5. 总结
Paxos通过多轮投票保证一致性,但实现复杂且难以理解。Raft通过领导者选举和日志复制实现一致性,逻辑清晰且易于实现,在工程中有广泛应用。
理解分布式一致性协议对于分布式系统的开发至关重要,无论是设计数据库、分布式缓存,还是其他需要强一致性的系统,Paxos和Raft的思想都能为我们提供重要的指导。希望通过本文的讲解,您对一致性协议有了更为深入的理解,并能够在实际的分布式系统设计中应用这些思想。
相关文章:
分布式一致性协议的深度解析:Paxos与Raft
分布式系统的复杂性源于节点失效、网络分区、消息丢失等诸多不确定性。在这种背景下,分布式一致性问题应运而生,成为解决这些问题的核心。本文将从理论到实践,深入探讨两种经典的一致性协议:Paxos与Raft。文章适合有一定分布式系统…...

ai写作,五款软件助你快速写作!
在这个信息爆炸的时代,内容创作成为了连接用户、传递价值的桥梁。然而,面对日益增长的创作需求,如何在保证质量的同时提升效率,成为了每位创作者面临的难题。幸运的是,随着人工智能技术的飞速发展,AI写作软…...
解决JavaScript 数学运算精度丢失的问题
JavaScript 中执行浮点数运算时可能会遇到精度丢失的问题。这通常是因为浮点数的表示遵循IEEE 754标准,而这种表示法只能精确地表示有限的数字。对于大多数程序员来说,这不是一个问题,因为它允许计算机处理超出精度范围之外的数字。然而&…...
mysql学习教程,从入门到精通,SQL窗口函数(38)
1、SQL窗口函数 SQL窗口函数(Window Functions)是一种强大的数据分析工具,它们允许你在结果集的行上执行计算,而不需要将这些行分组到单独的输出行中。窗口函数通常与OVER()子句一起使用,该子句定义了窗口或分区&…...
gbase8s数据库实现黑白名单的几种方案
1、借用操作系统的黑白名单 2、使用数据库 TRUSTED CONTEXT 机制 CREATE TRUSTED CONTEXT tcx1USER rootATTRIBUTES (ADDRESS 172.16.39.162)ATTRIBUTES (ADDRESS 172.16.39.163)ENABLEWITH USE FOR wangyx WITHOUT AUTHENTICATION; 如上创建 可信任上下文对象 tcx1 在 jdb…...

Qt-窗口布局按钮输入类
1. 窗口布局 Qt 提供了很多摆放控件的辅助工具(又称布局管理器或者布局控件),它们可以完成两件事: 自动调整控件的位置,包括控件之间的间距、对齐等; 当用户调整窗口大小时,位于布局管理器内的…...

Apache DolphinScheduler社区9月进展记录
各位热爱 Apache DolphinScheduler 的小伙伴们,社区 9 月月报更新啦!这里将记录 Apache DolphinScheduler 社区每月的重要更新,欢迎关注! 月度 Merge Star 感谢以下小伙伴上个月为 Apache DolphinScheduler 做的精彩贡献&#x…...

在docker中安装并运行mysql8.0.31
第一步:命令行拉取mysql镜像 docker pull mysql:8.0.31查看是否拉取成功 docker images mysql:latest第二步:运行mysql镜像,启动mysql实例 docker run -p 3307:3307 -e MYSQL_ROOT_PASSWORD"123456" -d mysql:8.0.313307:3307前…...

C++ | Leetcode C++题解之第458题可怜的小猪
题目: 题解: class Solution { public:int poorPigs(int buckets, int minutesToDie, int minutesToTest) {if (buckets 1) {return 0;}vector<vector<int>> combinations(buckets 1,vector<int>(buckets 1));combinations[0][0] …...

【万字长文】Word2Vec计算详解(三)分层Softmax与负采样
【万字长文】Word2Vec计算详解(三)分层Softmax与负采样 写在前面 第三部分介绍Word2Vec模型的两种优化方案。 【万字长文】Word2Vec计算详解(一)CBOW模型 markdown行 9000 【万字长文】Word2Vec计算详解(二࿰…...
【分布式微服务云原生】探索Dubbo:接口定义语言的多样性与选择
目录 探索Dubbo:接口定义语言的多样性与选择引言Dubbo的接口定义语言(IDL)1. Java接口2. XML配置3. 注解4. Protobuf IDL 流程图:Dubbo服务定义流程表格:Dubbo IDL方式比较结论呼吁行动Excel表格:Dubbo IDL…...

SAP将假脱机(Spool requests)内容转换为PDF文档[RSTXPDFT4]
将假脱机(Spool requests)内容转换为PDF文档[RSTXPDFT4] 有时需要将Spool中的内容导出成PDF文件,sap提供了一个标准程序RSTXPDFT4可以实现此功能。 1, Tcode:SP01, 进入spool requests list 2, SE38 运行程序RSTXPDFT4 输入spool reqeust号码18680,然后…...
DNS能加速游戏吗?
在游戏玩家追求极致游戏体验的今天,任何可能提升游戏性能的因素都备受关注,DNS(域名系统)便是其中一个被探讨的对象。那么,DNS能加速游戏吗? 首先,我们需要了解DNS的基本功能。DNS就像是互联网…...
Raspberry Pi3B+之C/C++开发环境搭建
Raspberry Pi3B之C/C开发环境搭建 1. 源由2. 环境搭建2.1 搭建C语言开发环境2.2 工程目录结构2.3 Makefile2.4 Demo (main.c) 3. 测试工程3.1 编译3.2 运行 4. 总结5. 参考资料 1. 源由 为了配合《Ardupilot开源飞控之FollowMe验证平台搭建》,以及VINS-Fusion对于图…...
[笔记] 仿射变换性质的代数证明
Title: [笔记] 仿射变换性质的代数证明 文章目录 I. 仿射变换的代数表示II. 仿射变换的性质III. 同素性的代数证明1. 点变换为点2. 直线变换为直线 IV. 结合性的代数证明1. 直线上一点映射为直线上一点2. 直线外一点映射为直线外一点 V. 保持单比的代数证明VI. 平行性的代数证明…...

遥感影像-语义分割数据集:sar水体数据集详细介绍及训练样本处理流程
原始数据集详情 简介:该数据集由WHU-OPT-SAR数据集整理而来,覆盖面积51448.56公里,分辨率为5米。据我们所知,WHU-OPT-SAR是第一个也是最大的土地利用分类数据集,它融合了高分辨率光学和SAR图像,并进行了充…...

极狐GitLab 发布安全补丁版本 17.4.1、17.3.4、17.2.8
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
汽车管理系统中使用函数
目录 setupUisetEnabledcurrentText()setTextsetFocus()query.exec(...)addWidgetconnect setupUi setupUi() 是 ui 对象的一个成员函数,它的作用是根据 .ui 文件中的设计,将设计好的组件(如按钮、文本框、布局等)添加到当前的窗…...
大数据分析入门概述
大数据分析入门概述 本文旨在为有意向学习数据分析、数据开发等大数据方向的初学者提供一个学习指南,当然如果你希望通过视频课程的方式快速入门,B站UP主戴戴戴师兄的课程质量很高,并且适合初学者快速入门。本文的目的旨在为想要了解大数据但…...

提示工程、微调和 RAG
自众多大型语言模型(LLM)和高级对话模型发布以来,人们已经运用了各种技术来从这些 AI 系统中提取所需的输出。其中一些方法会改变模型的行为来更好地贴近我们的期望,而另一些方法则侧重于增强我们查询 LLM 的方式,以提…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...