一致性协议--三阶段提交协议(3PC)

3PC是 Three-Phase Commit的缩写,即阶段提交,是2PC的改进版,将二阶段提交协议的"提交事务请求"过程一分为二,形成了CanCommit、PreCommit、和doCommit三个阶段组成的事务处理协议。

阶段一:CanCommit

    1、事务询问:协调者向所有的参与者发送一个包含事务内容的CanCommit请求,询问是否可以执行事务提交操作,并开始等待各参与者的响应。

    2、各参与者向协调者反馈事务询问的响应:参与者在收到协调者的CanCommit请求后,正常情况下,如果其可以顺利执行事务,就反馈Yes响应,并进入预备状态,否则反馈No响应。

阶段二:PreCommit

正常情况下,包含两种可能:

    执行事务预提交--假如协调者从所有的参与者获得的反馈都是Yes响应,那么就会执行事务预提交。

    1、发送预提交请求:协调者向所有的参与者发出PreCommit请求,并进入Prepared阶段。

    2、事务预提交:参与者接收到PreCommit请求后,会执行事务操作,并将Undo和Redo信息记录到事务日志中。

    3、各参与者向协调者反馈事务询问的响应:如果参与者成功执行了事务操作,那么就会反馈给协调者Ack响应,同时等待最终的指令:提交或终止。

    中断事务--如果有任何一个参与者向协调者反馈了No响应,或者在等待超时之后,协调者仍无法接收到所有参与者的反馈响应,就会中断事务。

    1、发送中断请求:协调者向所有参与者节点发出中断请求。

    2、中断事务:收到协调者的中断请求,或者在等待超时之后,参与者都会中断事务。

阶段三:doCommit

有以下两种可能:

    执行提交:

    1、发送提交请求:协调者从"预提交"状态转换到"提交"状态,并向所有的参与者发送doCommit请求。

    2、事务提交:参与者接收到doCommit请求后,执行事务提交,并在完成之后释放占用的事务资源。

    3、反馈事务提交结果:参与者在完成事务提交后,向协调者发送Ack消息。

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

    中断事务:任意一个参与者向协调者反馈No响应,或在等待超时之后,协调者仍没有收到所有参与者的反馈响应,就中断事务。

    1、发送中断请求:协调者向所有参与者发送中断请求。

    2、事务回滚:参与者收到中断请求后,利用其在阶段二中记录的Undo信息来执行回滚操作,并在完成回滚之后释放占用的事务资源。

    3、反馈事务回滚结果:参与者完成事务回滚之后,向协调者发送Ack消息。

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

问:何为"参与者"?何为"协调者"?它们之间的关系是怎样的?

答:当一个事务操作需要跨越多个分布式节点的时候,为了保持事务的ACID特性,需要引入"协调者"来统一调度所有分布式节点的执行逻辑,这些被调度的分布式节点称为"参与者"。协调者负责调度参与者的行为,并最终决定这些参与者是否要把事务进行真正提交。

优点:相对于二阶段提交协议(2PC),3PC最大的优点是降低了参与者的阻塞范围,并在出现单点故障之后继续达成一致。

缺点:可能会出现数据的不一致性。

你可能感兴趣的:(ZooKeeper)