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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 作者推荐 | 分布式协议之巅 — 揭秘基础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协议的重要扩展,它解决了拜占庭将军问题,确保在部分节点故障或恶意行为下,系统仍能维持一致性。

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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
23天前
|
JSON 分布式计算 前端开发
前端的全栈之路Meteor篇(七):轻量的NoSql分布式数据协议同步协议DDP深度剖析
本文深入探讨了DDP(Distributed Data Protocol)协议,这是一种在Meteor框架中广泛使用的发布/订阅协议,支持实时数据同步。文章详细介绍了DDP的主要特点、消息类型、协议流程及其在Meteor中的应用,包括实时数据同步、用户界面响应、分布式计算、多客户端协作和离线支持等。通过学习DDP,开发者可以构建响应迅速、适应性强的现代Web应用。
|
29天前
|
架构师 Java 数据中心
二阶段提交:确保分布式系统中数据一致性的关键协议
【10月更文挑战第16天】在分布式系统中,数据一致性的维护是一个至关重要的挑战。为了应对这一挑战,二阶段提交(Two-Phase Commit,简称2PC)协议应运而生。作为一种经典的分布式事务协议,2PC旨在确保在分布式系统中的所有节点在进行事务提交时保持一致性。
36 0
|
2月前
|
监控
分布式-Zookeeper-Zab协议
分布式-Zookeeper-Zab协议
|
2月前
|
网络协议 网络安全 网络架构
分布式基础-网络通信协议讲解
分布式基础-网络通信协议讲解
分布式基础-网络通信协议讲解
|
1月前
|
消息中间件 缓存 算法
分布式系列第一弹:分布式一致性!
分布式系列第一弹:分布式一致性!
|
1月前
|
算法 Java 关系型数据库
漫谈分布式数据复制和一致性!
漫谈分布式数据复制和一致性!
|
3月前
|
运维 负载均衡 算法
“分布式基础概念”全面解析,让你秒懂分布式系统!【一】
该博客文章全面解析了分布式系统的基础概念,包括微服务架构、集群与分布式的区别、节点定义、远程调用、负载均衡、服务注册与发现、配置中心、服务熔断与降级以及API网关,帮助读者快速理解分布式系统的关键组成部分和工作原理。
“分布式基础概念”全面解析,让你秒懂分布式系统!【一】
|
3月前
|
自动驾驶 5G 调度
|
3月前
|
Oracle 关系型数据库
分布式锁设计问题之Oracle RAC保证多个节点写入内存Page的一致性如何解决
分布式锁设计问题之Oracle RAC保证多个节点写入内存Page的一致性如何解决
|
1月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?

热门文章

最新文章