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

简介: 作者推荐 | 分布式协议之巅 — 揭秘基础Paxos与Raft协议如何实现分布式系统达成一致性(非变种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协议,力求为读者提供一个清晰、全面的理解。以下便是我的学习成果和分析。

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

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

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
4月前
|
数据采集 监控 NoSQL
优化分布式采集的数据同步:一致性、去重与冲突解决的那些坑与招
本文讲述了作者在房地产数据采集项目中遇到的分布式数据同步问题,通过实施一致性、去重和冲突解决的“三板斧”策略,成功解决了数据重复和同步延迟问题,提高了系统稳定性。核心在于时间戳哈希保证一致性,URL归一化和布隆过滤器确保去重,分布式锁解决写入冲突。
259 2
 优化分布式采集的数据同步:一致性、去重与冲突解决的那些坑与招
|
4月前
|
消息中间件 运维 监控
《聊聊分布式》BASE理论 分布式系统可用性与一致性的工程平衡艺术
BASE理论是对CAP定理中可用性与分区容错性的实践延伸,通过“基本可用、软状态、最终一致性”三大核心,解决分布式系统中ACID模型的性能瓶颈。它以业务为导向,在保证系统高可用的同时,合理放宽强一致性要求,并借助补偿机制、消息队列等技术实现数据最终一致,广泛应用于电商、社交、外卖等大规模互联网场景。
|
4月前
|
消息中间件 分布式计算 资源调度
《聊聊分布式》ZooKeeper与ZAB协议:分布式协调的核心引擎
ZooKeeper是一个开源的分布式协调服务,基于ZAB协议实现数据一致性,提供分布式锁、配置管理、领导者选举等核心功能,具有高可用、强一致和简单易用的特点,广泛应用于Kafka、Hadoop等大型分布式系统中。
|
8月前
|
监控 算法 关系型数据库
分布式事务难题终结:Seata+DRDS全局事务一致性架构设计
在分布式系统中,CAP定理限制了可用性、一致性与分区容错的三者兼得,尤其在网络分区时需做出取舍。为应对这一挑战,最终一致性方案成为常见选择。以电商订单系统为例,微服务化后,原本的本地事务演变为跨数据库的分布式事务,暴露出全局锁失效、事务边界模糊及协议差异等问题。本文深入探讨了基于 Seata 与 DRDS 的分布式事务解决方案,涵盖 AT 模式实践、分片策略优化、典型问题处理、性能调优及高级特性实现,结合实际业务场景提供可落地的技术路径与架构设计原则。通过压测验证,该方案在事务延迟、TPS 及失败率等方面均取得显著优化效果。
465 61
|
存储 缓存 负载均衡
一致性哈希:解决分布式难题的神奇密钥
一致哈希是一种特殊的哈希算法,用于分布式系统中实现数据的高效、均衡分布。它通过将节点和数据映射到一个虚拟环上,确保在节点增减时只需重定位少量数据,从而提供良好的负载均衡、高扩展性和容错性。相比传统取模方法,一致性哈希能显著减少数据迁移成本,广泛应用于分布式缓存、存储、数据库及微服务架构中,有效提升系统的稳定性和性能。
731 1
|
存储 算法 安全
分布式系统架构1:共识算法Paxos
本文介绍了分布式系统中实现数据一致性的重要算法——Paxos及其改进版Multi Paxos。Paxos算法由Leslie Lamport提出,旨在解决分布式环境下的共识问题,通过提案节点、决策节点和记录节点的协作,确保数据在多台机器间的一致性和可用性。Multi Paxos通过引入主节点选举机制,优化了基本Paxos的效率,减少了网络通信次数,提高了系统的性能和可靠性。文中还简要讨论了数据复制的安全性和一致性保障措施。
849 1
|
6月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
474 2
|
6月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
427 6
|
7月前
|
存储 缓存 NoSQL
Redis核心数据结构与分布式锁实现详解
Redis 是高性能键值数据库,支持多种数据结构,如字符串、列表、集合、哈希、有序集合等,广泛用于缓存、消息队列和实时数据处理。本文详解其核心数据结构及分布式锁实现,帮助开发者提升系统性能与并发控制能力。
|
11月前
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
1281 0
分布式爬虫框架Scrapy-Redis实战指南