分布式一致性协议
2PC 和 3PC 协议。
2PC - 二阶段提交
2PC,Two-Phase Commit 的缩写,即二阶段提交,是计算机网络尤其是在数据库领域内,为了使分布式下的所有结点在进行事务处理过程中能够保持原子性和一致性的一种算法。通常,二阶段提交协议也被认为是一种一致性协议,用来保证分布式系统的一致性。目前,绝大多数关系型数据库都是采用二阶段提交协议来完成分布式事务处理的,利用该协议能够非常方便地完成所有分布式事务参与者的协调,统一决定事务的提交和回滚,从而能够有效地保证分布式系统的一致性,因此,二阶段提交协议被广泛地应用到许多分布式系统中。
协议说明
顾名思义,二阶段提交协议是将事务的提交过程分成了两个阶段来进行处理,其执行流程如下:
阶段一:提交事务请求
事务询问
协调者向所有参与者发送事务内容,询问是否可以执行事务的提交操作,然后等待所有参与者的响应。
执行事务
各参与者结点执行事务操作,并将 Undo 和 Redo 信息记入事务日志中。
各参与者向协调者反馈事务询问的响应。
如果参与者成功执行了事务操作,那么就反馈给协调者 YES 响应,表示事务可以执行; 如果参与者没有成功执行事务,那么就反馈给协调者 NO 响应,表示事务不可以执行。
上述阶段类似于一个 "投票阶段",即各参与者投票表明是否要继续执行接下来的事务提交操作。
阶段二:执行事务提交
该阶段根据阶段一中各参与者的反馈情况来决定最终是否可以进行事务提交操作,正常情况下,有如下两种可能。
执行事务提交
假如协调者从各参与者那得到的反馈是 YES 响应,那么就会执行事务提交操作。
发送提交请求
协调者向所有参与者节点发出 Commit 请求。
事务提交
参与者接收到 Commit 请求后,会正式执行事务提交操作,并在完成提交之后释放在整个 事务执行期间占用的事务资源。
反馈事务提交结果
参与者在完成事务 Commit 之后,向协调者发送 Ack 消息。
完成事务
协调者在接收到所有参与者节点反馈的 Ack 消息后,完成事务。
中断事务
假如协调者从任意一个参与者那得到了 NO 响应,或者在等待超时之后,协调者尚无法接收到所有 参与者的反馈响应,那么就中断请求。
发送回滚请求
协调者向所有参与者节点发出 Rollback 请求。
事务回滚
参与者接收到 Rollback 请求后,会利用其在阶段一中记录的 Undo 信息来执行事务回滚操作, 并在完成回滚之后释放在整个事务执行期间占用的资源。
反馈事务回滚结果
参与者在完成事务 Rollback 之后,向协调者发送 Ack 消息。
中断事务
协调者在接收到所有参与者节点反馈的 Ack 消息后,完成事务中断。
总结来说,二阶段提交将一个事务的处理过程分为了投票和执行两个阶段,其核心是对每个事务都采用了先尝试后提交的处理方式,因此也可以将二阶段提交看作是一个强一致性算法,下图 1 和图 2 分别展示了二阶段提交过程中"事务提交"和"事务中断"两种场景下的交互流程。
优缺点
二阶段提交协议:
优点:原理简单,实现方便。
缺点:同步阻塞、单点问题、脑裂、太过保守。
同步阻塞
单点问题
数据不一致
太过保守
3PC - 三阶段提交
协议说明
阶段一: CanCommit
事务询问
协调者向所有参与者发送一个包含事务的 canCommit 请求,询问是否可以执行事务提交操作,并开始等待各参与者 的响应。
各参与者向协调者反馈事务询问的响应
各参与者在接收到协调者的 canCommit 请求后,正常情况下,如果其自身认为可以顺利执行事务,那么反馈 YES 响应,并进入预备状态;否则返回 NO 响应。
阶段二: PreCommit
协调者会根据各参与者的响应来决定是否是否可以进行事务的 preCommit 操作,正常情况下,包含两种结果。
执行事务提交
中断事务
阶段三: DoCommit
该阶段进行真正的事务提交,会存在以下两种可能的情况。
执行提交
发送提交请求。
进入这一阶段,假设协调者处于正常工作状态,并且它接收到了所有参与者的 Ack 响应,那么它将从"预提交"状态转换到"提交"状态, 并向所有参与者发送 doCommit 请求。
事务提交。
参与这接收到 doCommit 请求后,会正式执行事务提交操作,并在完成提交之后释放在整个事务执行期间占用的事务资源。
反馈事务提交结果。
参与者在完成事务提交之后,向协调者发送 Ack 消息。
完成事务。
协调者在接收到所有参与者反馈的 Ack 消息后,完成事务。
中断事务
进入这一阶段,假设协调者处于正常工作状态,并且有任意一个参与者向协调者反馈了 NO 响应,或者在等待超时之后,协调者尚无法 接收到所有参与者的反馈响应,那么中断事务。
发送中断请求。
协调者向所有参与者发送 abort 请求。
事务回滚。
参与者接收到 abort 请求后,会利用其在阶段二中记录的 Undo 信息来执行事务回滚操作,并在完成回滚之后释放在整个事务 执行期间占用的资源。
反馈事务回滚结果。
参与者在完成事务回滚之后,向协调者发送 Ack 消息。
中断事务。
协调者在接收到所有参与者反馈的 Ack 消息后,中断事务。
需要注意的是,一旦进入阶段三,可能会存在以下两种故障。
协调者出现问题。
协调者和参与者之间的网络出现故障。
无论出现那种情况,最终都会导致参与者无法及时接收到来自协调者的 doCommit 请求或是 abort 请求,针对这种情况,参与者都会在等待超时之后,继续执行事务提交。
优缺点
三阶段提交协议:
优点:相较于二阶段提交协议,三阶段提交协议最大的优点就是降低了参与者的阻塞范围,并且能够在出现单点故障后,继续达成数据 一致。
缺点:三阶段提交协议在去除阻塞的同时也引入了新的问题,那就是参与者在接收到 preCommit 消息后, 如果网络出现分区 (网络分区指由于网络设备的failure,造成网络分裂为多个独立的组),此时协调者所在的节点和参与者无法进行正常 的网络通信,在这种情况下,该参与者依然后进行事务的提交,这必然会出现数据的不一致。
Last updated