分布式的几个概念
- CAP理论:一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)的首字母。
- 协调者:在系统中任一时刻只存在一个协调者,事务由协调者发起。
- 参与者:同一时刻可以存在多个参与者,接受并且执行协调者发起的事务请求。
- 最终解决的问题:最终系统中所有的参加事务的节点状态一致。
两阶段提交2PC(Two-Phase Commit)
两阶段提交分为准备阶段和提交阶段。
准备阶段
- 首先协调者向所有的参与者发送将要提交事务的内容,并且询问参与者是否可以提交事务。之后协调者等待参与者答复。
- 参与者收到事务内容,将执行事务的操作,并且记入到事务日志中。但是不执行提交操作,这里只是尝试执行出结果,在外部看来这个事务仍旧没有完成。发送给协调者答复。
- 如果参与者执行成功,可以完成事务,回复YES,告诉协调者可以提交事务;否则回复NO。
提交阶段
- 如果所有参与者都返回YES
- 协调者向所有的参与者发送提交事务的请求
- 参与者收到提交事务请求后正式提交之前执行的事务,并且释放整个事务期间占用的资源
- 参与者同时也会向协调者回复提交完成的消息
- 协调者收到消息,事务提交完成。
- 如果有至少一个参与者返回NO(也可设置超时时间,如果在规定时间至少有一个参与者没有回复),事务无法执行
- 协调者向所有的参与者发送回滚事务的请求
- 参与者收到回滚事务请求后根据事务日志信息执行回滚操作,并且释放整个事务期间占用的资源
- 参与者同时也会向协调者回复回滚完成的消息
- 协调者收到消息,事务中断完成。
2PC的缺陷
- 参与者阻塞问题:在事务执行时所有的参与者都处于事务的阻塞状态中。因为这个特性也引发了第二个缺陷。
- 协调者的单点故障:如果在事务执行中,协调者处于离线状态,所有的参与会一直处于阻塞状态。即使有新的协调者出现也无法解开当前的阻塞状态。
- 数据不一致问题:如果协调者在提交阶段发出的提交请求只被部分参与者收到,这将导致系统中的参与者一部分执行了提交,一部分始终不能提交,数据在这些节点中就会存在不一致的问题。
三阶段提交3PC(Three-Phase Commit)
三阶段提交3PC是在2PC基础上的改进版本。将2PC的第一阶段准备阶段拆分为两个阶段,与提交阶段组成三阶段。分为CanCommit、PreCommit和DoCommit三个阶段。
CanCommit
- 协调者向所有参与者发送将要提交事务的内容,并且询问参与者是否可以提交事务。之后协调者等待参与者答复。
- 参与者收到事务内容的CanCommit请求后,如果认为自身可以执行事务,回复YES,否则回复NO。
PreCommit
- 如果所有的参与者在CanCommit请求后都回复YES
- 协调者发送PreCommit请求,进入到准备阶段
- 参与者收到PreCommit请求后,尝试执行事务操作,并且记入事务日志中。但是不执行提交操作,这里只是尝试执行出结果,在外部看来这个事务仍旧没有完成。发送给协调者答复。
- 所有参与者执行成功,可以完成事务,回复YES,告诉协调者可以提交事务;否则回复NO。
- 如果有至少一个参与者返回NO(也可设置超时时间,如果在规定时间至少有一个参与者没有回复),事务无法执行
- 协调者向所有的参与者发送Abort请求
- 参与者收到来自协调者的Abort请求,或者超时未收到协调者的请求,执行事务的中断。
DoCommit
- 如果所有的参与者在PreCommit请求后都回复YES
- 协调者向所有的参与者发送提交DoCommit请求
- 参与者收到DoCommit请求后,正式提交之前执行的事务,并且释放整个事务期间占用的资源
- 参与者同时也会向协调者回复DoCommit完成的消息
- 协调者收到消息,事务提交完成。
- 如果有至少一个参与者返回NO(也可设置超时时间,如果在规定时间至少有一个参与者没有回复),事务无法执行
- 协调者向所有的参与者发送Abort请求
- 参与者收到Abort请求后,根据事务日志信息执行回滚操作,并且释放整个事务期间占用的资源
- 参与者同时也会向协调者回复回滚完成的消息
- 协调者收到消息,事务中断完成。
2PC和3PC的区别
- 3PC解决参与者阻塞问题:在DoCommit阶段,如果参与者没有收到协调者的DoCommit请求或者Abort请求时,会在等待超时之后,自动提交。因为经过了前两次请求同意之后进入到的第三阶段,意味着大概率协调者会发送DoCommit请求。换言之,经过前两次请求后,成功提交的几率很大。参与者自动提交不会产生阻塞问题,但实际如果是Abort命令,这样就会与其他参与者状态不一致。
- 3PC解决协调者的单点故障:因为在2PC协调者超时机制的基础上,对参与者也增加了超时机制,这样即使协调者处于离线状态,参与者也不会一直处于阻塞状态。
- 增加一个阶段,意味着多出一个时间周期用于作为缓冲,在两次CanCommit和PreCommit之后,可以尽最大可能保证提交阶段之前各个参与者的状态是一致的。
3PC在2PC基础上做出改进,可是两者都未能解决数据的不一致问题。这就需要更好的方式实现分布式系统。












网友评论