ITPub博客

首页 > 数据库 > MySQL > 关于2PC(二阶段提交)和3PC(三阶段提交)的理解

关于2PC(二阶段提交)和3PC(三阶段提交)的理解

MySQL 作者:chenfeng 时间:2019-04-09 11:02:02 0 删除 编辑

分布式系统和分布式一致性问题

 

  分布式系统,即运行在多台不同的网络计算机上的软硬件系统,并且仅通过消息传递来进行通信和协调。

  分布式一致性问题,即相互独立的节点之间如何就一项决议达成一致的问题。


2PC(Two-Phase Commit 二阶段提交)



二阶段提交,是指将事务提交分成两个部分:准备阶段和提交阶段。事务的发起者称之为协调者,事务的执行者称为参与者。


阶段一:准备阶段


             由协调者发起并传递带有事务信息的请求给各个参与者,询问是否可以提交事务,并等待返回结果。


             个 参与者执行事务操作,将Undo和Redo放入事务日志中(但是不提交)


              如果参与者执行成功就返回YES(可以提交事务),失败NO(不能提交事务)


阶段二:提交阶段


              此阶段分两种情况:所有参与者均返回YES,有任何一个参与者返回NO


               所有参与者均反馈YES时,即提交事务。


               任何一个参与者反馈NO时,即中断事务。


提交事务:(所有参与者均反馈YES)

  1、协调者向所有参与者发出正式提交事务的请求(即Commit请求)。

  2、参与者执行Commit请求,并释放整个事务期间占用的资源。

  3、各参与者向协调者反馈Ack完成的消息。

  4、协调者收到所有参与者反馈的Ack消息后,即完成事务提交。


中断事务:(任何一个参与者反馈NO)

  1、协调者向所有参与者发出回滚请求(即Rollback请求)。

  2、参与者使用阶段1中的Undo信息执行回滚操作,并释放整个事务期间占用的资源。

  3、各参与者向协调者反馈Ack完成的消息。

  4、协调者收到所有参与者反馈的Ack消息后,即完成事务中断。


2PC的缺陷

 

  1、同步阻塞:最大的问题即同步阻塞,即:所有参与事务的逻辑均处于阻塞状态。

  2、单点:协调者存在单点问题,如果协调者出现故障,参与者将一直处于锁定状态。

  3、脑裂:在阶段2中,如果只有部分参与者接收并执行了Commit请求,会导致节点数据不一致。

 

  由于2PC存在如上同步阻塞、单点、脑裂问题,因此又出现了2PC的改进方案,即3PC。


3PC(Three-Phase Commit 三阶段提交协议)

 

  3PC,三阶段提交协议,是2PC的改进版本,即将事务的提交过程分为CanCommit、PreCommit、do Commit三个阶段来进行处理。


阶段一:CanCommit


             1、协调者向所有参与者发出包含事务内容的CanCommit请求,询问是否可以提交事务,并等待所有参与者答复。


             2、参与者收到CanCommit请求后,如果认为可以执行事务操作,则反馈YES并进入预备状态,否则反馈NO。

阶段二:PreCommit


               此阶段分为两种情况:


                1.所有参与者均受到请求并返回YES。


                2.有任何一个参与者返回NO,或者有任何一个参与者超时,协调者无法收到反馈,则事务中断


事务预提交:(所有参与者均反馈YES时)

  1、协调者向所有参与者发出PreCommit请求,进入准备阶段。

  2、参与者收到PreCommit请求后,执行事务操作,将Undo和Redo信息记入事务日志中(但不提交事务)。

  3、各参与者向协调者反馈Ack响应或No响应,并等待最终指令。

 

中断事务:(任何一个参与者反馈NO,或者等待超时后协调者尚无法收到所有参与者的反馈时)

  1、协调者向所有参与者发出abort请求。

  2、无论收到协调者发出的abort请求,或者在等待协调者请求过程中出现超时,参与者均会中断事务。


阶段3:do Commit


此阶段也存在两种情况:

  1、所有参与者均反馈Ack响应,即执行真正的事务提交。

  2、任何一个参与者反馈NO,或者等待超时后协调者尚无法收到所有参与者的反馈,即中断事务。

 

  提交事务:(所有参与者均反馈Ack响应时)

  1、如果协调者处于工作状态,则向所有参与者发出do Commit请求。

  2、参与者收到do Commit请求后,会正式执行事务提交,并释放整个事务期间占用的资源。

  3、各参与者向协调者反馈Ack完成的消息。

  4、协调者收到所有参与者反馈的Ack消息后,即完成事务提交。

 

  中断事务:(任何一个参与者反馈NO,或者等待超时后协调者尚无法收到所有参与者的反馈时)

  1、如果协调者处于工作状态,向所有参与者发出abort请求。

  2、参与者使用阶段1中的Undo信息执行回滚操作,并释放整个事务期间占用的资源。

  3、各参与者向协调者反馈Ack完成的消息。

  4、协调者收到所有参与者反馈的Ack消息后,即完成事务中断。

 

  注意:进入阶段三后,无论协调者出现问题,或者协调者与参与者网络出现问题,都会导致参与者无法接收到协调者发出的         do Commit请求或abort请求。此时,参与者都会在等待超时之后,继续执行事务提交。


 


3PC的优点和缺陷

 

  优点:降低了阻塞范围,在等待超时后协调者或参与者会中断事务。避免了协调者单点问题,阶段3中协调者出现问题时,参与者会继续提交事务。

 

  缺陷:脑裂问题依然存在,即在参与者收到PreCommit请求后等待最终指令,如果此时协调者无法与参与者正常通信,会导致参与者继续提交事务,造成数据不一致。

 


后记

 

  无论2PC或3PC,均无法彻底解决分布式一致性问题。

  解决一致性问题,唯有Paxos,后续将单独总结。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15498/viewspace-2640723/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
交流MySQL,MongoDB和Redis技术。 微信或QQ:410294

注册时间:2015-12-07

  • 博文量
    733
  • 访问量
    1642445