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

本文主要是介绍分布式协议之巅 — 揭秘基础Paxos与Raft协议如何实现分布式系统达成一致性(非变种Paxos协议),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

揭秘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协议的重要扩展,它解决了拜占庭将军问题,确保在部分节点故障或恶意行为下,系统仍能维持一致性。

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

这篇关于分布式协议之巅 — 揭秘基础Paxos与Raft协议如何实现分布式系统达成一致性(非变种Paxos协议)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1058526

相关文章

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主