上節(jié)知識(shí)準(zhǔn)備:Raft
前面我們聊到單個(gè)集群的一致性算法,今天我們來(lái)聊聊多集群分布式事務(wù)算法:兩階段提交。這個(gè)算法主要保證了事務(wù)的原子性,即各個(gè)集群的操作要全做,要么全不做。
可將多個(gè)集群視為參與者,引入第三方協(xié)調(diào)者,由協(xié)調(diào)者收集各個(gè)參與者對(duì)某個(gè)操作的預(yù)執(zhí)行情況,然后決定要通知各個(gè)參與者 commit 還是 rollback。
所以所謂的兩階段是指準(zhǔn)備階段和執(zhí)行階段,舉個(gè)例子,首先A將成為該活動(dòng)的協(xié)調(diào)者,B、C和D將成為該活動(dòng)的參與者。準(zhǔn)備階段:A發(fā)郵件給B、C和,提出下周三去爬山,問(wèn)是否同意。那么此時(shí)A需要等待B、C和D的回復(fù)。B、C和D分別查看自己的日程安排表。B、C發(fā)現(xiàn)自己在當(dāng)日沒(méi)有活動(dòng)安排,則發(fā)郵件告訴A他們同意下周三去爬長(zhǎng)城。由于某種原因,D白天沒(méi)有查看郵件。那么此時(shí)A、B和C均需要等待。到晚上的時(shí)候,D發(fā)現(xiàn)了A的郵件,然后查看日程安排,發(fā)現(xiàn)下周三當(dāng)天已經(jīng)有別的安排,那么D回復(fù)A說(shuō)活動(dòng)取消吧。此時(shí)A收到了所有活動(dòng)參與者的郵件,并且A發(fā)現(xiàn)D下周三不能去爬山。那么A將發(fā)郵件通知B、C和D,下周三爬長(zhǎng)城活動(dòng)取消。此時(shí)B、C回復(fù)A“太可惜了”,D回復(fù)A“不好意思”。至此該事務(wù)終止。
但是這其中要面臨的故障有:
事務(wù)參與者發(fā)生故障。給每個(gè)事務(wù)設(shè)置一個(gè)超時(shí)時(shí)間,如果某個(gè)事務(wù)參與者一直不響應(yīng),到達(dá)超時(shí)時(shí)間后整個(gè)事務(wù)失敗。
協(xié)調(diào)者發(fā)生故障。協(xié)調(diào)者需要將事務(wù)相關(guān)信息記錄到操作日志并同步到備用協(xié)調(diào)者,假如協(xié)調(diào)者發(fā)生故障,備用協(xié)調(diào)者可以接替它完成后續(xù)的工作。如果沒(méi)有備用協(xié)調(diào)者,協(xié)調(diào)者又發(fā)生了永久性故障,事務(wù)參與者將無(wú)法完成事務(wù)而一直等待下去。