【Java高级工程师蜕变之路】054 分布式一致性协议之两阶段提交协议(2PC)
本文阐述了分布式系统中一些常见的协议以及原理分析。
分布式一致性协议
2022/03/01 校对完成
文章更新历史
2022/03/01 初稿。
两阶段提交协议(2PC)
两阶段提交协议
两阶段提交协议,简称2PC(2 prepare commit),是比较常见的解决分布式事务的方式。要么所有参与进程都提交事务,要么都取消事务,即实现ACID中的原子性(A)的常用手段。
分布式事务:事务提供一种操作本地数据库的不可分割的一系列操作。要么什么都不做,要么做全套(All or Nothing)。
分布式事务是为了操作不同数据库的不可分割的一系列操作。要么什么都不做,要么做全套(All or Nothing)。
2PC执行流程
- 成功提交事务的流程
-
阶段一
-
事务询问
协调者向所有事务参与者发送事务内容,询问是否可以执行事务提交操作,并且开始等待各个参与者的响应
-
执行事务(写本地的undo/redo日志)
-
各个参与者向事务协调者反馈事务询问的响应
-
-
阶段二
-
发送提交请求
协调者向所有参与者发送commit请求
-
事务提交
参与者收到commit请求后,正式执行事务提交操作,完成提交操作后释放整个事务执行期间占用的事务资源
-
反馈事务提交结果
参与者在完成事务提交后,向协调者发送ack消息
-
完成事务
协调者接收到参与者发送的ack消息,完成事务
-
-
中断事务流程
假设任意一个参与者向协调者发送了No响应,或者在等待超时之后,协调者还是无法接收到参与者的响应,那么就会中断事务。
-
阶段一
-
事务询问
协调者向所有事务参与者发送事务内容,询问是否可以执行事务提交操作,并且开始等待各个参与者的响应
-
执行事务(写本地的undo/redo日志)
-
各个参与者向事务协调者反馈事务询问的响应
-
-
阶段二
-
发送回滚请求
协调者向所有参与者发送rollback请求
-
事务回滚
参与者解释道rollback请求之后,利用在阶段一中记录的undo信息,来执行事务回滚操作。并在完成事务回滚之后释放在整个事务执行期间占用的事务资源。
-
反馈事务回滚结果
参与者完成事务回滚之后,向协调者发送ack消息
-
中断事务
协调者接收到所有参与者发送的ack消息之后,完成事务中断
-
2PC优缺点
-
优点
原理简单
-
缺点
-
同步阻塞
在二阶段提交的执行的过程中,所有参与该事务操作的逻辑都处于堵塞状态。
当参与者占用公共资源时,其他参与者一直处于锁定事务资源的状态中,而无法完成事务操作。
-
单点问题
若协调器出现问题,那么整个第二阶段的事务提交将无法运转,若协调者在阶段二出现问题,其他参与者一直处于锁定事务资源的状态中,无法完成事务操作
-
数据不一致
在阶段二中,执行事务提交的的时候,当协调者向所有参与者发送commit请求之后,发生了网络异常,或者,协调者尚未发送commit请求之前发生了崩溃,导致最终只有部分参与者收到了commit请求,就会出现数据不一致的情况
-
太过保守
在进行事务提交询问的过程中,参与者出现故障而导致协调者始终无法获取所有参与者的响应信息的话,此时协调者只能通过自己的超时机制来判断是否需要终止事务。
这样的策略过于保守,既没有完善的容错机制,任意一个节点的失败都会导致整个事务的失败。
-