概述
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没有提供完善的容错机制,任何一步失败将会导致整个事务的失败。这样的策略略显保守。
网友评论