第8章 二阶段提交

我们之前介绍了如何在一台机器上如何保证原子性和并发,那么如何保证它们在分布式系统上呢?
这里我们可以引入一个事务协调者,让所有的CLIENT先去找TX coordinate


10803273-7ea9777351992113.png
image.png

如果有一台机器完成了,另外一台机器挂了,那么就会造成一台机器提交了,另外一台ROLL BACK 了。这是可能遇到的问题。


10803273-891cc316cc59b155.png
image.png

正确性的保证来源于,如果一个人COMMIT,其他没有人可以ABORT,如果一个人ABORT,其他没有人COMMIT。

如果没有错误,NODE 1 & NODE2 可以COMMIT,必须COMMIT
如果错误发生,尽快找到结果。

下面就开始介绍 2PC(二阶段提交)
阶段1 : 投票
每个PARTICIPANT,表态我是COMMIT还是ABORT,如果表态了,也代表机器准备好了。同时它会把对应的OBJECT锁起来,保证其他TX不会提交。

阶段2:提交
TC (事务协调者)根据所有的情况,会发出COMMIT要求,或者ABORT要求。

下面还是看个转账的例子,做2PC是如何做的?

10803273-1e539a71aec06143.png
image.png

如果是ABORT,就解锁,啥也不做。 如果是COMMIT,就要锁着,把事情做了,再解锁。

这里有个假设,NODE COMMIT一定会成功。TC再做出决定同时就会返回给CLIENT。 这个时间点不用等真的COMMIT。
后面会介绍发生FAILURE怎么做?

10803273-a179e12c79863658.png
image.png

投票如果是YES这件事会被记在硬盘,是不能忘了。这样在CRASH后,可以继续拿着自己的结果取问TC,并且如果TC的决定是COMMIT,它又责任继续完成它。
如果投了NO,就可以自己ABORT掉。

TC 在做出COMMIT的决定前,同样要记录结果,因为TC也会出现FAILURE。如果TC FAILURE,他有些YES没收到,如果TC恢复了,他最保险的做法是ABORT。所以就造成了所有NODE都说YES,结果也有可能是ABORT。因为TC挂之前,没有收到全部的YES,有些回复他未知,所以COMMIT的这个决定没有落库。

扫描二维码关注公众号,回复: 5215670 查看本文章
10803273-4c8e42f480835626.png
image.png

TC会发出一个COMMIT的广播,如果这时有台NODE网络不好,收不到这个广播怎么办?那边的NODE 一定是投了YES才会等TC的消息,这样就可以让NODE 去主动询问TC。

FAILURE 在分布式系统中一般是TIMEOUT,因为你分不清是对方挂了,还是自己挂了,还是网卡了。


10803273-fb1c4e55c6af8985.png
image.png

第一轮的时候 TC 没收到回复怎么办? TC可以直接ABORT 这个TX。 那么CLIENT如果想提交,只能过段时间再试。
如果NODE收不到TC 的COMMIT,(这个是在第二阶段),看下面这个协议。

10803273-0ad5128e364dbe78.png
image.png

NODE 1 可以去问其他NODE. 如果所有其他人都没收到TC的反馈,就要看有没有人说NO,有人说NO,大家都可以ABORT了。如果所有人都说了YES,就只能等了。因为TC的结论也有可能是NO,所以NODE 是没法自己决定的。

10803273-d21ae32e3e0e16f1.png
image.png

2PC 只是FOR COMMIT的阶段的。 之前的操作还是用之前讲的2PL 和 SI 的技术。


10803273-c1b41baa08322f08.png
image.png

2PC最大的问题,一旦网络不稳定,就极容易ABORT,或者有些NODE 挂了,TC就只能一直等,非常不效率。 下一章会讲解一个解决这个问题的协议PAXOS。

猜你喜欢

转载自blog.csdn.net/weixin_34396103/article/details/86892183
今日推荐