前言
在分布式系统设计的过程中,我们需要考虑cap理论的指导思想,如下图所示,P分区容错性,考虑到分布式系统部署在多个结点上,因此分区容错性是分布式系统的最基本要具备的。因此我们只能在一致性和可用性之间作权衡。于是就出现了很多一致性协议。著名的协议有二阶段提交协议,三阶段提交协议和Paxos算法。本文主要介绍二阶段提交协议和三阶段提交协议的理论基础。
基本概念
①二阶段提交。
2pc,是two-phase-commit的缩写,即二阶段提交。二阶段分为提交事务请求、执行事务提交。
②三阶段提交
3pc,是Three-phase-commit的缩写,即三阶段提交。三阶段分为CanCommit、PreCommit、doCommit。
③协调者
统一调度所有分布式节点的执行逻辑的组件叫作协调者。当一个事务操作需要跨越多个分布式节点的时候,为了保持事务处理的ACID特性,就需要引入一个称为“协调者”的组件来统一调度所有分布式节点的执行逻辑。
④参与者
被协调者调度的分布式节点叫作参与者。
2PC
二阶段提交协议,被认为是一致性协议,用来保证分布式系统的数据一致性。二阶段提交协议顾名思义分成了两个阶段:提交事务请求、执行事务提交。
①提交事务请求
(1).事务询问:协调者向所有的参与者发送事务内容,询问是否可于执行事务提交操作,并开始等待各参与者的响应。
(2).执行事务:各参与者结点执行的事务操作,并将Undo和Redo信息记入事务日志中。
(3).各参与者向协调者反馈事务询问的响应:如果参与者成功执行了事务操作,就反馈给协调者YES的响应,表示事务可以执行;如果参与者没有成功执行了事务操作,就反馈给协调者NO的响应,表示事务不可以执行。
②执行事务提交
(1).执行事务提交
假如所有的参与者反馈的响应信息都是YES,则执行事务提交。
(2).中断事务
假如任何一个参与者反馈的信息是NO,或者等待超时之后,还没有收集全所有参与者的反馈信息。就会中断事务。
小结:二阶段提交协议原理简单,实现方便。但是存在同步阻塞,单点问题,脑裂,太过保守。
3PC
三阶段提交协议,是二阶段提交协议的改进版,将提交事务请求的过程一分为二。形成了CanCommit、PreCommit、do Commit三个阶段组成。
①CanCommit
事务询问:协调者向所有的参与者发送一个包含事务内容的canCommit请求,询问是否可以执行事务提交操作,并开始等待各参与者的响应。
各参与者向协调者反馈事务询问的响应:参与者在接收到来自协调者的canCommit请求之后,如果自身认为可以顺利执行的话,反馈YES,并且进入预备状态。否则反馈NO。
②PreCommit
执行事务预提交:如果协调者从所有的参与者获得的反馈都是YES,那么执行事务预提交。
事务中断:假如任何一个参与者反馈的信息是NO,或者等待超时之后,还没有收集全所有参与者的反馈信息。就会中断事务。
③do Commit
执行提交:如果协调者接收到所有的参与者Ack响应,那么把预提交状态置为提交的状态。
中断事务:有任意一个参与者相协调这反馈No响应。那么就会中断事务。
小结:降低参与者的阻塞范围,并且能够在出现单点故障之后继续达成一致。
三阶段在降低了参与者阻塞范围的同时,也引入了新的问题,在参与者接收到preCommit消息后,如果出现网络分区,此时协调者所在的节点和参与者无法进行通信,参与者依然会进行事务提交,这必然会引起数据的不一致性。
2PC和3PC提交协议不能完全的解决一致性的问题,另外一种非常重要的且有效的算法Paxos是具有高度容错的一致性算法。
原文地址:https://www.cnblogs.com/sunshine798798/p/9739291.html