二阶段提交协议(Two Phase Commitment Protocol)

1、典型的分布式事务实例

跨行转帐问题是一个典型的分布式事务,用户A向B的一个转帐1000,要进行A的余额-1000,B的余额+1000,显然必须保证这两个操做的事务性。
相似的还有,电商系统中,当有用户下单后,除了在订单表插入记,还要在商品表更新库存等,特别是随着微服务架构的流行,分布式事务的场景更变得更广泛。算法

2、什么是二阶段提交协议?

二阶段提交协议(2PC)一般用来保证数据的强一致性,二阶段提交协议(2PC)中存在两种类型的节点:协调节点和数据节点(或称协调者与参与者),数据节点能够说是数据在多个节点的备份,协调节点用户协调管理多个数据节点在事务操做中数据的一致性问题;
2PC(Two Phase Commit)协议一般分为两个阶段进行,提交请求阶段(Commit Request Phase)或称投票阶段(Voting phase)、与提交阶段(Commit Phase);
1.提交请求阶段(Commit Request Phase),协调者发送请求给参与者,通知参与者提交或取消事务,参与者进入投票过程,每一个参与者回复给协调者本身的投票:赞成(事务在本地执行成功)或取消(事务本地执行失败)。
2.提交阶段(Commit Phase),协调者对上一阶段参与者的投票结果进行表决,当全部投票为“赞成”时提交提交事务,否者停止事务,并通知参与者,参与者接到通知后执行相应的操做。
2PC(TWO Phase Commit)假定节点没有崩溃、任意两个节点的网络都是正常连通的、在写日志的过程当中数据不会丢失的前提下。网络

3、两阶段提交协议交互构成描述

两阶段提交协议是协调全部分布式原子事务参与者,并决定提交或取消(回滚)的分布式算法。架构

1.协议参与者分布式

在两阶段提交协议中,系统通常包含两类机器(或节点):一类为协调者(coordinator),一般一个系统中只有一个;另外一类为事务参与者(participants,cohorts或workers),通常包含多个,在数据存储系统中能够理解为数据副本的个数。协议中假设每一个节点都会记录写前日志(write-ahead log)并持久性存储,即便节点发生故障日志也不会丢失。协议中同时假设节点不会发生永久性故障并且任意两个节点均可以互相通讯。微服务

2.两个阶段的执行日志

1.请求阶段(commit-request phase,或称表决阶段,voting phase)
在请求阶段,协调者将通知事务参与者准备提交或取消事务,而后进入表决过程。
在表决过程当中,参与者将告知协调者本身的决策:赞成(事务参与者本地做业执行成功)或取消(本地做业执行故障)。orm

2.提交阶段(commit phase)
在该阶段,协调者将基于第一个阶段的投票结果进行决策:提交或取消。
当且仅当全部的参与者赞成提交事务协调者才通知全部的参与者提交事务,不然协调者将通知全部的参与者取消事务。
参与者在接收到协调者发来的消息后将执行响应的操做。cdn

(3)两阶段提交的缺点blog

1.同步阻塞问题。执行过程当中,全部参与节点都是事务阻塞型的。
当参与者占有公共资源时,其余第三方节点访问公共资源不得不处于阻塞状态。事务

2.单点故障。因为协调者的重要性,一旦协调者发生故障。
参与者会一直阻塞下去。尤为在第二阶段,协调者发生故障,那么全部的参与者还都处于锁定事务资源的状态中,而没法继续完成事务操做。(若是是协调者挂掉,能够从新选举一个协调者,可是没法解决由于协调者宕机致使的参与者处于阻塞状态的问题)

3.数据不一致。在二阶段提交的阶段二中,当协调者向参与者发送commit请求以后,发生了局部网络异常或者在发送commit请求过程当中协调者发生了故障,这回致使只有一部分参与者接受到了commit请求。
而在这部分参与者接到commit请求以后就会执行commit操做。可是其余部分未接到commit请求的机器则没法执行事务提交。因而整个分布式系统便出现了数据部一致性的现象。

(4)两阶段提交没法解决的问题

当协调者出错,同时参与者也出错时,两阶段没法保证事务执行的完整性。
考虑协调者再发出commit消息以后宕机,而惟一接收到这条消息的参与者同时也宕机了。
那么即便协调者经过选举协议产生了新的协调者,这条事务的状态也是不肯定的,没人知道事务是否被已经提交。

相关文章
相关标签/搜索