分布式架構(gòu)系列 - 分布式事務(wù) 01(基礎(chǔ)篇)
閱讀全文,約 10?分鐘
這是江帥帥的第027篇文章
1、什么是事務(wù)?
一般的事務(wù),指的是本地事務(wù),單機(jī)上的事務(wù)。事務(wù)提供了一種機(jī)制,能夠?qū)⒁唤M操作放在一個(gè)不可分割的、獨(dú)立的執(zhí)行單元中,其中所有的操作要么被完全執(zhí)行,要么完全失敗。也就是,當(dāng)其中一個(gè)操作執(zhí)行失敗的時(shí)候,都會(huì)讓整個(gè)事務(wù)回滾。
2、什么是全局事務(wù)?
全局事務(wù)是全局事務(wù)管理來(lái)實(shí)現(xiàn)全局管理。
假設(shè)有一個(gè)事務(wù)管理器,多個(gè)資源管理器在工作,事務(wù)管理器主要控制全局事務(wù),管理事務(wù)和協(xié)調(diào)參與的資源,協(xié)同資源的一致提交和回滾等;資源管理器就控制和管理資源。
這里涉及到兩個(gè)協(xié)議:TX 協(xié)議和 XA 協(xié)議。
TX 協(xié)議:應(yīng)用或應(yīng)用服務(wù)器與事務(wù)管理器的接口。
XA 協(xié)議:全局事務(wù)管理器和資源事務(wù)管理器的接口。XA 協(xié)議是 X/Open 組織提出的分布式事務(wù)的規(guī)范,當(dāng)下主流的關(guān)系型數(shù)據(jù)庫(kù)產(chǎn)品都實(shí)現(xiàn)了 XA 接口,它是雙向的系統(tǒng)接口,為事務(wù)管理器和 N 個(gè)資源管理器提供通信橋梁。
在分布式系統(tǒng)中,需要引入一個(gè)單點(diǎn)來(lái)對(duì)兩臺(tái)機(jī)器進(jìn)行協(xié)調(diào),因?yàn)樗鼈儫o(wú)法達(dá)到一致的狀態(tài),也就是 XA 需要引入事務(wù)管理器。這時(shí),全局管理器負(fù)責(zé)管理和協(xié)調(diào)的事務(wù),就能跨越多個(gè)資源和進(jìn)程。
3、什么是事務(wù)的 ACID 特性?
事務(wù)的 ACID 特性,特指本地事務(wù)的特性。分布式事務(wù)是多個(gè)事務(wù)的組合,也基本能滿足 ACID,其中一致性是強(qiáng)一致性,為了保證數(shù)據(jù)一致性或完整性。由于分布式系統(tǒng)規(guī)模不小,也會(huì)越來(lái)越復(fù)雜,當(dāng)需要達(dá)成強(qiáng)一致性將要耗費(fèi)的時(shí)間會(huì)更長(zhǎng)。后來(lái)出現(xiàn)了 BASE 理論,采用最終一致性來(lái)代替強(qiáng)一致性。
另外,隔離性是一種嚴(yán)格意義上的隔離,串行執(zhí)行的多個(gè)事務(wù)互不干擾,能夠保證數(shù)據(jù)的安全性,但性能很低,隔離級(jí)別和數(shù)據(jù)庫(kù)的性能是成反比的。數(shù)據(jù)庫(kù)的隔離級(jí)別有四種:Read uncommitted(讀未提交)、Read committed(讀提交)、Repeatable read(重復(fù)度)、Serializable(序列化)。
原子性(Atomicity):事務(wù)是一個(gè)不能分割的執(zhí)行單元,只有兩種狀態(tài),要么全部執(zhí)行成功,要么全部不執(zhí)行。如果事務(wù)中的出現(xiàn)任何一個(gè)操作失敗,整個(gè)事務(wù)就失敗,將會(huì)被回滾到之前的狀態(tài)。
一致性(Consistency):事務(wù)在操作前到操作后,數(shù)據(jù)的完整性保持一致沒(méi)有被破環(huán)。
隔離性(Isolation):如果系統(tǒng)內(nèi)存在多個(gè)事務(wù),且并發(fā)執(zhí)行,但他們的執(zhí)行是相互獨(dú)立且不會(huì)相互干擾,某個(gè)事務(wù)內(nèi)部的操作和數(shù)據(jù),其他事務(wù)不可干涉。
持久性(Durability):當(dāng)一個(gè)事務(wù)完成后,處理好的結(jié)果也將在數(shù)據(jù)庫(kù)永久保存下來(lái),哪怕系統(tǒng)出現(xiàn)崩潰、宕機(jī),在系統(tǒng)恢復(fù)且能重新被訪問(wèn),一樣能看到事務(wù)提交的結(jié)果。
4、什么是分布式事務(wù)?
簡(jiǎn)單理解,分布式事務(wù)是在分布式系統(tǒng)中的本地事務(wù),指在多節(jié)點(diǎn)、多機(jī)器、多服務(wù)的環(huán)境中涉及的事務(wù)操作。
核心點(diǎn),分布式事務(wù)主要是解決在分布式系統(tǒng)環(huán)境下,組合事務(wù)的一致性問(wèn)題。
目前,主要結(jié)合消息中間件共同處理相關(guān)操作,MQ 能實(shí)現(xiàn)異步通信、解耦和并發(fā)緩沖等問(wèn)題。因?yàn)?MQ 擁有高并發(fā)、高吞吐能力,又能緩沖消息、靈活調(diào)整消息的處理效率,這就可以提升系統(tǒng)的并發(fā)量。
5、如何實(shí)現(xiàn)分布式事務(wù)?
常見(jiàn)實(shí)現(xiàn)方式有遵從 ACID 的強(qiáng)一致性方式和遵從 BASE 理論的最終一致性方式,分別如下:
1)兩階段提交協(xié)議
2)三階段提交協(xié)議
3)基于消息的最終一致性
5.1 兩階段提交
基于 XA 協(xié)議的兩階段提交協(xié)議(Two-phase Commit Protocol, 2PC)方法,主要是 XA 能分離兩部分來(lái)看,全局事務(wù)管理器和資源事務(wù)管理器。它具有能協(xié)調(diào)多個(gè)資源的機(jī)制,在 TM(事務(wù)管理器) 和 RM(資源管理器) 之間采取兩階段提交的方案來(lái)解決一致性問(wèn)題。
TM 充當(dāng)協(xié)調(diào)者,它會(huì)根據(jù)所有參與的 RM 的操作結(jié)果,來(lái)判斷和控制是否需要最終提交。這過(guò)程會(huì)先經(jīng)過(guò)投票,然后提交兩個(gè)階段。
過(guò)程很簡(jiǎn)單,TM 向 RM 發(fā)起準(zhǔn)備操作的請(qǐng)求,然后等 RM 的響應(yīng)。當(dāng) RM 接收到請(qǐng)求之后,會(huì)去執(zhí)行請(qǐng)求中的事務(wù)操作,注意,這里單個(gè) RM 沒(méi)那么快提交,只會(huì)先記錄日志信息,然后發(fā)送 Yes/No 給 TM,表示成功/終止操作指令。當(dāng)所有 RM 都發(fā)送 Yes 的時(shí)候,才進(jìn)入最終提交階段,等提交完成后,整個(gè)事務(wù)就結(jié)束了。

從上圖可以看到,協(xié)調(diào)者下發(fā)請(qǐng)求事務(wù)操作,參與者將操作的結(jié)果返回協(xié)調(diào)者,根據(jù)所有參與者的最終反饋結(jié)果來(lái)判斷是要提交呢?還是回滾呢?
5.2 兩階段提交事務(wù)解決方案的利弊
1)滿足了事務(wù)的 ACID 的特性;
2)在執(zhí)行過(guò)程中,2PC是反伸縮模式的,所有參與的節(jié)點(diǎn)都是事務(wù)阻塞型的,當(dāng)業(yè)務(wù)規(guī)模越來(lái)越大的時(shí)候,局限性會(huì)更明顯。參與者會(huì)一直持有資源直到整個(gè)分布式事務(wù)結(jié)束;
3)容易出現(xiàn)單點(diǎn)故障問(wèn)題,2PC 類似于集中式算法,萬(wàn)一 TM 發(fā)生故障,RM 會(huì)去等 TM 的消息,然后會(huì)導(dǎo)致整個(gè)系統(tǒng)都處于停滯狀態(tài)。
4)還有可能出現(xiàn)數(shù)據(jù)不一致的問(wèn)題,萬(wàn)一網(wǎng)絡(luò)抖動(dòng),網(wǎng)絡(luò)局部異?,F(xiàn)象,就只有部分 RM 接收到提交請(qǐng)求并執(zhí)行操作,其他未接到提交請(qǐng)求的 RM 就不會(huì)執(zhí)行事務(wù)提交操作,很明顯的數(shù)據(jù)不一致問(wèn)題。
5.3 三階段提交
為了解決上面兩階段提交會(huì)遇到的同步阻塞、數(shù)據(jù)不一致問(wèn)題,出現(xiàn)了三階段提交協(xié)議(Three-phase commit protocol, 3PC),是一套改進(jìn)方案,因?yàn)槿A段擁有超時(shí)機(jī)制和多了一個(gè)準(zhǔn)備階段。
超時(shí)機(jī)制很好理解,在 TM 和 RM 之間引入超時(shí)機(jī)制,如果在規(guī)定時(shí)間內(nèi)沒(méi)有收到來(lái)自其他節(jié)點(diǎn)的響應(yīng)信息,那么就會(huì)根據(jù)當(dāng)下的狀態(tài)來(lái)執(zhí)行提交或者回滾操作。
另外多出來(lái)的一個(gè)準(zhǔn)備階段,其實(shí)是 3PC 把 2PC 一分為二,簡(jiǎn)單看就是:可以提交、預(yù)備提交、執(zhí)行提交三個(gè)階段。用這種方式來(lái)保證在最后提交之前,各個(gè) RM 節(jié)點(diǎn)的狀態(tài)都是一致的。
主要來(lái)看下“預(yù)備提交”階段。
分兩種情況,RM 返回的是 Yes,還是 No,然后再?zèng)Q定是否進(jìn)行預(yù)備提交的操作。
如果返回 Yes,那也就是說(shuō)能夠去提交,接著正常的往下走,提交就是了。大致流程是先發(fā)送預(yù)備提交請(qǐng)求,進(jìn)入預(yù)備提交階段;然后執(zhí)行事務(wù)操作,在日志中記錄相關(guān)信息;最后事務(wù)執(zhí)行成功了,得到 ACK 響應(yīng)反饋,開(kāi)始進(jìn)入等待最后的操作指令。
如果返回 No,說(shuō)明沒(méi)戲,直接執(zhí)行中斷事務(wù)的操作。大致流程是先發(fā)送中斷請(qǐng)求;然后中斷事務(wù)操作。
5.4 基于消息的最終一致性
因?yàn)?2PC 和 3PC 都會(huì)去鎖定資源,就會(huì)降低系統(tǒng)性能,而且也沒(méi)解決數(shù)據(jù)不一致的問(wèn)題。
那應(yīng)該怎么辦?回到我們?cè)谏厦娼榻B的“什么是分布式事務(wù)?”,簡(jiǎn)單提過(guò),實(shí)際上需要結(jié)合消息中間件來(lái)共同處理相關(guān)操作,通過(guò)消息、日志等方式異步執(zhí)行,因?yàn)樗鼈兛梢源鎯?chǔ)在本地文件、數(shù)據(jù)庫(kù)或者 MQ 中,加上重試機(jī)制,就是基于分布式消息的最終一致性方式來(lái)實(shí)現(xiàn)分布式事務(wù)解決方案。

在分布式事務(wù)中,只有當(dāng)所有的事務(wù)都成功了,整個(gè)業(yè)務(wù)流程才能跑通,分布式事務(wù)的一致性是實(shí)現(xiàn)分布式事務(wù)的關(guān)鍵點(diǎn)。

公眾號(hào):江帥帥(ID:NXJSS666)
CSDN 博客:江帥帥

