1 基礎(chǔ)概念
什么是事務(wù)?舉個生活的例子 :你去小賣部買東西,“一手交錢,一手交貨“就是一個事務(wù)的例子,交錢和交貨必須全部成功,事務(wù)才算成功,任一個活動失敗,事務(wù)將撤銷所有已成功的活動。 明白上述例子,再來看事務(wù)的定義 : 事務(wù)可以看做是一次大的活動,它由不同的小活動組成,這些活動要么全部成功,要么全部失敗。
在計算機系統(tǒng)中,更多的是通過關(guān)系型數(shù)據(jù)庫來控制事務(wù),這里利用數(shù)據(jù)庫本身的事務(wù)特性來實現(xiàn)的,因此叫數(shù)據(jù)庫事務(wù),由于應(yīng)用主要靠關(guān)系數(shù)據(jù)庫來控制事務(wù),而數(shù)據(jù)庫通常和應(yīng)用在同一個服務(wù)器,所以基于關(guān)系型數(shù)據(jù)庫的事務(wù)又被稱為本地事務(wù)。 回顧一下數(shù)據(jù)庫事務(wù)的四大特性ACID: A(Atomic):原子性,構(gòu)成事務(wù)的所有操作,要么都執(zhí)行完成,要么全部不執(zhí)行,不可能出現(xiàn)部分成功部分失敗的情況。 C(Consistency):一致性,在事務(wù)執(zhí)行前后,數(shù)據(jù)庫的一致性約束沒有被破壞。比如 :張三向李四轉(zhuǎn)100元,轉(zhuǎn)賬前和轉(zhuǎn)賬后的數(shù)據(jù)是正確狀態(tài)這叫一致性,如果出現(xiàn)張三轉(zhuǎn)出100元,李四賬戶沒有增加100元這就出現(xiàn)來數(shù)據(jù)錯誤,就沒有達到一致性。 I(Isolation):隔離性,數(shù)據(jù)庫中的事務(wù)一般都是并發(fā)的,隔離性是指并發(fā)的兩個事務(wù)的執(zhí)行互不干擾,一個事務(wù)不能看到其他事務(wù)運行過程的中間狀態(tài)。通過配置事務(wù)隔離級別可以避免贓讀、重復(fù)讀等問題。 D(Durability):持久性,事務(wù)完成之后,該事務(wù)對數(shù)據(jù)的更改會被持久化到數(shù)據(jù)庫,且不會被回滾。 數(shù)據(jù)庫事務(wù)在實現(xiàn)時會將一次事務(wù)涉及的操作全部納入到一個不可分割的執(zhí)行單元,該執(zhí)行單元中的所有操作要么都成功,要么都失敗,只要其中任一操作執(zhí)行失敗,都將導(dǎo)致整個事務(wù)的回滾。
隨著互聯(lián)網(wǎng)的快速發(fā)展,軟件系統(tǒng)由原來的單體應(yīng)用轉(zhuǎn)變?yōu)榉植际綉?yīng)用,下圖描述來單體應(yīng)用向微服務(wù)的演變:
 分布式系統(tǒng)會把一個應(yīng)用系統(tǒng)拆分為可獨立部署的多個服務(wù),因此需要服務(wù)與服務(wù)之間遠程協(xié)作才能完成事務(wù)操作,這種分布式系統(tǒng)環(huán)境下由不同的服務(wù)之間通過網(wǎng)絡(luò)遠程協(xié)作完成事務(wù)稱之為分布式事務(wù),例如用戶注冊送積分事務(wù)、創(chuàng)建訂單減庫存事務(wù),銀行轉(zhuǎn)賬事務(wù)等都是分布式事務(wù)。 我們知道本地事務(wù)依賴數(shù)據(jù)庫本身提供的事務(wù)特性來實現(xiàn),因此以下邏輯可以控制本地事務(wù) :
可以設(shè)想,當遠程調(diào)用讓李四增加金額成功來,由于網(wǎng)絡(luò)問題遠程調(diào)用并沒有返回,此時本地事務(wù)提交失敗的回滾來張三減少金額的操作,此時張三和李四的數(shù)據(jù)就不一致了。 因此在分布式架構(gòu)的基礎(chǔ)上,傳統(tǒng)數(shù)據(jù)庫事務(wù)就無法使用了,張三和李四的賬戶不在一個數(shù)據(jù)庫中甚至不在一個應(yīng)用系統(tǒng)里,實現(xiàn)轉(zhuǎn)賬事務(wù)需要通過遠程調(diào)用,由于網(wǎng)絡(luò)問題就會導(dǎo)致分布式事務(wù)問題。
1.4. 分布式事務(wù)產(chǎn)生的場景
我們了解到分布式事務(wù)的基礎(chǔ)概念。與本地事務(wù)不同的是,分布式系統(tǒng)之所以叫分布式,是因為提供服務(wù)的各個節(jié)點分布在不同的機器上,相互之間通過網(wǎng)絡(luò)交互。不能因為有一點網(wǎng)絡(luò)問題就導(dǎo)致整個系統(tǒng)無法提供服務(wù),網(wǎng)絡(luò)因素成為了分布式事務(wù)的考量標準之一。因此分布式事務(wù)需要更進一步的理論支持。 在了解分布式事務(wù)控制解決方案之前先了解一些基礎(chǔ)理論,通過理論知識指導(dǎo)我們確定分布式事務(wù)控制的目標,從而幫助我們理解解決方案。
CAP是Consistency、Availability、Parition tolerance三個詞語的縮寫,分別表示一致性、可用性、分區(qū)容忍性。 下邊我們分別來解釋 : 為了方便對CAP理論的理解,我們結(jié)合電商系統(tǒng)中的一些業(yè)務(wù)場景來理解CAP。 如下圖,是商品信息管理的執(zhí)行流程 :
 整體執(zhí)行流程如下 : 1、商品服務(wù)請求主數(shù)據(jù)庫寫入商品信息(添加商品、修改商品、刪除商品)。 2、主數(shù)據(jù)庫向商品服務(wù)響應(yīng)寫入成功。 3、商品服務(wù)請求從數(shù)據(jù)庫讀取商品信息。
C-Consistency : 一致性是指寫操作后的讀操作可以讀取到最新的數(shù)據(jù)狀態(tài),當數(shù)據(jù)分布在多個節(jié)點上,從任意節(jié)點讀取到的數(shù)據(jù)都是最新的狀態(tài)。 上圖中,商品信息的讀寫要滿足一致性就是要實現(xiàn)如下目標 : 1、商品服務(wù)寫入主數(shù)據(jù)庫成功,則向從數(shù)據(jù)庫查詢新數(shù)據(jù)也成功。 2、商品服務(wù)寫入主數(shù)據(jù)庫失敗,則向從數(shù)據(jù)庫查詢新數(shù)據(jù)也失敗。 如何實現(xiàn)一致性? 1、寫入主數(shù)據(jù)庫后要將數(shù)據(jù)同步到從數(shù)據(jù)庫。 2、寫入主數(shù)據(jù)庫后,在向從數(shù)據(jù)庫同步期間要將從數(shù)據(jù)庫鎖定,待同步完成后再釋放鎖,以免在新數(shù)據(jù)寫入成功后,向從數(shù)據(jù)庫查詢到舊的數(shù)據(jù)。
分布式系統(tǒng)一致性的特點 : 1、由于存在數(shù)據(jù)同步的過程,寫操作的響應(yīng)會有一定的延遲。 2、為了保證數(shù)據(jù)一致性會對資源暫時鎖定,待數(shù)據(jù)同步完成釋放鎖定資源。 3、如果請求數(shù)據(jù)同步失敗的節(jié)點則會返回錯誤信息,一定不會返回舊數(shù)據(jù)。
A-Availability: 可用性是指任何事務(wù)操作都可以得到響應(yīng)結(jié)果,且不會出現(xiàn)響應(yīng)超時或響應(yīng)錯誤。 上圖中,商品信息讀取滿足可用性就是要實現(xiàn)如下目標 : 1、從數(shù)據(jù)庫接收到數(shù)據(jù)查詢的請求則立即能夠響應(yīng)數(shù)據(jù)查詢結(jié)果。 2、從數(shù)據(jù)庫不允許出現(xiàn)響應(yīng)超時或響應(yīng)錯誤。 如何實現(xiàn)可用性? 1、寫入主數(shù)據(jù)庫后要將數(shù)據(jù)同步到從數(shù)據(jù)庫。 2、由于要保證從數(shù)據(jù)庫的可用性,不可將從數(shù)據(jù)庫中的資源進行鎖定。 3、即使數(shù)據(jù)還沒有同步過來,從數(shù)據(jù)庫也要返回要查詢的數(shù)據(jù),哪怕是舊數(shù)據(jù),如果連舊數(shù)據(jù)也沒有則可以按照約定返回一個默認信息,但不能返回錯誤或者響應(yīng)超時。
分布式系統(tǒng)可用性的特點 : 1、所有請求都有響應(yīng),且不會出現(xiàn)響應(yīng)超時或響應(yīng)錯誤。
P-Partition tolerance : 通常分布式系統(tǒng)的各個節(jié)點部署在不同的子網(wǎng),這就是網(wǎng)絡(luò)分區(qū),不可避免的會出現(xiàn)由于網(wǎng)絡(luò)問題而導(dǎo)致節(jié)點之間通訊失敗,此時仍可對外提供服務(wù),這叫分區(qū)容忍性。 上圖中,商品信息讀寫滿足分區(qū)容忍性就是要實現(xiàn)如下目標 : 1、主數(shù)據(jù)庫向從數(shù)據(jù)庫同步數(shù)據(jù)失敗不影響讀寫操作。 2、其一個節(jié)點掛掉不影響另一個節(jié)點對外提供服務(wù)。
如何實現(xiàn)分區(qū)容忍性? 1、盡量使用異步取代同步操作,例如使用異步方式將數(shù)據(jù)從主數(shù)據(jù)庫同步到從數(shù)據(jù),這樣節(jié)點之間能有效的實現(xiàn)松耦合。 2、添加從數(shù)據(jù)庫節(jié)點,其中一個從節(jié)點掛掉其它從節(jié)點提供服務(wù)。
分布式分區(qū)容忍性的特點 : 1、分區(qū)容忍性是分布式系統(tǒng)具備的基本能力。
1、上邊商品管理的例子是否同時具備CAP呢? 在所有分布式事務(wù)場景中不會同時具備CAP三特性,因為在具備了P的前提下C和A是不能共存的。 比如 : 下圖滿足了P即表示實現(xiàn)分區(qū)容忍 :
 本圖分區(qū)容忍的含義是 : 1)主數(shù)據(jù)庫通過網(wǎng)絡(luò)向從數(shù)據(jù)同步數(shù)據(jù),可以認為主從數(shù)據(jù)庫部署在不同的分區(qū),通過網(wǎng)絡(luò)進行交互。 2)當主數(shù)據(jù)庫和從數(shù)據(jù)庫之間的網(wǎng)絡(luò)出現(xiàn)問題不影響主數(shù)據(jù)庫和從數(shù)據(jù)庫對外提供服務(wù)。 3)其一個節(jié)點掛掉不影響另一個節(jié)點對外提供服務(wù)。 如果要實現(xiàn)C則必須保證數(shù)據(jù)一致性,在數(shù)據(jù)同步的時候為防止向從數(shù)據(jù)庫查詢不一致的數(shù)據(jù)則需要將從數(shù)據(jù)庫數(shù)據(jù)鎖定,待同步完成后解鎖,如果同步失敗從數(shù)據(jù)庫要返回錯誤信息或超時信息。 如果要實現(xiàn)A則必須保證數(shù)據(jù)可用性,不管任何時候都可以向從數(shù)據(jù)庫查詢數(shù)據(jù),則不會響應(yīng)超時或返回錯誤信息。 通過分析發(fā)現(xiàn)在滿足P的前提下C和A存在矛盾性。
2、CAP有那些組合方式呢? 在生產(chǎn)中對分布式事務(wù)處理時要根據(jù)需求來確定滿足CAP的那兩個方面。 1)AP: 放棄一致性,追求分區(qū)容忍性和可用性。這是很多分布式系統(tǒng)設(shè)計時的選擇。 例如 : 上邊的商品管理,完全可以實現(xiàn)AP,前提是只要用戶可以接收所查詢的到數(shù)據(jù)在一定時間內(nèi)不是最新的即可。 通常實現(xiàn)AP都會保證最終一致性,后面講的BASE理論就是根據(jù)AP來擴展的,一些業(yè)務(wù)場景 比如 :訂單退款,今日退款成功,明日賬戶到賬,只要用戶可以接受在一定時間內(nèi)到賬即可。 2)CP: 放棄可用性,追求一致性和分區(qū)容錯性,我們的zookeeper其實就是追求的強一致性,又比如跨行轉(zhuǎn)賬,一次轉(zhuǎn)賬請求要等待雙方銀行系統(tǒng)都完成整個事務(wù)才算完成。 3)CA: 放棄分區(qū)容忍性,既不進行分區(qū),不考慮由于網(wǎng)絡(luò)不通或節(jié)點掛掉的問題,則可以實現(xiàn)一致性和可用性。那么系統(tǒng)將不是一個標準的分布式系統(tǒng),我們最常用的關(guān)系型數(shù)據(jù)就滿足了CA。 上邊的商品管理,如果要實現(xiàn)CA則架構(gòu)如下 :
 主數(shù)據(jù)庫和從數(shù)據(jù)庫中間不再進行數(shù)據(jù)同步,數(shù)據(jù)庫可以響應(yīng)每次的查詢請求,通過事務(wù)隔離級別實現(xiàn)每個查詢請求都可以返回最新的數(shù)據(jù)。
通過上面的學(xué)習(xí),CAP是一個已經(jīng)被證實的理論 :一個分布式系統(tǒng)最多只能同時滿足一致性(Consistency)、可用性(Availability)和分區(qū)容忍性(Partition tolerance)這三項中的兩項。它可以作為我們架構(gòu)設(shè)計、技術(shù)選型的考量標準。對于多數(shù)大型互聯(lián)網(wǎng)應(yīng)用的場景,節(jié)點眾多、部署分散,而且現(xiàn)在的集群規(guī)模越來越大,所以節(jié)點故障、網(wǎng)絡(luò)故障是常態(tài),而且要保證服務(wù)可用性達到N個9(99.99.%),并要達到良好的響應(yīng)性能來提高用戶體驗,因此一般都會做出如下選擇 :保證P和A,舍棄C強一致性,保證最終一致性。
1、理解強一致性和最終一致性 CAP理論告訴我們一個分布式系統(tǒng)最多只能同時滿足一致性(Consistency)、可用性(Availability)和分區(qū)容忍性(Partition tolerance)這三項中的兩項,其中AP在實際應(yīng)用中較多,AP既舍棄一致性,保證可用性和分區(qū)容忍性,但是在實際生產(chǎn)中很多場景都要實現(xiàn)一致性,比如前邊我們舉的例子,AP即舍棄一致性,保證可用性和分區(qū)容忍性,但是在實際產(chǎn)生中很多場景都要實現(xiàn)一致性,比如前邊我們覺得例子主數(shù)據(jù)庫向從數(shù)據(jù)庫同步數(shù)據(jù),即使不要一致性,但是最終也要將數(shù)據(jù)同步成功來保證數(shù)據(jù)一致,這種一致性和CAP中的一致性不同,CAP中的一致性要求在任何時間查詢每個節(jié)點數(shù)據(jù)都必須一致,它強調(diào)的是強一致性,但是最終一致性是允許可以在一段時間內(nèi)每個節(jié)點的數(shù)據(jù)不一致,但是經(jīng)過一段時間每個節(jié)點的數(shù)據(jù)必須一致,它強調(diào)的是最終數(shù)據(jù)的一致性。 2、Base理論介紹 BASE是Basically Availbale(基本可用)、Soft state(軟狀態(tài))和Eventually consistent(最終一致性)三個短語的縮寫。BASE理論是對CAP中AP的一個擴展,通過犧牲強一致性來獲得可用性,當出現(xiàn)故障允許部分不可用但要保證核心功能可用,允許數(shù)據(jù)在一段時間內(nèi)是不一致的,但最終達到一致狀態(tài)。滿足BASE理論的事務(wù),我們稱之為“柔性事務(wù)”。
- 基本可用 :分布式系統(tǒng)在出現(xiàn)故障時,允許損失部分可用功能,保證核心功能可用。如電商網(wǎng)址交易付款出現(xiàn)問題來,商品依然可以正常瀏覽。
- 軟狀態(tài):由于不要求強一致性,所以BASE允許系統(tǒng)中存在中間狀態(tài)(也叫軟狀態(tài)),這個狀態(tài)不影響系統(tǒng)可用性,如訂單中的“支付中”、“數(shù)據(jù)同步中”等狀態(tài),待數(shù)據(jù)最終一致后狀態(tài)改為“成功”狀態(tài)。
- 最終一致性:最終一致是指的經(jīng)過一段時間后,所有節(jié)點數(shù)據(jù)都將會達到一致。如訂單的“支付中”狀態(tài),最終會變?yōu)?ldquo;支付成功”或者“支付失敗”,使訂單狀態(tài)與實際交易結(jié)果達成一致,但需要一定時間的延遲、等待。
|