当前位置: 首页 > news >正文

分布式算法(四):Basic Paxos协议初探(角色、阶段)

文章目录

    • Paxos应运而生
    • 名词解释
  • ==角色==
    • 1.提议者(Proposer)
    • 2.接受者(Acceptor)
    • 3.学习者(Learner)
    • 4.客户端(Client)
  • ==阶段==
    • 1.Prepare 阶段(准备)
    • 2.Accept 阶段(接受)
    • 3.Learn 阶段(学习)
      • (1)标准Paxos中的Learn阶段
      • (2)提议者辅助通知的变体
  • ==活锁问题==

在当今这个互联互通的世界里,分布式系统已经成为我们日常生活不可或缺的一部分。从在线支付到社交媒体平台,从云计算服务到物联网应用,分布式系统的身影无处不在。然而,随着节点数量的增加和地理分布的扩大,如何确保这些分散在全球各地的计算机能够像一个协调有序的整体一样工作,成为了工程师们面临的重大挑战之一。

在这个背景下,Paxos协议应运而生。它解决了分布式系统中最核心的问题之一——共识(Consensus)。共识问题可以被形象地理解为,在一群可能互不信任、甚至会偶尔失联或行为异常的成员中,达成对某个值的一致意见。这不仅仅是为了简化分布式环境的复杂性,更重要的是为了使一组成员可以虚拟化为一个单一实体向客户端提供稳定可靠的服务体验。想象一下,如果你正在使用一款流行的社交网络应用,无论是在世界的哪个角落,无论服务器集群内部发生了什么变化,你都能够顺利发布你的状态更新或与朋友交流,这就是Paxos等共识算法所保障的结果。

但要实现这一点并不容易。分布式环境中故障是不可避免的:网络可能会中断、机器可能会宕机、信息可能会丢失或延迟到达。在这种不可靠的环境下,保持系统的正确运行是一项艰巨的任务,这也正是Paxos协议的另一个重要使命——容错(Fault Tolerance)。通过精心设计的消息交换机制和决策流程,即使部分成员失效或表现出非预期的行为,Paxos也能确保其余健康的成员最终达成一致,并继续正常运作。这种能力使得基于Paxos构建的应用和服务能够在面对各种意外情况时,依然为用户提供持续可靠的性能和服务质量。

Paxos应运而生

在分布式计算的世界里,一致性问题始终是横亘在工程师面前的一座大山。

当系统跨越多个地理位置、由众多计算机节点组成时,确保这些分散的节点如同一个协调有序的整体般工作,成为了构建可靠服务的关键挑战之一。在此背景下,Paxos协议作为解决分布式系统中达成共识难题的一种通用算法,应运而生。

两阶段提交(2PC)和三阶段提交(3PC)是较早出现的一致性协议:

2PC和3PC主要用于保证事务处理中的原子性和持久性。2PC通过协调者与参与者之间简单的两步交互——投票和执行——来确保所有节点要么都应用某个操作,要么都不应用,以此达到一致性。然而,2PC对协调者的依赖极高,一旦协调者失效或在网络分区期间无法与其他成员通信,整个系统可能会陷入停滞。为缓解这些问题,3PC增加了预提交阶段,理论上减少了阻塞的可能性,但并未完全消除单点故障的风险,并且由于额外的消息交换导致性能下降。

尽管如此,2PC和3PC都是面向事务处理设计的,适用于需要强一致性的场景,如数据库管理系统。相比之下,Paxos则提供了一种更为灵活、广泛适用的方法来解决分布式环境下的共识问题。Paxos的设计初衷并不是为了处理事务,而是为了确保即使在网络不稳定、节点可能随时失败的情况下,仍然能够安全地达成对某个值的一致意见。它通过一系列提案过程,确保只要有超过半数的节点正常工作,就可以完成一次成功的提案,从而极大地提高了系统的容错能力和可用性。

Paxos

Paxos的核心机制包括提议、接受和学习三个阶段。首先,提议者选择一个提案编号并尝试获取大多数成员的支持;接着,在获得足够支持后,提议者广播提案内容给所有成员;最后,一旦提案被多数成员接受,其他成员将学习到这个确定下来的值。这种机制不仅允许部分成员暂时离线或失联,而且能够在成员恢复后继续参与决策过程,而不影响整体的一致性。

Paxos协议之所以重要,是因为它解决了分布式环境中达成共识这一基础性问题,使得一组成员可以虚拟化为一个单一实体向客户端提供稳定可靠的服务体验。无论是在世界的哪个角落,用户都能享受到连续的服务,这正是Paxos等共识算法所保障的结果。随着云计算、大数据以及物联网等技术的发展,Paxos及其变体已经成为现代分布式系统不可或缺的一部分,为实现高可用性和强一致性提供了坚实的理论和技术支撑。

本篇博客讲的是Basic Paxos算法,相比Multi Paxos是比较容易理解的。

名词解释

  1. 容错(Fault Tolerance):
    容错是指一个系统在遇到故障时,仍然能够正确地完成其功能的能力。在分布式系统中,由于网络问题、节点失效等原因,可能会导致某些组件或节点不可用。容错机制允许系统在这种情况下继续运行,不影响服务的可用性和数据的一致性。对于Paxos来说,它能够在一定数量的节点失败的情况下,依然保证系统的正常运作和一致性。

  2. 共识(Consensus):
    共识是指在分布式系统中的多个节点上就某个值或状态达成一致的过程。在Paxos算法中,共识指的是所有非故障的参与者最终同意相同的值,并且这个值一旦被决定下来就不会再改变。达成共识是确保分布式系统中数据一致性的关键步骤,即使在网络分区或者节点故障的情况下也能保持数据的一致性。

  3. 多数派(Majority):
    在Paxos算法中,为了确保决策的有效性和防止脑裂(split-brain)问题的发生,通常需要通过投票来确定一个提议是否被接受。这里所谓的“多数派”是指一组节点,它们的数量超过了系统中所有节点数量的一半。例如,在一个由5个节点组成的集群中,任何三个节点构成的集合都可以被认为是多数派。只有当一个提议获得多数派的支持时,它才会被视为有效并被应用到系统中。

  4. 少数派(Minority):
    相对于多数派而言,“少数派”指的是那些未能形成超过一半节点数量的节点集合。在一个健康的Paxos系统中,少数派的意见不足以影响最终的决策结果,因为系统的设计原则是必须有超过一半的节点(即多数派)同意才能使提议生效。然而,在实际操作中,如果系统出现了网络分区,那么可能就会存在两个独立的多数派,这时就需要额外的机制来解决潜在的一致性问题。

  5. 提案(Proposal)

    • 提案是指在Paxos协议中由提议者(Proposer)发起的建议值。每个提案都有一个唯一的编号(通常是一个递增的整数),以确保不同提案之间的唯一性和顺序性。提案的内容可以是任何需要达成共识的数据或状态,例如分布式数据库中的事务提交、配置变更等。
  6. Instance(实例)

    • 在Paxos中,Instance指的是一个独立的共识问题或决策过程。每一个Instance对应于一次特定的共识事件,即针对某个具体提案达成一致。每个Instance都有自己的编号,用来区分不同的共识过程。
    • 一个完整的Paxos系统可能会同时处理多个Instance,每个Instance都遵循相同的Paxos协议规则独立地进行。这意味着即使某些Instance由于网络延迟等原因未能及时完成,也不会影响到其他Instance的正常运行。
    • Instance的编号通常是全局有序的,这有助于保证系统的线性化(Linearizability),也就是说,从外部观察者的角度来看,所有操作似乎都是按照某种全局时序发生的。

角色

在这里插入图片描述

1.提议者(Proposer)

当系统接收了来自客户端的请求时,提议者负责提出新的提案(Proposal),包括一个唯一的提案编号和建议值。提议者需要与接受者通信,尝试让它们接受自己的提案。

提议者相当于主持人。

2.接受者(Acceptor)

接受者是参与投票的节点,它们的任务是决定是否接受某个提案。每个接受者可以承诺不接受低于某个编号的提案,并且一旦接受了某个提案,就不再改变。

接受者相当于拥有投票权限的角色。

3.学习者(Learner)

学习者并不直接参与到提案的过程中,而是从接受者那里学习最终被选定的值。它们的作用是观察系统状态并确保所有节点都了解到已经达成一致的值。

学习者相当于没有表决权限,但需要接受提案结果的角色。

4.客户端(Client)

虽然不是Paxos的核心角色,但客户端发起请求或命令,这些请求通过提议者转化为提案。客户端依赖于Paxos协议来保证其提出的操作能够安全地被系统处理并达成共识。

阶段

Paxos算法中,为了确保在分布式系统中达成共识,定义了几个关键阶段:Prepare(准备)、Accept(接受)和Learn(学习)。每个阶段都有特定的目的和作用。下面我将详细解释这三个阶段。

1.Prepare 阶段(准备)

提议者发起Prepare请求

  • 提议者选择一个新的提案编号n,这个编号必须是全局唯一的,并且比它之前使用的任何编号都要大。
  • 提议者向多数派的接受者发送Prepare(n)请求。该请求询问接受者是否可以承诺不接受小于n的任何其他提案。

接受者的响应

  • 接受者收到Prepare(n)请求后,如果n大于它已经同意过的最大提案编号,则它会回复给提议者一个包含两个信息的响应:
    • 承诺不再接受编号小于n的任何提案。
    • 如果接受者在此之前已经接受了某个提案,则返回那个提案的编号和值;否则返回空。
  • 这一过程确保了新提案能够覆盖旧的提案,同时也允许提议者了解到最新的状态。

提议者收集响应

  • 如果提议者从多数派接受者那里收到了足够的Promise响应(即形成了一个多数派的支持),那么它可以进入下一个阶段。

2.Accept 阶段(接受)

提议者提出Accept请求

  • 根据Prepare阶段接收到的信息,提议者确定要提出的值v。如果在Prepare阶段有任何接受者报告了已经被接受的提案,提议者应该选择其中编号最高的提案的值作为自己的提案值;如果没有,则可以使用提议者想要设置的新值。
  • 提议者向多数派接受者发送Accept(n, v)请求,试图让它们接受这个提案。

接受者的处理

  • 接受者收到Accept(n, v)请求后,如果它之前承诺过不接受编号小于n的提案,那么它就会接受这个新的提案,并记录下来。
  • 接受者还可以回复提议者确认它已经接受了这个提案。

提议者确认

  • 如果提议者的提案被多数派接受者接受,那么这个提案就被认为是成功的,其值v将成为最终达成一致的值。

3.Learn 阶段(学习)

在Paxos算法中,proposer(提议者)并不直接向learner(学习者)发送达成共识的提案。通常,learner是通过从acceptor(接受者)那里收集信息来得知最终达成一致的值。不过,在某些实现或变体中,可能会设计额外的机制让提议者也参与到通知学习者的流程中。以下是更详细的说明:

(1)标准Paxos中的Learn阶段

Acceptors 通知 Learners

  • 在标准Paxos中,一旦一个提案被多数派的acceptors接受,这些acceptors会将这个信息传递给learners
  • Learners从多个acceptors那里接收到相同的提案后,可以确认该提案已经被选定为最终值。

Learner 的角色

  • Learners的主要任务是从acceptors处收集信息,并确保所有节点都了解到已经达成一致的值。
  • 它们不参与提案的选择或投票过程,而是负责传播和确认最终结果。

(2)提议者辅助通知的变体

Proposer 发送通知

  • 在某些Paxos的实现或变体中,为了加速信息传播或者简化系统架构,proposers可以在它们成功地让多数派acceptors接受了某个提案之后,主动向learners发送通知。
  • 这样做可以减少learners等待acceptors消息的时间,特别是在网络延迟较大的环境中。

优化的信息传播

  • 如果proposerlearners发送通知,它应该包含足够的信息以证明该提案确实已经被多数派接受。这可能包括来自足够多acceptors的确认,以保证其他节点也能验证这一结论。

活锁问题

在Basic Paxos中,活锁(livelock)并不是一个常见讨论的现象,因为Paxos设计的目的之一就是确保在网络可靠的情况下能够最终达成一致,即使有节点故障或消息延迟。然而,在某些极端情况下,如果协议的执行不当或者网络条件非常差,可能会出现类似于活锁的情况,即系统中的进程不断重复尝试提议而无法达成共识。

具体来说,活锁现象可以发生在如下情况:

  1. 提议者(Proposer)和接受者(Acceptor)之间的交互:如果多个提议者同时提交提案,并且这些提案相互竞争,那么就可能出现这样的情况:每个提议者收到其他提议者的提案后都试图更新自己的提案,导致所有提案都被拒绝,然后所有的提议者再次尝试提交新的提案,这样循环往复,没有一个提案能最终被选定。

  2. 学习者(Learner)的行为:虽然学习者不直接参与决策过程,但如果学习者的行为影响了提议者或接受者的决定(例如通过提供旧的状态信息),也可能间接导致类似的循环行为。

  3. 网络分区或延迟:在网络分区或严重延迟的情况下,消息可能不能及时到达,使得一些提议看起来像是从未发生过,从而导致提议者不断重新提议,造成类似活锁的效果。

为了避免这种情况,实际实现中通常会采用一些策略来减少活锁的可能性,例如引入随机等待时间、使用领导选举机制限制同时活跃的提议者数量等。此外,完整的Paxos协议(如Multi-Paxos)通过指定一个唯一的领导者来提出值,大大减少了这种可能性。在领导者稳定的情况下,其他提议者不会随意提出新的提案,从而避免了冲突和潜在的活锁。


http://www.mrgr.cn/news/81661.html

相关文章:

  • 了解jvm -server和-client 参数
  • leetcode 面试经典 150 题:合并两个有序数组
  • MySQL windows解压版的安装与配置方法
  • linux系统编程(五)
  • Harmony 网络请求
  • Webpack学习笔记(6)
  • LeetCode每日一题
  • ROUGE指标介绍
  • 010-spring-后置处理器(重要)
  • uniapp小程序实现弹幕不重叠
  • YOLOv8中间特征层可视化
  • Docker完整技术汇总
  • Windows下C++使用SQLite
  • 计算机网络习题(第1章 概论 第2章 数据通信基础)
  • 音视频入门基础:MPEG2-TS专题(23)——通过FFprobe显示TS流每个packet的信息
  • React 高阶组件(HOC)
  • 贪心算法(常见贪心模型)
  • 设计模式与游戏完美开发(2)
  • MySQL 查询大偏移量(LIMIT)问题分析
  • Go快速开发框架2.6.0版本更新内容快速了解
  • Python的简单爬虫框架
  • 《传染病与人类历史》传染病如何推动人类历史进程
  • 【Spring AI】Spring AI Alibaba的简单使用
  • HTML速查
  • 【QT开发自制小工具】PDF/图片转excel---调用百度OCR API接口
  • 洛谷 P1014:Cantor 表