协调者与参与者
在分布式系统中,每一个机器节点都能知道自己是否完成事务,但是对于其他系统是否完成事务,是没办法感知的,因此需要一个总的,被称为“协调者”的机器来统一调度所有分布式机器节点的执行逻辑。而被调度的分布式机器节点就是“参与者”;
2PC
2PC 中文:二阶段提交,two-phase commit 意思就是在提交分布式事务的时候,把提交过程拆分成两个阶段。
一. 提交事务请求
- 事务询问
协调者向所有参与者发送事务内容,询问是否可以提交事务操作,等待参与者响应,返回是否可以的结果。 - 执行事务
各参与者节点执行事务,将事务写入undo,redo 事务日志中。 - 反馈响应情况
各参与者执行完事务,返回协调者事务是否进入待提交状态。
二. 提交事务执行
- 如果参与者执行完事务后,都没有问题,返回的全部是yes ,成功,那么协调者会向所有参与者发送commit 命令进行提交。参与者接收后,进行事务提交,提交完成后释放事务执行期间占用的资源,然后发送ack 给协调者。协调者接收到后,完成事务。
- 如果参与者有一个返回的是No,或者等待超时,就会向所有参与者发送回滚命令。回滚完成后释放事务执行期间占用的资源,然后发送ack 给协调者。协调者接收到后,事务中断。
总结来说,二阶段提交把事务分为了投票和执行,两个环节。二阶段提交是一个强一致性算法,需要所有参与者都一致成功或者失败。
优点: 实现方便,原理简单
缺点:
- 同步阻塞:协调者需要等待所有参与者返回响应。
- 数据不一致:在二阶段提交的阶段二,协调者发送commit 命令时,如果参与者没有接收到commit 命令或者只有部分接收到commit 命令了,那么就会导致一部分commit 了,一部分不commit。
3)单点问题:协调者是单点,协调者出现问题,就会导致非常严重的后果。
4)太保守:需要全部参与者都提交了事务,才认为事务完成,任意节点失败就全部失败了。