一致性协议
一致性协议
为了解决分布式一致性问题,出现了一些一致性协议和算法,二阶段提交协议、三阶段提交协议和Paxos算法。
1 2PC与3PC
分布式系统中,每个机器节点都能明确知道自己在执行事务操作过程中的结果是成功还是失败,但无法知道其他节点的结果。当一个事务操作需要跨越多个节点的时候,为了保证事务处理的ACID特性。引入一个成为 “协调者”的组件来统一调度所有分布式节点的执行逻辑,被调度的节点称为参与者。协调者负责调度参与者的行为,并最终决定这些参与者是否把事务真正执行完毕。衍生出二阶段提交和三阶段提交两种协议。
1.1 2PC 二阶段提交协议
绝大多数关系型数据库都是采用二阶段提交协议来完成分布式事务处理的。
阶段一:提交事务请求 投票阶段
- 事务询问:协调者向所有参者发送事务内容,询问是否可以执行事务提交操作,并开始等待各位参与者响应。
- 执行事务:各参与者节点执行事务操作,并将Undo和Redo信息记录入事务日志中。
- 参与者向协调者反馈事务询问的响应:参与者执行了事务操作,响应Yes,表示事务可以执行,相反No则不可以执行。
阶段二:执行事务提交
- 执行提交事务:所有参与者都反馈Yes,则执行事务提交。
- 发送提交请求:协调者向所有参与节点发出Commit请求。
- 事务提交:接受到Commit请求后,正式执行事务提交操作,完成提交后,释放执行事务期间占用的资源。
- 反馈事务提交结果:参与者完成事务提交后,向协调者发送Ack消息。
- 完成事务。协调者接受参与者的Ack消息,完成事务。
- 中断事务:任何一个参与者反馈No响应,或者等待超时。就会中断事务。
- 发送回滚请求。协调者向发送者发出RollBack请求。
- 事务回滚。参与者利用记录的Undo信息执行事务回滚操作,完成后释放资源。
- 反馈事务回滚结果。事务回滚后,向协调者发送Ack消息。
- 事务中断。协调者接受Ack消息 ,完成事务中断。
优点:原理简单,实现方便。
缺点:同步堵塞,单点问题,脑裂,太过保守。
- 同步堵塞:二阶段,参与者在等待其他参与者响应的过程,无法进行其他操作。
- 单点问题:协调者在提交协议中太过重要,一旦出问题,将无法运转,参与者将一直处于锁定资源的状态中,无法继续完成事务操作。
- 数据不一致性:参与者因脑裂部分收到Commit请求,部分没有收到,导致数据不一致。
- 太过保守:超时只能中断,没有容错机制。
1.2 3PC 三阶段提交协议 2PC的改进版
阶段一:CanCommit
事务询问
各参与者向协调者反馈事务询问的响应。
阶段二:PreCommit
协调者根据参与者反馈的情况来决定是否执行事务的PreCommit操作
- 执行事务预提交:参与者反馈都是Yes响应,执行事务预提交
- 发送预提交请求:发送preCommit请求,进入Prepared阶段。
- 事务预提交:参与者接收preCommit请求,执行操作,记录Undo和Redo信息记录日志中。
- 各参与者向协调者反馈事务执行的响应:成功执行事务,反馈给协调者Ack响应,同时等待指令:commit 或 中止 abort
- 中断事务:任何一个参与者反馈No,或等待超时,就会中断事务
- 发送中断请求。 abort请求
- 中断事务。
阶段三:DoCommit
该阶段将真正提交事务,两种情况:
执行提交
- 发送提交请求。发送doCommit请求
- 事务提交。执行提交操作,释放资源。
- 反馈事务提交结果。向协调者发送Ack消息。
- 完成事务,反馈Ack消息,完成事务。
中断事务
- 发送中断请求,发送abort请求
- 事务回滚。通过Undo信息来执行回滚操作,并释放资源。
- 反馈事务回滚结果。 发送Ack消息
- 中断事务。
在3PC可能出现的故障:协调者出现问题;网络出现故障。
较2PC,3PC能够降低参与者的阻塞范围,能够在出现单点故障后继续达成一致。
3PC在参与者接收到PreCommit消息后,如果网络分区,协调者和参与者无法网络通信。参与者依然进行实物提交,必然造成数据不一致性。