分布式系统设计之共识算法—2PC、3PC、 Paxos

简介: 分布式系统设计之共识算法—2PC、3PC、 Paxos

分布式共识协议有什么作用?

共识问题分布式计算中最基本的概念之一,是让分布式系统中的一组节点就某事达成一致的问题的一个价值、一个行动方案或一个决定。达成共识允许分布式系统充当单个实体,每个单独的节点都知道并同意整个网络的行为。

例如,共识的一些可能用途是:

  • 分布式事务处理
  • 分布式不同节点间同步时钟
  • 决定分布式算法的下一阶段(这是著名的复制状态机方法)
  • 选举一个领导节点来协调一些更高级别的协议

Google Chubby Service的发明者 Mike Burrows 说“只有一种共识协议,那就是 Paxos”

1 两阶段提交(2PC)协议

1.1 概念

两阶段提交又称 2PC,是一个非常经典的 强一致、中心化的原子提交协议。两阶段提交协议经常用来实现分布式事务,在两阶段协议中,系统一般包含两类节点:一类是 协调者,通常一个系统中只有一个;另一类是事务的 参与者,一般包含多个,在提交过程中任何节点都能当做协调者发起2PC,不必特别选举。

1.2 具体流程

2PC协议的两个步骤

  1. 请求(投票)阶段:联系每一位参与者,提出价值并收集他们的回应。
  2. 提交阶段:如果每个人都同意,请再次联系每个参与者,让他们知道。否则,请联系每个参与者以中止共识。
1.3 问题
  • 性能问题
    无论是在第一阶段的过程中,还是在第二阶段,所有的参与者资源和协调者资源都是被锁住的,只有当所有节点准备完毕,事务 协调者 才会通知进行全局提交,参与者 进行本地事务提交后才会释放资源。这样的过程会比较漫长,对性能影响比较大。
  • 单节点故障
    由于 协调者 的重要性,一旦 协调者 发生故障。参与者 会一直阻塞下去。尤其在第二阶段,协调者 发生故障,那么所有的 参与者 还都处于锁定事务资源的状态中,而无法继续完成事务操作。

2 三阶段提交(3PC)协议

2.1 概念

3PC是2PC的改进版本。3PC主要是为了解决两阶段提交协议的阻塞问题,2PC 存在的问题是当协作者崩溃时,参与者不能做出最后的选择。因此参与者可能在协作者恢复之前保持阻塞。改进措施:

(1) 引入超时机制,同时在 协调者 和 参与者中都引入超时机制。

(2) 在 2PC 的第二阶段中插入一个准备阶段,保证了在最后提交阶段之前各参与节点的状态是一致的。

也就是说,除了引入超时机制之外,3PC 把 2PC 的准备阶段再次一分为二,这样三阶段提交就有 CanCommit、PreCommit、DoCommit 三个阶段。

2.2 具体步骤

将 2PC 的第二阶段——“提交”——分成两个子阶段。第一个是“准备提交”阶段。当协调者在第一阶段收到一致的“是”票时,它会将此消息发送给所有副本。收到此消息后,副本进入一种能够提交事务的状态 - 通过获取必要的锁等 - 但至关重要的是,它们不会做任何他们以后无法撤消的工作。然后他们回复协调员,告诉它“准备提交”消息已收到。

2.3 问题
  • 依然没有完全解决数据不一致的问题

3 Paxos协议

Paxos 起来很像 2PC。提议者向接受者发送“准备”请求。当接受者表示同意接受提案时,提议者向接受者发送提交请求。最后,接受者回复提供者,表明提交请求成功或失败。一旦足够多的接受者提交了价值并通知了提议者,协议就会终止。

Paxos 为 2PC 添加了两个重要的机制。

  • 对请求进行排序,以便确定应该接受两个提案中的哪一个。
  • 当大多数接受者表示他们已经决定时,考虑接受一个提案。这与 2PC 不同,后者只有在每个接受者都同意的情况下才会接受提案。这导致了 2PC 的阻塞特性,其中单个故障节点可能导致协议永远不会终止,而提议者等待永远不会到来的回复。相反,在 Paxos 中,近一半的节点可能无法回复,协议仍将正确继续。

Paxos中两个重要的角色:

提议者:

  1. 向大多数接受者提交编号为n 的请求。等待大多数接受者回复。
  2. 如果多数人回复“同意”,他们还将发回他们已经接受的任何提案的价值。选择其中一个值,并发送带有提案编号和值的“提交”消息。如果尚未接受任何值,请使用您自己的值。相反,如果多数人回复“拒绝”,或未能回复,则放弃提案并重新开始。
  3. 如果大多数人使用“已接受”消息回复您的提交请求,则认为协议已终止。否则,放弃提案并重新开始。

接受者:

  1. 收到提案后,将其编号与您已经同意的编号最高的提案进行比较。如果新提案更高,请回复“同意”您已接受的任何提案的价值。如果它较低,则回复“拒绝”,以及最高提案的序列号。
  2. 当收到“提交”消息时,如果 a) 值与任何先前接受的提案相同并且 b) 它的序列号是您同意的最高提案号,则接受它。否则,拒绝它。

参考文章:

https://www.the-paper-trail.org/post/2008-11-27-consensus-protocols-two-phase-commit/

https://www.the-paper-trail.org/post/2008-11-29-consensus-protocols-three-phase-commit/

https://www.the-paper-trail.org/post/2009-02-03-consensus-protocols-paxos/

https://blog.csdn.net/qq_38289815/article/details/108714855

相关文章
|
7月前
|
负载均衡 算法 调度
基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)
基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)
303 11
|
7月前
|
传感器 机器学习/深度学习 算法
【无人机编队】基于麻雀算法分布式无人机群自适应航迹规划和碰撞检测研究(Matlab代码实现)
【无人机编队】基于麻雀算法分布式无人机群自适应航迹规划和碰撞检测研究(Matlab代码实现)
172 2
|
7月前
|
并行计算 算法 调度
基于串行并行ADMM算法的主从配电网分布式优化控制研究(Matlab代码实现)
基于串行并行ADMM算法的主从配电网分布式优化控制研究(Matlab代码实现)
474 0
|
算法 关系型数据库 MySQL
分布式唯一ID生成:深入理解Snowflake算法在Go中的实现
在分布式系统中,确保每个节点生成的 ID 唯一且高效至关重要。Snowflake 算法由 Twitter 开发,通过 64 位 long 型数字生成全局唯一 ID,包括 1 位标识位、41 位时间戳、10 位机器 ID 和 12 位序列号。该算法具备全局唯一性、递增性、高可用性和高性能,适用于高并发场景,如电商促销时的大量订单生成。本文介绍了使用 Go 语言的 `bwmarrin/snowflake` 和 `sony/sonyflake` 库实现 Snowflake 算法的方法。
999 1
分布式唯一ID生成:深入理解Snowflake算法在Go中的实现
|
存储 算法 安全
分布式系统架构1:共识算法Paxos
本文介绍了分布式系统中实现数据一致性的重要算法——Paxos及其改进版Multi Paxos。Paxos算法由Leslie Lamport提出,旨在解决分布式环境下的共识问题,通过提案节点、决策节点和记录节点的协作,确保数据在多台机器间的一致性和可用性。Multi Paxos通过引入主节点选举机制,优化了基本Paxos的效率,减少了网络通信次数,提高了系统的性能和可靠性。文中还简要讨论了数据复制的安全性和一致性保障措施。
920 1
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
8月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
552 2
|
8月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
603 6
|
9月前
|
存储 缓存 NoSQL
Redis核心数据结构与分布式锁实现详解
Redis 是高性能键值数据库,支持多种数据结构,如字符串、列表、集合、哈希、有序集合等,广泛用于缓存、消息队列和实时数据处理。本文详解其核心数据结构及分布式锁实现,帮助开发者提升系统性能与并发控制能力。
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
1560 0
分布式爬虫框架Scrapy-Redis实战指南
下一篇
开通oss服务