在大数据 / 分布式时代, 如何确保数据的一致性 已经成为了 一个不可避免的 讨论话题。
下面我们对 2PC , 3PC , Paxos 协议进行一下了解。
2PC 协议
2PC , Two-Phase-Commit 的缩写,即两阶段提交, 两阶段提交协议被认为是一种一致性协议,用来保证分布式系统的一致性。
阶段一 : 提交事务请求
1.事务查询:
协调者向所有的参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者的响应。
2.执行事务:
各参与者节点执行事务操作,
3.各参与者向协调者反馈事务询问的响应:
阶段二: 执行事务提交
协调者根据各参与者的反馈情况来决定最终是否可以进行事务提交惭怍,正常情况下,包含一下两种可能。
执行事务提交:
假如协调者从所有的参与者获得的反馈都是 Yes , 会执行事务提交。
1.发送提交请求
2.事务提交
3.反馈事务提交结果
4.完成事务
中断事务:
假如任何一个参与者向协调者反馈了No响应,或者在等待超时之后,协调者尚无法接收到所有参与者的反馈响应,那么就会中断事务。
1.发送回滚请求
2.事务回滚
3.反馈事务回滚结果
4.中断事务
2PC 的优缺点
优点:
原理简单,实现方便。
缺点:
同步阻塞,单点问题,脑裂,太过保守。
同步阻塞:
在二阶段提交的执行过程中,所有参与该事务操作的逻辑都处于阻塞状态,也就是说,各个参与者在等待其他参与者响应的过程中,都无法进行其他任何操作。
单点问题:无限等待
一旦协调者出现问题,整个2阶段流程将无法流转,如果阶段二中出现问题,那么其他参与者将会一直处于锁定资源的状态中,而无法完成事务操作。
数据不一致: 脑裂问题
在阶段二时,即执行事务提交的时候,当协调者向所有的参与者 发送 Commit 请求后,发生了局部网络异常 或者是 协调者在尚未发送完 Commit 请求之前 自身发生了崩溃,导致最终只有部分参与者接收到了 Commit 请求。这样就会出现数据不一致现象。
太过保守:
二阶段协议没有设计较为完善的容错机制,任意一个节点的失败都会导致整个事务的失败
3PC 协议
3PC 协议, 即 Three Phase Commit , 是 2PC 的改进版,将 2PC 的提交事务请求 过程一分为二 , 形成了 CanCommit, PreCommit ,do Commit 三个阶段组成的事务处理协议。
阶段一 : CanCommit
1.事务询问
2.各参与者向协调者反馈事务询问的响应。
阶段二 : PreCommit
执行事务预提交
假如协调者从所有的参与者获得的反馈都是 Yes 响应,那么就会执行事务预提交。
1.发送预提交请求
2.事务预提交
3.各参与者向协调者反馈事务执行的响应
中断事务
假如任何一个参与者向协调者反馈了No 响应后,或者在等待超时后,协调者尚无法收到所有参与者的反馈响应,那么就会中断事务。
1.发送中断请求
2.中断事务
阶段三: doCommit
执行提交
1.发送提交请求
2.事务提交
3.反馈事务提交结果
3.完成事务
中断事务
进入这一阶段,假设协调者处于正常工作状态,并且有任意一个参与者向协调者反馈了 No 响应,或者在等待超时之后,协调者尚无法接收到所有参与者的反馈相应,就会中断事务。
1.发送中断请求
2.事务回滚
3.反馈事务回滚结果
4. 中断事务
优缺点 :
相较于二阶段提交协议,三阶段提交协议的最大优点就是降低了参与者的阻塞范围,并且能够在出现单点故障后继续达成一致。
引入新问题:
参与者接收到 preCommit 消息后,如果网络分区,协调者所在节点 与 参与者所在的节点 无法进行正常通信,参与者 仍进行事务的提交,会导致数据的不一致。
Paxos 协议