分布式事务2PC协议

什么是2PC

Two-phase Commit protocol
在事务处理,数据库,计算机网络中,两阶段提交(2pc)是一种原子提交协议。它是一种分布式算法,协调参与分布式原子事务的所有进程,决定是提交事务还是中止(回滚)事务(它是一种协商一致性协议)。该协议即使在许多临时系统故障(包括进程、网络节点、通信等故障)的情况下也能达到其目的,因此得到了广泛的应用。然而,它并不是对所有可能的故障配置都具有弹性,并且在极少数情况下,需要手动干预来纠正结果。为了适应从失败中恢复(在大多数情况下是自动恢复),协议的参与者使用协议状态的日志记录。日志记录由协议的恢复过程使用,生成日志记录通常比较慢,但是在失败后仍然存在。存在许多协议变体,它们主要不同于日志记录策略和恢复机制。虽然通常不经常使用,但是恢复过程构成该协议的很大一部分。

在任何单一分布式事务的“正常执行”中(即,当没有发生故障时(这通常是最常见的情况),协议由两个阶段组成:

  • commit-request phase (投票阶段):协调者将通知事务参与者准备提交或取消事务,然后进入表决过程。在表决过程中,参与者将告知协调者自己的决策:同意(事务参与者本地作业执行成功)或取消(本地作业执行故障)。
  • commit phase (提交阶段):协调者根据参与者的投票结果决定是提交(仅当所有参与者都投了“是”票时)还是中止事务,并将结果通知所有参与者。然后,参与者使用本地事务资源(也称为可恢复资源)执行所需的操作(提交或中止)。

假设

协议的工作方式如下:一个节点是指定的协调器(即master),网络中的其他节点被指定为参与者。该协议假设每个节点上都有一个稳定的存储,每个节点都有一个写write-ahead log,没有节点永久崩溃,write-ahead log中的数据不会在崩溃中丢失或损坏,并且任何两个节点都可以彼此通信。最后一个假设不是太严格,因为网络通信通常可以重路由。前两个假设要有力得多;如果一个节点被完全销毁,那么数据就可能丢失。

算法描述

  • Commit request (or voting) phase
    1.协调者向所有参与者发送一个请求提交消息,并等待收到所有参与者的回复。
    2.参与者执行事务,直到要求提交为止。它们分别向undo日志和redo日志写入一个条目。
    3.如果参与者的操作成功,则每个参与者将使用协议消息(参与者投票赞成提交)进行回复;如果参与者经历了将无法提交的失败,则使用中止消息(参与者投票反对,不提交)进行回复。
  • Commit (or completion) phase
    成功:
    如果协调者在提交请求阶段收到来自所有参与者的同意消息,则:
    1.协调者向所有参与者发送提交消息。
    2.每个参与者完成操作,并释放事务期间持有的所有锁和资源。
    3.每个参与者向协调器发送一个确认。
    4.协调者在收到所有确认信息后完成事务。
    失败:
    如果在提交请求阶段有任何参与者投了反对票(或超过了协调者的超时时间没有收到投票),则:
    1.协调者向所有参与者发送回滚消息。
    2.每个参与者使用undo日志撤消事务,并释放事务期间持有的资源和锁。
    3.每个参与者向协调器发送一个确认。
    4.协调器在收到所有确认后撤消事务。

算法通信过程

Message flow

Coordinator                                         Participant
                              QUERY TO COMMIT
                -------------------------------->
                              VOTE YES/NO           prepare*/abort*
                <-------------------------------
commit*/abort*                COMMIT/ROLLBACK
                -------------------------------->
                              ACKNOWLEDGMENT        commit*/abort*
                <--------------------------------  
end

优缺点

优点:原理简单,实现方便
缺点:
(1)同步阻塞
在二阶段提交的过程中,所以参与事务操作的逻辑都处于阻塞状态,即各个参与这在等待其他参与者响应的过程中,将无法进行其他任何操作。
(2)单点问题
如果协调者出现问题整个阶段的提交流程将无法运转,特别是如果协调者在阶段二中出现问题的话,那么其他参与者将会一直处于锁定事务资源的状态中。
(3)数据不一致
在阶段二,当协调者向所以参与者发送commit请求后,发生了局部网络异常或者在尚未发送完commit请求之前自身奔溃了,导致最终只有部分参与者收到了commit请求。于是,收到了commit请求的部分参与者会进行事务提交,二没有收到commit请求的部分参与者一直不进行事务提交,于是整个分布式系统出现了数据不一致的现象。
(4)太过保守
只要有一个参与者出现故障导致协调者没有收到所有参与者的响应,协调者就依靠自身的超时机制来发起中止事务请求。即没有设置较为完善的容错机制,任意一个参与者失败都会导致整个事务的失败。

参考:https://en.wikipedia.org/wiki/Two-phase_commit_protocol

猜你喜欢

转载自blog.csdn.net/weixin_44630798/article/details/88373573