一致性协议之两阶段提交协议(2PC)

概述

2PC是一种一致性协议,我们设计一致性协议是为了保证分布式系统各个节点的数据一致性。目前绝大部分的关系型数据库都是用2PC,统一事务的提交或回滚。

在分布式系统中,每一个节点都能明确的知道自己在进行事务操作中的结果,成功或者失败。却无法直接获取到其他节点的执行情况。
因此一般会引入一个成为“协调者”的组件来统一协调各个分布式节点(参与者)的执行逻辑,并最终决定是否进行事务提交。2PC正是采用该思想来协调分布式系统。

2PC协议详解

2PC,两阶段提交协议。顾名思义,它将事务的提交分为了两个阶段来进行处理。

阶段一:事务请求阶段

1. 事务询问

协调者向所有参与者发送事务内容,询问是否可以进行事务提交操作,并等待参与者的响应。

2. 事务执行

各参与者执行事务,并记录Undo和Redo信息到事务日志中。

3.事务反馈

各参与者向协调者反馈事务执行的结果。事务执行成功则反馈Yes响应,执行失败则反馈No响应。

阶段二:事务提交阶段

在阶段二中,协调者会根据各参与者的反馈来决定是否进行事务提交。

执行事务提交

如果协调者收到各参与者的反馈都是Yes响应,则执行事务提交

1. 发送Commit请求

协调者向所有参与者发出事务Commit请求

2. 执行事务Commit

参与者收到commit请求后,执行事务提交操作。

3. 反馈结果

各参与者完成事务提交之后,向协调者发送Ack响应.

4. 完成事务

协调者收到各参与者的Ack响应后,结束事务。

中断事务

如果任何一个参与者向协调者反馈了No响应,或者协调者等待时间超时之后没有收到所有参与者的反馈响应,那么就会中断事务

1. 发送Rollback请求

协调者向所有参与者发送Rollback请求

2. 执行事务Rollback

参与者收到Rollback请求后,会根据事务日志中的Undo信息执行事务回滚操作。

3. 反馈结果

各参与者完成事务回滚后,向协调者发送Ack响应。

4. 完成事务Rollback

协调者收到所有参与者反馈的Ack响应后,完成事务回滚。

优缺点

优点:协议简单、易于实现

缺点:同步阻塞、单点问题、会出现脑裂、保守

1. 同步阻塞

执行过程每一个步骤,各个参与者都要等待其他参与者执行完成,期间无法进行任何操作。

2.单点问题

协调者挂了,系统就挂了

3.脑裂问题

在阶段二中,当协调者发出commit请求后,由于网络或者其他原因,一部分参与者收到了commit请求,一部分参与者未收到commit请求,则会出现一部分参与者提交了事务,一部分未提交,因此出现各节点数据不一致,造成“脑裂”。

4. 保守

2PC没有提供完善的容错机制,任何一步失败将会导致整个事务的失败。这样的策略略显保守。

你可能感兴趣的:(一致性协议之两阶段提交协议(2PC))