分布式事务-2PC

一、ACID是事务的基本标准,最终的目的就是一致性和持久性,其中原子性和隔离性只是为了满足前面2条的手段;原子性的基本原则是对数据的操作要么全部生效,要么全部不生效;隔离性至少保证在同一批数据的范围内,操作是互斥或者串行的,也就是对相同数据A来说在事务N没有完成之前事务M是不能操作数据A的,要么事务M失败,要么等待N完成。

二、在分布式场景下要想满足原子性的要求,需要在本地事务的基础上想办法,也就是说分布式事务的原子性=进程内原子性保证+进程之间原子性保证,进程内原子性就不说了,可以参考数据库上Redo和Undo的思路,进程之间的原子性就是保证要么所有的进程全部成功,要么全部失败,隔离性就是保证在某个数据分区上互斥或者串行,所以进程之间最简单的事务实现就是每个机器执行事务,失败的话allrollback,成功的事务完结,这就是经典的2PC协议。

三、2PC协议本身很简单,但是其中发起投票的机器不能是单点所以需要备份双机去解决这个问题。

四、但是一旦进去网络环境就有一个问题,网络的不可靠,一旦机器不可达,你并不知道是不是机器宕掉了还是简单的网络不可达,所以单机要有自恢复能力,也就是说必须记录我执行到哪儿了,一旦网络可达(不管是宕机恢复还是网络恢复),单机首先进入恢复模式,记录住自己的状态,然后向标准主机(master)同步数据,达到统一模式再进去对外提供服务的状态,这就是最原始的分布一致性协议的衍生过程,这个和ZK的ZAB协议思路非常相似。

五、2PC也就是二阶段提交,是分布式事务处理常用的一致性算法,利用该协议非常方便完成各个参与者的协调,统一决定事务的提交和回滚,从而能保证分布式数据的一致性。

六、顾名思义,二阶段提交将事务提交的过程分成2个阶段。

阶段一:提交事务请求阶段

协调者提交事务预执行询问--》参与者事务预执行(取决于本地事务完成,比如将Undo和Redo信息记入事务日志中)--》参与者返回协调者ACK、NO或者超时

阶段二:提交事务执行阶段

当阶段一所有的参与者返回ACK消息,执行事务提交阶段:

协调者提交事务执行--》参与者提交事务本地提交--》参与者返回协调者ACK消息--》事务完成

当阶段一部分参与者返回NO消息或者部分执行超时,执行事务回滚阶段:

协调者提交事务rollback--》参与者提交本地rollback--》参与者返回协调者ACK消息--》事务完成。

七、

2PC优点:简单明了,实现方便。

2PC缺点:

同步阻塞:

2PC最大的一个问题就是同步阻塞,就是在2次阶段组成一个完成的事务,在这个过程中所有的参与者都是阻塞的,其中来看就是大部分时间在等待其他参与者的响应而不是真正进行逻辑计算。

单点问题:

单点问题大问题出在协调者的角色上,当协调者执行本地任务还未来得及发出commit或者rollback或者发出部分命令(只有部分参与者收到commit或者rollback命令),这时候整个2PC阶段就无法运转甚至部分参与者一直锁定,同时也总成数据可能不一致。

太过保守:

当任意一台参与者因为本身的原因失败或者宕机或造成:

1、协调者只能等待超时,没有做到更好的时效。

2、整个事务流程全部失败,这明显和分布式设计的初衷有偏差,分布式本身就是为了综合极速能力并且极佳的水平扩缩性,这个容错设计是非常保守的。

相关推荐