分布式系统中的两阶段提交协议

分布式系统中的两阶段提交协议

在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事务的ACID特性,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。

因此,二阶段提交的算法思路可以概括为: 参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。

主要用来解决临时性系统故障(进程、网络节点、通信等故障)带来的数据不一致性问题

系统一般包含两类机器(或节点、角色):协议者参与者

协议中假设每个节点都会记录写前日志(write-ahead log),并持久性存储,即使发生故障,日志也不会丢失。

协议同时假设节点不会发生永久性故障,而且任意两个节点之间都可以通信。

当事务最后一步完成之后,协调者执行协议,参与者根据本地事务是否成功完成,向协调者回复同意提交事务或回滚事务。

两个阶段:

阶段1:请求阶段(Commit-Request Phase)

(1)协调者通知所有事务参与者提交或回滚事务,并开始等待各参与者的反馈信息。

(2)参与者执行所有事务操作,并将Undo信息和Redo信息写入日志。

(3)各参与者告知协调者自己的决策:同意提交事务(事务参与者本地作业执行成功)或回滚事务(本地作业执行故障)。

阶段2:提交阶段(Commit Phase)

协调者将第一个阶段的投票结果进行决策:提交或回滚。当且仅当所有参与者同意提交,协调者才通知所有参与者提交事务。

参与者收到协调者发来的消息后执行相应的操作。

协调者如果发现有一个投票是Vote-Abort,那么将创建一个Global-Abort通知所有参与者终止该事务。

如果都是Vote-Commit,那么协调者将发生Global-Commit,告知所有参与者执行该事务。

  

两阶段协议执行过程中,所有参与者都是事务阻塞的。

发布了229 篇原创文章 · 获赞 78 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/IT_flying625/article/details/105646715