分布式协议之巅 — 揭秘基础Paxos与Raft协议如何实现分布式系统达成一致性(非变种Paxos协议)

news2025/2/26 8:08:51

揭秘Paxos与Raft协议如何实现分布式系统达成一致性

  • 前提介绍
  • Paxos专题大纲
  • Paxos协议
    • Paxo协议的角色
      • 标准Paxos角色
        • Proposer(提案者)
        • Acceptor(接受者)
        • Learner(学习者)
    • 提案编号与确认值的组合解析
    • Paxos协议的基石:Basis Paxos
      • 执行流程解析
        • 阶段一
          • Prepare阶段
          • Promise阶段
        • 阶段二
          • Accept阶段
          • Accepted阶段
    • 最后总结
      • 标准角色
        • **Proposer(提案者)**
        • **Acceptor(投票者)**
        • **Learner(学习者)**
      • 非标准角色
        • Client(客户端)
          • **客户端与Paxos系统的交互**
      • 下篇预告

前提介绍

在我们深入探讨分布式一致性及其实现方式——Raft协议之前,让我们首先揭开Paxos协议的神秘面纱。Paxos协议,这个在分布式系统领域颇具影响力的开创性协议,早已在业界赢得了广泛的认可和应用。它的影响力甚至延伸到了后续著名的Raft协议,后者在很大程度上是基于Paxos的精髓发展而来的。实际上,许多知名产品,如Google的Chubby、Spanner,以及IBM的SVC等,都选择了Paxos作为它们分布式一致性的解决方案。

Paxos专题大纲

在接下来的总体分布式协议专题里面,我们将从Paxos协议的基础概念开始,逐步深入到各个变种和扩展,包括Generalized Byzantine Paxos、Cheap Paxos、Fast Paxos以及Multi Paxos等。我们将分析这些协议的设计原则、关键特性以及在实际应用中的挑战和解决方案。如下图所示:
在这里插入图片描述

Paxos协议

在广泛的信息海洋中,尽管关于Paxos协议的讨论层出不穷,但真正能够清晰、深入解析其核心原理和实践应用的资料却并不多见。为此,我投入了大量时间深入研究Paxos协议,力求为读者提供一个清晰、全面的理解。以下便是我的学习成果和分析。

事实上,Paxos协议的创始人Leslie Lamport早在2001年就撰写了一篇名为《Paxos Made Simple》的论文,其主要目的是为了以更加简洁明了的方式阐述Paxos协议。这篇论文被誉为是理解Paxos协议的必读之作,它为我们提供了一个清晰、精炼的Paxos协议描述。

如果您希望深入了解Paxos协议的细节和精髓,我强烈建议您阅读《Paxos Made Simple》

Paxo协议的角色

在传统的Paxos协议中,通常只有三种核心角色:**proposer(提案者)****acceptor(接受者)****learner(学习者)**
在这里插入图片描述
如果您对前面所介绍的Paxos算法内容感到困惑或有任何疑问,请放心,接下来我将为您详细分析并解答所有疑虑。我的目标是确保您能够全面理解Paxos协议的细节和工作原理,从而为您在分布式系统设计和实现中提供有力的支持。请继续阅读,相信您会对Paxos有更深入的认识。

标准Paxos角色

Proposer(提案者)

提案者(Proposer)发挥着至关重要的作用,它是推动系统决策和达成共识的核心驱动力。以下是提案者的主要职责及其详细分析(提案者的角色与接收者交互流程)。
在这里插入图片描述
1.生成提案:提案者的首要任务是生成提案。这些提案是关于某个值(可以理解为服务的ID和唯一标识)或操作的决策,它们是Paxos协议中达成共识的基础。提案者根据当前系统的状态和需求,生成合适的提案。

2.发送提案:一旦提案生成,提案者会将其发送给所有的接受者(Acceptor)。为了尝试在系统中达成共识,即让大多数接受者接受并同意该提案。提案者确保提案被正确地传播到所有相关的节点。

3.响应决策:提案者会监听来自接受者的响应。这些响应可以是接受、拒绝或超时等。根据接收到的响应,提案者会做出决策。

  • 如果提案被大多数接受者接受,那么提案者认为该提案达成共识,可以结束提案过程。
  • 如果提案被拒绝或超时,提案者可能需要重新发送提案或进行其他策略调整。
Acceptor(接受者)

接受者(Acceptor)扮演着至关重要的角色,它是系统中决策的最终仲裁者。

在这里插入图片描述

  • 接收提案:接受者的首要职责是接收来自提案者(Proposer)的提案。这些提案是关于某个值或操作的决策,是Paxos协议中达成共识的基础。接受者确保正确无误地接收提案,并准备对其进行投票。

  • 投票决策:投票的过程涉及到对提案的接受或拒绝。接受者根据自己的状态和系统要求,对提案进行评估,并给出明确的投票结果。这个过程是Paxos协议中达成共识的关键环节。

  • 决策稳定性:一旦对提案投了决定性的票,这个决策就是最终和不可更改的。即使后续接收到其他提案或更改请求,接受者也不会改变已经做出的决策。这种稳定性保证了系统的一致性和可靠性。

Learner(学习者)

学习者(Learner)扮演着至关重要的角色,它是系统中获取一致性数据的关键组件。
在这里插入图片描述

  • 学习并获取共识数据:学习者的核心职责是从接受者(Acceptor)那里学习并获取已达成共识的值或日志条目。这些共识数据是分布式系统中各个节点达成一致的关键信息,对于保证系统的一致性和可靠性至关重要。

  • 作为独立服务存在:学习者通常是系统中的一个或多个独立服务,它们不需要直接参与提案和投票过程。这意味着学习者可以专注于从系统中获取一致性数据,而无需关注提案的生成和投票决策。这种分离使得学习者能够更加高效地从系统中获取所需数据。

  • 与接受者交互以获取日志条目:在多阶段Paxos(Multi-Paxos)中,学习者的职责进一步扩展。它们会主动向接受者发送请求,以获取最新的日志条目。这些日志条目记录了系统中所有的决策和状态变化,是学习者更新自身状态的关键依据。

  • 根据日志条目更新状态:一旦学习者从接受者那里获取到日志条目,它会根据这些条目更新自己的状态。这意味着学习者会根据系统的最新决策和状态变化来同步自己的数据,确保与系统中的其他节点保持一致。

提案编号与确认值的组合解析

  • “Proposal Value”,亦称为提案编号,我们用符号n来代表。这一编号对于每个提案者(Proposer)而言都是独一无二的,确保了提案的辨识性和追踪性。它不仅是提案的标识符,还代表着提案者在某一时刻的决策尝试。

  • “Agreed Value”,或称确认值,我们用v来标识。这个值是由接受者(Acceptor)群体经过投票和共识达成后所确认的值。v代表了系统中某一数据项或决策的最终状态,是Paxos协议达成一致性的核心。
    在这里插入图片描述
    将这两个值组合起来,我们得到(n,v)这样的配对。这一配对不仅记录了提案的编号,还标记了与之相对应的、经过确认的值。在Paxos协议的运作过程中,(n,v)对是确保系统状态一致性和决策可追溯性的关键要素。

Paxos协议,作为分布式系统领域中的一致性算法翘楚,拥有多个变种和应用场景。在本系列的开篇之作中,我们将聚焦其核心——Basis Paxos。深入理解并掌握这一基础版本,将为后续的Paxos探索之旅奠定坚实基础。

Paxos协议的基石:Basis Paxos

Basis Paxos,作为Paxos协议的基石,简洁而高效,为分布式系统中的节点提供了在故障发生时仍能达成一致的机制。掌握了Basis Paxos的原理与实现,能够更轻松地理解和应用其他更为复杂的Paxos变种。

执行流程解析

在Basic Paxos协议中,执行过程被精心设计为多个独立的序列,每个序列都产生一个唯一的执行结果。这些执行过程呈现出一种层次分明的结构,其中每一轮次都分为两个紧密相连的阶段。

阶段一

两阶段的设计确保了Paxos协议在分布式环境中的高效运作。每个阶段都扮演着不同的角色,共同协作以实现系统的一致性和可靠性。

Prepare阶段

Prepare阶段,一个Proposer会创建一个Prepare消息,每个Prepare消息都有唯一的提案编号n。
在这里插入图片描述

  • Proposal Value序列号:n并不是将要提案的内容,而只是一个唯一的编号,用来标志这个Prepare的消息。

其中n值必须比该Proposer之前用过的所有编号都大,一般来说我们可以以数字递增的方式来实现这个编号。 接下来Proposer会把该编号发送给Acceptors,只有大多数Acceptors接收到Proposer发来的消息,该消息才算是发送成功。

Promise阶段

所有的Acceptors都在等待从Proposers发过来的Prepare消息。
在这里插入图片描述
当一个Acceptor收到从Proposer发过来的Prepare消息时候,会有两种情况:
在这里插入图片描述

  1. 该消息中的n是Acceptor所有收到的Prepare消息中最大的一个,那么该Acceptor必须返回一个Promise消息给Proposer,告诉它后面所有小于n的消息我都会忽略掉。
    • 如果该Acceptor在过去的某个时间已经确认了某个消息,那么它必须返回那个消息的提案标号n1和确认值v1 (n1,v1)。如果该Acceptor在过去并没有确认过任何消息,那么会返回NULL。
  2. 如果Prepare消息中的n小于该Acceptor之前接收到的消息,那么该消息会被Acceptor忽略(为了优化也可以返回一个拒绝消息给Proposer,告诉它不要再发小于n的消息给我了)。
阶段二

如果一个Proposer从Acceptors接收到了足够多的Promises消息(>n/2),这表示该Proposer可以开始下一个Accept请求的阶段了。

Accept阶段

在Accept阶段,Proposer需要设置一个值,然后向Acceptors发送Accept请求。 如果Acceptor之前确认过消息,那么会把该消息编号和消息的值(n,v)返回给Proposer, Proposer收到多个Acceptors返回过来的消息之后,会从中选择编号最大的一个消息所对应的值m,并把他作为Accept请求的值(n,m)发给Acceptor。
在这里插入图片描述

此外,如果所有的Acceptors都没有确认过消息,那么Proposer可以自主选择要确认的值m

Accepted阶段

当Acceptor接收到了Proposer的确认消息请求(n,m),如果该Acceptor在Accept阶段的时候没有接收到>n的消息,那么该(n,m)消息就必须被Acceptor确认。

当(n,m)消息被Acceptor确认时,Acceptor会发送一个Accepted(n,m)消息给Proposer。如果该Acceptor在Accept阶段的时候接收>n的消息,那么该确认请求消息会被拒绝或者忽略。

最后总结

在接下来的文章中,我们将继续探讨Paxos协议的其他方面,包括其在实际应用中的场景和细节优化。但在此之前,让我们先扎实地掌握Basis Paxos的核心思想和实践应用。这将为您在分布式系统领域中的进一步探索提供有力的支持。

标准角色

Proposer(提案者)

Proposer可以被视为Client的代理人,它负责将Client的消息请求转发给Acceptor,并等待Acceptor的确认。在Paxos协议中,Proposer扮演着至关重要的角色,尤其是在处理消息冲突时。当多个提案同时存在冲突时,Proposer会尝试解决这些冲突,确保系统能够达成一致的决策。这种机制确保了系统中的决策过程是有序且高效的。

Acceptor(投票者)

Acceptor是由一组服务构成的,这些服务共同维护着系统的状态。当消息被发送给Acceptor时,只有当大多数Acceptor确认接收并同意该消息时,该消息才会被存储并视为有效。否则,该消息将被视为无效并被丢弃。这种机制确保了Paxos协议中的决策具有高度的可靠性和一致性。

Learner(学习者)

Learner在Paxos协议中扮演着执行已确认消息的角色。一旦Client的消息请求被Acceptor确认并存储,Learner会负责执行相应的操作。这可能包括执行消息内容、更新系统状态或发送回复给Client等。值得注意的是,Paxos系统中可以有多个Learner,它们并行工作,共同处理已确认的消息,从而提高了系统的吞吐量和响应速度。

非标准角色

除了标准Paxos协议中的提案者(Proposer)、接受者(Acceptor)和学习者(Learner)等核心角色外,还存在一些非标准的角色,如客户端(Client)和领导者(Leader)。这些角色在Paxos协议的不同变种和扩展中扮演着重要的角色,为分布式系统的运作提供了更多的灵活性和可扩展性。

Client(客户端)

Client(客户端)是指请求的发起端,Client发送请求给分布式系统,并等待回复,客户端在与系统交互时,会发起请求并期望系统能够处理该请求并返回相应的结果。

客户端与Paxos系统的交互

在Paxos协议的上下文中,这一流程通常涉及与提案者(Proposer)角色的直接交互。客户端会向提案者提出需要达成一致的请求,而提案者则会根据Paxos协议的规则来处理这些请求。
在这里插入图片描述
客户端在与Paxos系统交互时,并不需要深入了解协议的具体细节。它只需将请求发送到系统,并等待接收来自系统的响应即可。Paxos协议为客户端提供了一种可靠且易于使用的接口,从而促进了分布式系统的构建和发展。

注意,Paxos协议的具体实现可能会有所不同,因此这些角色的职责和作用可能会根据具体实现而有所变化。此外,有些实现可能会合并某些角色的功能,例如,同一个服务可能同时扮演proposerlearner的角色。

下篇预告

Generalized Byzantine Paxos:探索分布式系统中的容错一致性

在我们的下一篇文章中,我们将全面揭示GBP的魅力,带您走进这个构建坚不可摧分布式系统的关键组件。GBP是对经典Paxos协议的重要扩展,它解决了拜占庭将军问题,确保在部分节点故障或恶意行为下,系统仍能维持一致性。

希望大家多多支持,敬请期待!

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

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

相关文章

C++ 25 之 调用函数调用规则

c25调用函数调用规则.cpp #include<iostream> using namespace std;class Students04{ // 1.创建好类之后&#xff0c;编译器会默认提供三个函数&#xff1a;默认构造函数、构造函数、拷贝构造函数 // 2.自己写了有参构造函数&#xff0c;编译器就不会提供默认构造函数&…

Unity 设置窗口置顶超级详解版

目录 前言 一、user32.dll 1.什么是user32.dll 2.如何使用user32.dll 二、句柄Handle 1.句柄 2.句柄的功能 3.拿句柄的方法 三、窗口置顶 1.窗口置顶的方法 2.参数说明 3.使用方法 四、作者的碎碎念 前言 up依旧挑战全网讲解最详细版本~~ 本篇文章讲解的是unity…

Java-集合类-Arrays.asList()使用需要注意的大坑

Arrays.asList使用需要注意的大坑 大坑1.不可修改列表大小&&原始数组与列表共享数据2.对于基本类型数组的使用限制 两个错误案例wrong1wrong2 ​ Arrays.asList() 是 Java 中一个常用的方法&#xff0c;它 用于将数组转换为列表&#xff08;List&#xff09;。这个方…

第2章 Rust初体验4/8:提供标准库之外功能的Library Crate:简化包管理和依赖管理:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.4 故事2: 生成点数之和的随机答案 又是新的一天,大家的培训课又开始了哦!现在,我们的学员们开始用三种语言来实现故事2,加油! 2.4.1 Rust版故事2 2.4.1.1 提供标准库之外功能的Library Crate:简化包管理和依赖管理 贾克强:“我们的故事…

配置Vue3中的baseURL--用于项目快速修改请求服务器

配置baseURL之后可以快速修改请求的服务器&#xff0c;在网上搜索了很多教程都没有找到合适的&#xff0c;大多都是对Vue2项目进行配置的和配置繁琐的&#xff0c;那么这里分享一下对vue3项目如何简单快速设置baseURL 1.在main.js中写上这两句话&#xff0c;配置默认的baseURL…

WPF视频学习-简单应用篇图书馆程序(一)

1.登录界面和主界面跳转 先把登录界面分为三行《Grid》 先添加两行&#xff1a; <Grid><!--//分三行&#xff0c;行排列--><Grid.RowDefinitions><RowDefinition Height"auto"/><RowDefinition Height"auto"/><RowDef…

【杂谈】-不同种类放大器及其区别

不同种类放大器及其区别 文章目录 不同种类放大器及其区别1、概述2、放大器种类2.1 如何衡量保真度2.2 如何测量放大器的效率 3、放大器分类3.1 A类放大器3.2 B 类放大器3.3 AB类放大器3.4 C类放大器3.5 其他放大器类别 1、概述 放大器是电子产品中最常用的电路之一。有几种类…

C# 使用 webview2 嵌入网页

需求&#xff1a;C#客户端程序, 窗口里嵌入一个web网页&#xff0c;可通过URL跳转的那种。并且&#xff0c;需要将登录的身份验证信息&#xff08;token&#xff09;设置到请求头里。 核心代码如下&#xff1a; // 打开按钮的点击事件 private void openBtn_Click(object sen…

【Python】已完美解决:executemany() takes exactly 2 positional arguments (3 given)

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例&#xff08;结合实战场景&#xff09;五、注意事项 已解决&#xff1a;Python中executemany()方法参数数量错误的问题 一、问题背景 在Python的数据库编程中&#xff0c;executemany()方法是一个常…

MapStruct的用法总结及示例

MapStruct是一个代码生成器&#xff0c;它基于约定优于配置的原则&#xff0c;使用Java注解来简化从源对象到目标对象的映射过程。它主要用于减少样板代码&#xff0c;提高开发效率&#xff0c;并且通过编译时代码生成来保证性能。 我的个人实践方面是在2021年前那时候在项目中…

2024/06/13--代码随想录算法(贪心)3/6|134.加油站、135.分发糖果、860.柠檬水找零、406.根据身高重建队列

134.加油站 力扣链接 class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:curSum 0 # 当前累计的剩余油量totalSum 0 # 总剩余油量start 0 # 起始位置for i in range(len(gas)):curSum gas[i] - cost[i]totalSum gas[i] - co…

区间合并——Acwing.803区间合并

区间合并 定义 区间合并是指将一组有重叠或相邻的区间合并成一个或多个更大的区间。 运用情况 图像处理&#xff1a;在图像的区域分析中&#xff0c;可能需要将相邻的具有相似特征的区域进行合并。时间区间处理&#xff1a;比如将多个连续时间段进行合并。行程规划&#xf…

AMS深入浅出

目标&#xff1a; 1. 一、AMS启动流程 ActivityManagerService是 安卓10 以后&#xff0c;将AMS拆分出ActivityTaskManagerService。 1.1 启动入口 AMS是由SystemServer进程启动&#xff0c;在启动过程 startBootStripService&#xff0c;会启动AMS和ATMS服务。 SystemSe…

关于学习Token、JWT、Cookie等验证授权方式的总结

目录 一、为什么Cookie无法防止CSRF攻击&#xff0c;而Token可以&#xff1f; 二、为什么无论采用Cookie-session的方式&#xff0c;还是Token&#xff08;JWT&#xff09;的方式&#xff0c;在一个浏览器里&#xff0c;同一个网站只能保证一个用户处于登录状态&#xff1f; …

阻容感的串联和并联

文章目录 电阻的串联电容的串联 电阻的串联 电容的串联 CC1C2/(C1C2) 串联后电容反而变小了&#xff0c;所以实际应用中&#xff0c;电容不串联&#xff08;我没见过电容串联使用的&#xff09; 类似于电导的分压&#xff0c; 电容一般是并联使用 电感一般串联使用

【Go】用 DBeaver、db browser 和 SqlCipher 读取 SqlCipher 数据库

本文档主要描述如何用 DBeaver、db browser 和 SqlCipher 上打开加密的 SQLite3 数据库(用 SqlCipher v3 加密) 软件版本 DBeaver&#xff1a;v24.1.0 SQLite-driver: sqlite-jdbc-3.46.0.0.jar dbbrowser-for-sqlite-cipher&#xff1a;3.12.2 SqlCipher cli(ubuntun)&am…

Honor of Kings 2024.06.13 (2)

【第一局】准确的说&#xff0c;其实对面优势更加明显&#xff0c;可惜黄忠和墨子喜欢杀人&#xff0c;而我又是不喜欢杀人的&#xff0c;打了好几次失误 【第二局】阵容本来很有优势&#xff0c;这个二呆射手跟第一局黄忠一样爱杀人&#xff0c;应该说三路的输出都爱杀人&…

Golang的GC

目录 介绍GC 概要 什么是根对象 三色标记法 什么情况下三色标记法会失效 屏障机制 “强-弱” 三色不变式 插入屏障 (强三色) 删除屏障(弱三色) Go 的混合写屏障机制 混合写屏障规则 介绍GC 概要 作用范围&#xff1a;只回收堆内存&#xff0c;不回收栈内存&#xf…

Stability AI发布新版文生图模型:依然开源

Stability AI最近发布了Stable Diffusion 3 Medium&#xff08;简称SD3 Medium&#xff09;&#xff0c;这是其最新的文生图模型&#xff0c;被官方称为“迄今为止最先进的开源模型”。SD3 Medium的性能甚至超过了Midjourney 6&#xff0c;特别是在生成手部和脸部图像方面表现出…

汇聚荣科技有限公司在拼多多评价上好不好?

汇聚荣科技有限公司在拼多多平台的评价如何&#xff0c;这是很多消费者在选择购买该公司产品时会关心的问题。通过深入分析&#xff0c;我们可以从多个维度来探讨这一问题。 一、产品质量 对于任何公司而言&#xff0c;产品的质量是其生存和发展的根本。根据用户反馈和相关评价…