目录
2PC
阶段一:投票流程
阶段二:执行阶段
优点
缺点
3PC
阶段一:CanCommit
阶段二:PreCommit(存在两种可能)
阶段三:doCommit(存在两种可能)
优点
缺点
分布式系统中往往是由分布在不同位置的多台机器组成,如何保证这些机器的数据一致性,成为分布式系统需要解决的问题之一。为了解决这一问题,出现了一大批经典的一致性协议和算法,其中最著名的是二阶段提交(2PC)、三阶段提交(3PC)和Paxos算法。
二阶段提交,在多台机器中选出一个“协调者”的组件来调度所有其他分布式节点(“参与者”)
执行流程:
存在两种可能:
事务提交:如果所有参与者都返回yes,执行事务提交
事务中断:任何一个参与者返回no响应或者超时
原理简单、实现方便
同步阻塞:各参与者在等待其他参与者响应时,处于阻塞状态
单点问题:过度依赖协调者,协调者挂掉,整个流程挂掉
数据不一致(脑裂):协调者给一部分参与者发送提交请求之后挂掉,导致只有部分参与者提交了事务
太过保守:没有较为完善的容错机制,任何一个节点失败都会出现问题
改进了2PC,将2PC拆分,形成了CanCommit、PreCommit和doCommit 三个阶段
执行事务预提交:收到所有yes响应
中断事务:任何一个参与者返回no或者超时
执行提交:收到所有参与者的ack响应
中断事务:任意一个参与者返回no或者超时
注意:一旦进入阶段三,可能存在以下故障:
协调者出现问题
协调者和参与者之间网络故障
这都会导致参与者无法收到协调者的doCommit或者abort请求,这时参与者会在等待超时之后继续进行事务提交
相较于2PC,降低了参与者的阻塞范围,并且能够在出现单点故障后继续达成一致
三阶段提交协议在去除阻塞的同时也引人了新的问题,那就是在参与者接收到preCommit消息后,如果网络出现分区,此时协调者所在的节点和参与者无法进行正常的网络通信,在这种情况下,该参与者依然会进行事务的提交,这必然出现数据的不一致性。