前言
在分布式系统架构日益普及的今天,数据一致性问题成为了后端开发必须面对的挑战。当业务需要跨越多个数据库或服务时,如何保证数据的强一致性成为了一个核心问题。两阶段提交(2PC)和三阶段提交(3PC)作为经典的分布式事务协议,那么今天阿亮就来带同学们学习一下分布式强一致性方案–2PC、3PC。
一、强一致性是什么?
大家是否知道CAP呢,所谓的C就是指我们的Consistency,也就是一致性,特指的就是强一致性。
强一致性(Strong Consistency)是指在分布式系统中,任何时刻所有节点看到的数据都是相同的。当一个写操作完成后,后续的读操作都能立即读取到最新的数据值。这种一致性模型对于金融交易、订单处理等对数据准确性要求极高的场景至关重要。
那么在分布式盛行的现在,强一致性如何保证呢,主要的核心理论就是通过2PC、3PC来实现分布式系统的强一致性。
二、2PC
2.1 基本理论
两阶段提交协议(Two-Phase Commit Protocol,2PC)是一种分布式协调协议,常用于分布式事务处理,确保所有参与者要么全部完成事务,要么全部不完成。2PC的核心思想是将事务提交过程拆分为两个阶段:准备阶段和提交阶段。
2.2 协议流程
2PC协议涉及一个协调者(Coordinator)和多个参与者(Participants):
阶段一:准备阶段(Prepare Phase)
阶段二:提交阶段(Commit Phase)
- 如果所有参与者都同意:
- 协调者发送提交请求
- 各参与者正式提交事务
- 参与者向协调者发送确认
- 协调者收到所有确认后完成事务
- 如果有任何参与者拒绝:
- 协调者发送回滚请求
- 各参与者执行回滚操作
- 参与者向协调者发送确认
- 协调者收到所有确认后取消事务
2.3 优缺点分析
优点:
- 协议概念清晰,流程简单易理解
- 能够保证强一致性,所有节点数据状态完全一致
- 实现相对简单,许多分布式关系型数据管理系统采用此协议来完成分布式事务
缺点:
- 同步阻塞问题:在提交阶段,所有参与者都处于阻塞状态,等待协调者指令
- 单点故障:协调者出现故障,整个系统将无法继续执行
- 数据不一致风险:在网络分区的情况下,可能导致部分节点提交,部分节点回滚
- 性能瓶颈:需要多次网络通信,增加了事务响应时间
三、3PC
3.1 基本理论
三阶段提交协议(Three-Phase Commit,3PC)是在两阶段提交协议(2PC)的基础上发展而来的,用于解决2PC的一些问题,特别是协调者崩溃时可能导致的阻塞问题。3PC的核心改进是将2PC的"提交事务请求"过程一分为二,形成了三个阶段:CanCommit、PreCommit和DoCommit。
3.2 协议流程
阶段一:CanCommit阶段
阶段二:PreCommit阶段
- 如果所有参与者回复Yes:
- 协调者发送PreCommit请求
- 参与者执行事务操作,记录Undo和Redo日志
- 参与者向协调者回复准备就绪
- 如果有任何参与者回复No:
- 协调者发送abort请求
- 事务终止
阶段三:DoCommit阶段
- 如果协调者收到所有参与者的准备就绪回复:
- 协调者发送DoCommit请求
- 参与者正式提交事务
- 参与者发送确认
- 事务完成
- 如果协调者未收到所有回复(超时):
- 协调者发送abort请求
- 事务回滚
3.3 优缺点分析
优点:
- 非阻塞特性:Unlike the two-phase commit protocol (2PC), 3PC is non-blocking. 8
- 故障恢复能力强:当协调者故障时,参与者可以根据超时机制自动决策
- 减少了阻塞时间:通过引入超时机制,避免了长时间的资源锁定
- 提高了系统可用性:3PC places an upper bound on the amount of time required before a transaction. 8
缺点:
- 协议复杂度增加:相比2PC,实现更加复杂
- 仍然无法完全避免不一致:在网络分区严重的情况下,仍可能出现数据不一致
- 性能开销更大:增加了额外的通信阶段,事务延迟更高
- 应用场景有限:由于复杂性,在实际生产环境中应用不如2PC广泛
四、使用场景
2PC适用场景:
- 传统银行系统中的跨行转账
- 企业级应用中的分布式数据库事务
- 网络环境稳定、对性能要求较高的场景
- 需要强一致性的核心业务系统
3PC适用场景:
- 跨地域分布的微服务架构
- 网络不稳定的移动应用场景
- 对系统可用性要求极高的场景
- 能够容忍较高事务延迟的业务
五、其他方案
这些都是最终一致性的,不是强一致性的方案,但是换取来更大的可用性,也就是AP
1. TCC(Try-Confirm-Cancel)
- 采用补偿机制,将事务拆分为三个阶段
- 适合高并发场景,性能优于2PC
2. Saga模式
- 长事务解决方案,通过事件驱动实现最终一致性
- 适用于业务流程较长的场景
3. 基于消息的最终一致性
- 通过消息队列实现异步事务处理
- 牺牲强一致性换取高可用性和性能
总结
分布式一致性问题是设计系统时必须考虑的问题,通过各种方案和场景,选取合适的,是最适合的,面试中也经常会问到这些问题。


