根据CAP定理,在对一个分布式系统进行设计时,P(分区容错性)是最基本的要求,所以需要在可用性和数据一致性之间进行反复的权衡,于是产生了一系列的一致性协议。
当一个事务操作需要跨多个分布式节点的时候,为了保持事务处理的ACID特性,就需要引入"协调者"组件来统一调度所有分布式节点的执行逻辑,这些被调度的分布式节点则被称为“参与者”.协调者负责调度参与者的行为,并最终决定这些参与者是否要把事务真正进行提交。
2PC
2PC(Two-Phase Commit),二阶段提交协议,将事务的提交过程分成了两个阶段进行处理,具体过程:
阶段一提交事务请求
协调者组织各参与者对一次事务操作的投票表态过程,因此阶段一又称为"投票阶段",即各参与者投票表明是否要继续执行接下去的事务提交操作。
阶段二执行事务提交
在阶段二中,协调者会根据各参与者反馈情况决定最终是否可以进行事务提交操作,包含两种可能,执行事务提交和中断事务。
当一阶段各参与者执行成功,流程如下:
中断事务流程如下:
优缺点
-
二阶段提交协议的优点:原理简单、实现方便
-
二阶段提交协议的缺点:同步阻塞、单点问题、脑裂、太过保守
- 同步阻塞
在二阶段提交的执行过程中,所有参与该事务操作的逻辑都处在阻塞状态,也就是说,各个参与者在等待其他参与者响应的过程中,将无法进行其他任何操作。 - 单点问题
协调者在整个二阶段提交协议中起到了非常重要的作用,一旦协调者出现问题,整个二阶段提交流程将无法运转,严重的是,如果协调者在阶段二中出现问题,那么其他参与者将会一直处于锁定事务资源的状态,无法继续完成事务操作。 - 数据不一致
在阶段二中,执行事务提交的时候,协调者向所有参与者发送Commit请求之后,发生网络异常,或协调者尚未发送完Commit请求之前自身崩溃,导致最终只有部分参与者收到Commit请求,整个分布式系统出现数据不一致现象。 - 太过保守
协调者向参与者询问事务提交的过程中,参与者出现故障导致协调者无法获取所有参与者的响应信息,这时协调者只能依赖自身的超时机制来中断事务,策略比较保守;也就是说二阶段提交协议未提供完善的容错机制,任意一个阶段出故障都会导致事务的失败。 Paxos算法是一种基于消息传递且又有高度容错特性的一致性算法。
- 同步阻塞
3PC
三阶段提交协议是二阶段的改进版,将第一个阶段"提交事务请求"一分为二,行程了,CanCommit、PreCommit,doCommit三个阶段。
优缺点
相当于二阶段提交协议,三阶段最大的优点就是降低了参与者的阻塞范围,并能够在出现单点故障后继续达成一致。三阶段提交去掉了阻塞,但引入新的问题,如果网络出现分区,协调者无法与所有参与者通信,这种情况下,该参与者依然会进行事务的提交,必然会出现数据的不一致问题。