分布式系统设计之共识算法—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) 它的序列号是您同意的最高提案号,则接受它。否则,拒绝它。

  3. 网络异常,图片无法展示
    |

参考文章:

www.the-paper-trail.org/post/2008-1…

www.the-paper-trail.org/post/2008-1…

www.the-paper-trail.org/post/2009-0…

blog.csdn.net/qq_38289815…


相关文章
|
6月前
|
负载均衡 算法 调度
基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)
基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)
277 11
|
6月前
|
算法 安全 Python
【顶级EI复现】分布式电源选址定容的多目标优化算法(Matlab代码实现)
【顶级EI复现】分布式电源选址定容的多目标优化算法(Matlab代码实现)
213 1
|
6月前
|
传感器 机器学习/深度学习 算法
【无人机编队】基于麻雀算法分布式无人机群自适应航迹规划和碰撞检测研究(Matlab代码实现)
【无人机编队】基于麻雀算法分布式无人机群自适应航迹规划和碰撞检测研究(Matlab代码实现)
160 2
|
6月前
|
并行计算 算法 调度
基于串行并行ADMM算法的主从配电网分布式优化控制研究(Matlab代码实现)
基于串行并行ADMM算法的主从配电网分布式优化控制研究(Matlab代码实现)
413 0
|
6月前
|
并行计算 算法 安全
【ADMM、碳排放】基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究【IEEE6节点、IEEE30节点、IEEE118节点】(Matlab代码实现)
【ADMM、碳排放】基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究【IEEE6节点、IEEE30节点、IEEE118节点】(Matlab代码实现)
334 0
|
7月前
|
运维 算法 5G
【优化管理】基于事件触发的弹性分布式能源管理算法研究(Matlab代码实现)
【优化管理】基于事件触发的弹性分布式能源管理算法研究(Matlab代码实现)
159 0
|
10月前
|
NoSQL 算法 安全
分布式锁—1.原理算法和使用建议
本文主要探讨了Redis分布式锁的八大问题,包括非原子操作、忘记释放锁、释放其他线程的锁、加锁失败处理、锁重入问题、锁竞争问题、锁超时失效及主从复制问题,并提供了相应的优化措施。接着分析了Redis的RedLock算法,讨论其优缺点以及分布式专家Martin对其的质疑。此外,文章对比了基于Redis和Zookeeper(zk)的分布式锁实现原理,包括获取与释放锁的具体流程。最后总结了两种分布式锁的适用场景及使用建议,指出Redis分布式锁虽有性能优势但模型不够健壮,而zk分布式锁更稳定但部署成本较高。实际应用中需根据业务需求权衡选择。
|
运维 NoSQL 算法
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
本文深入探讨了基于Redis实现分布式锁时遇到的细节问题及解决方案。首先,针对锁续期问题,提出了通过独立服务、获取锁进程自己续期和异步线程三种方式,并详细介绍了如何利用Lua脚本和守护线程实现自动续期。接着,解决了锁阻塞问题,引入了带超时时间的`tryLock`机制,确保在高并发场景下不会无限等待锁。最后,作为知识扩展,讲解了RedLock算法原理及其在实际业务中的局限性。文章强调,在并发量不高的场景中手写分布式锁可行,但推荐使用更成熟的Redisson框架来实现分布式锁,以保证系统的稳定性和可靠性。
913 0
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
|
存储 人工智能 算法
解锁分布式文件分享的 Java 一致性哈希算法密码
在数字化时代,文件分享成为信息传播与协同办公的关键环节。本文深入探讨基于Java的一致性哈希算法,该算法通过引入虚拟节点和环形哈希空间,解决了传统哈希算法在分布式存储中的“哈希雪崩”问题,确保文件分配稳定高效。文章还展示了Java实现代码,并展望了其在未来文件分享技术中的应用前景,如结合AI优化节点布局和区块链增强数据安全。

热门文章

最新文章