美文网首页
分布式一致性——2PC和3PC

分布式一致性——2PC和3PC

作者: 雁阵惊寒_zhn | 来源:发表于2020-10-12 12:01 被阅读0次

分布式的几个概念

  1. CAP理论:一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)的首字母。
  2. 协调者:在系统中任一时刻只存在一个协调者,事务由协调者发起。
  3. 参与者:同一时刻可以存在多个参与者,接受并且执行协调者发起的事务请求。
  4. 最终解决的问题:最终系统中所有的参加事务的节点状态一致。

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

两阶段提交分为准备阶段提交阶段

准备阶段

  1. 首先协调者向所有的参与者发送将要提交事务的内容,并且询问参与者是否可以提交事务。之后协调者等待参与者答复。
  2. 参与者收到事务内容,将执行事务的操作,并且记入到事务日志中。但是不执行提交操作,这里只是尝试执行出结果,在外部看来这个事务仍旧没有完成。发送给协调者答复。
  3. 如果参与者执行成功,可以完成事务,回复YES,告诉协调者可以提交事务;否则回复NO。

提交阶段

  1. 如果所有参与者都返回YES
  • 协调者向所有的参与者发送提交事务的请求
  • 参与者收到提交事务请求后正式提交之前执行的事务,并且释放整个事务期间占用的资源
  • 参与者同时也会向协调者回复提交完成的消息
  • 协调者收到消息,事务提交完成
  1. 如果有至少一个参与者返回NO(也可设置超时时间,如果在规定时间至少有一个参与者没有回复),事务无法执行
  • 协调者向所有的参与者发送回滚事务的请求
  • 参与者收到回滚事务请求后根据事务日志信息执行回滚操作,并且释放整个事务期间占用的资源
  • 参与者同时也会向协调者回复回滚完成的消息
  • 协调者收到消息,事务中断完成

2PC的缺陷

  1. 参与者阻塞问题:在事务执行时所有的参与者都处于事务的阻塞状态中。因为这个特性也引发了第二个缺陷。
  2. 协调者的单点故障:如果在事务执行中,协调者处于离线状态,所有的参与会一直处于阻塞状态。即使有新的协调者出现也无法解开当前的阻塞状态。
  3. 数据不一致问题:如果协调者在提交阶段发出的提交请求只被部分参与者收到,这将导致系统中的参与者一部分执行了提交,一部分始终不能提交,数据在这些节点中就会存在不一致的问题。

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

三阶段提交3PC是在2PC基础上的改进版本。将2PC的第一阶段准备阶段拆分为两个阶段,与提交阶段组成三阶段。分为CanCommit、PreCommit和DoCommit三个阶段。

CanCommit

  1. 协调者向所有参与者发送将要提交事务的内容,并且询问参与者是否可以提交事务。之后协调者等待参与者答复。
  2. 参与者收到事务内容的CanCommit请求后,如果认为自身可以执行事务,回复YES,否则回复NO。

PreCommit

  1. 如果所有的参与者在CanCommit请求后都回复YES
  • 协调者发送PreCommit请求,进入到准备阶段
  • 参与者收到PreCommit请求后,尝试执行事务操作,并且记入事务日志中。但是不执行提交操作,这里只是尝试执行出结果,在外部看来这个事务仍旧没有完成。发送给协调者答复。
  • 所有参与者执行成功,可以完成事务,回复YES,告诉协调者可以提交事务;否则回复NO。
  1. 如果有至少一个参与者返回NO(也可设置超时时间,如果在规定时间至少有一个参与者没有回复),事务无法执行
  • 协调者向所有的参与者发送Abort请求
  • 参与者收到来自协调者的Abort请求,或者超时未收到协调者的请求,执行事务的中断。

DoCommit

  1. 如果所有的参与者在PreCommit请求后都回复YES
  • 协调者向所有的参与者发送提交DoCommit请求
  • 参与者收到DoCommit请求后,正式提交之前执行的事务,并且释放整个事务期间占用的资源
  • 参与者同时也会向协调者回复DoCommit完成的消息
  • 协调者收到消息,事务提交完成。
  1. 如果有至少一个参与者返回NO(也可设置超时时间,如果在规定时间至少有一个参与者没有回复),事务无法执行
  • 协调者向所有的参与者发送Abort请求
  • 参与者收到Abort请求后,根据事务日志信息执行回滚操作,并且释放整个事务期间占用的资源
  • 参与者同时也会向协调者回复回滚完成的消息
  • 协调者收到消息,事务中断完成。

2PC和3PC的区别

  1. 3PC解决参与者阻塞问题:在DoCommit阶段,如果参与者没有收到协调者的DoCommit请求或者Abort请求时,会在等待超时之后,自动提交。因为经过了前两次请求同意之后进入到的第三阶段,意味着大概率协调者会发送DoCommit请求。换言之,经过前两次请求后,成功提交的几率很大。参与者自动提交不会产生阻塞问题,但实际如果是Abort命令,这样就会与其他参与者状态不一致。
  2. 3PC解决协调者的单点故障:因为在2PC协调者超时机制的基础上,对参与者也增加了超时机制,这样即使协调者处于离线状态,参与者也不会一直处于阻塞状态。
  3. 增加一个阶段,意味着多出一个时间周期用于作为缓冲,在两次CanCommit和PreCommit之后,可以尽最大可能保证提交阶段之前各个参与者的状态是一致的。

3PC在2PC基础上做出改进,可是两者都未能解决数据的不一致问题。这就需要更好的方式实现分布式系统。

相关文章

网友评论

      本文标题:分布式一致性——2PC和3PC

      本文链接:https://www.haomeiwen.com/subject/kmzcpktx.html