掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流
作者:咔咔侃技術 2019-09-09 10:09:51
運維
數(shù)據(jù)庫運維
分布式 當數(shù)據(jù)庫單表數(shù)據(jù)達到千萬級別,就要考慮分庫分表,那么就會從原來的一個數(shù)據(jù)庫變成多個數(shù)據(jù)庫。例如如果一個操作即操作了01庫,又操作了02庫,而且又要保證數(shù)據(jù)的一致性,那么就要用到分布式事務。

成都創(chuàng)新互聯(lián)長期為數(shù)千家客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為樂山企業(yè)提供專業(yè)的做網(wǎng)站、網(wǎng)站設計,樂山網(wǎng)站改版等技術服務。擁有十載豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
什么是分布式事務?
答:指一次大的操作由不同的小操作組成的,這些小的操作分布在不同的服務器上,分布式事務需要保證這些小操作要么全部成功,要么全部失敗。從本質(zhì)上來說,分布式事務就是為了保證不同數(shù)據(jù)庫的數(shù)據(jù)一致性。
分布式事務產(chǎn)生的原因?
1 數(shù)據(jù)庫分庫分表
當數(shù)據(jù)庫單表數(shù)據(jù)達到千萬級別,就要考慮分庫分表,那么就會從原來的一個數(shù)據(jù)庫變成多個數(shù)據(jù)庫。例如如果一個操作即操作了01庫,又操作了02庫,而且又要保證數(shù)據(jù)的一致性,那么就要用到分布式事務。
2 應用SOA化
所謂的SOA化,就是業(yè)務的服務化。例如電商平臺下單操作就會產(chǎn)生調(diào)用庫存服務扣減庫存和訂單服務更新訂單數(shù)據(jù),那么就會設計到訂單數(shù)據(jù)庫和庫存數(shù)據(jù)庫,為了保證數(shù)據(jù)的一致性,就需要用到分布式事務。
總結:其實上面兩種場景,歸根到底是要操作多數(shù)據(jù)庫,并且要保證數(shù)據(jù)的一致性,而產(chǎn)生的分布式事務的。
分布式事務解決方案
1、兩階段提交(2PC)
XA是一個分布式事務協(xié)議,由Tuxedo提出。XA中大致分為兩部分:事務管理器和本地資源管理器。其中本地資源管理器往往由數(shù)據(jù)庫實現(xiàn),比如Oracle、Mysql等數(shù)據(jù)庫都實現(xiàn)了XA接口,而事務管理器作為全局的調(diào)度者,負責各個本地資源的提交回滾。
XA實現(xiàn)分布式事務的原理如下:
總結
二階段提交看起來確實能夠提供原子性的操作,但是它存在幾個缺點:
2、三階段提交(3PC)
3PC其實在2PC的基礎上增加了CanCommit階段,是2PC的變種,并引入了超時機制。一旦事務參與者遲遲沒有收到協(xié)調(diào)者的Commit請求,就會自動進行本地commit,這樣相對有效的解決了協(xié)調(diào)者單點故障的問題。但是,性能和數(shù)據(jù)一致性問題沒有根本解決。
3PC分為三個階段:CanCommit、PreCommit、DoCommit
CanCommit階段
它跟2PC的 準備階段很像,協(xié)調(diào)者向參與者發(fā)送commit請求,參與者如果可以提交就返回Yes響應,否則返回No響應。
PreCommit階段
協(xié)調(diào)者根據(jù)參與者的響應情況來決定是否可以進行事務的PreCommit操作。根據(jù)響應情況,有以下兩種可能:
doCommit階段
該階段進行真正的事務提交,也可以分為以下兩種情況:
原理圖如下:
總結
相對于2PC而言,3PC對于協(xié)調(diào)者和參與者都設置了超時時間,而2PC只有協(xié)調(diào)者才擁有超時時間機制。這個優(yōu)化解決了,參與者在長時間無法與協(xié)調(diào)者節(jié)點通訊的情況下,無法釋放資源的問題,因為參與者自身擁有超時機制會在超時后,自動進行本地commit從而進行釋放資源。而這種機制也側面降低了整個事務的阻塞時間和范圍。但是仍然沒有解決數(shù)據(jù)一致性問題,即在參與者收到PreCommit請求后等待最終指令,如果此時協(xié)調(diào)者無法與參與者正常通信,會導致參與者繼續(xù)提交事務,造成數(shù)據(jù)不一致。
3、補償事務(TCC)
TCC(Try-Confirm-Cancel)又稱補償事務。它實際上與2PC、3PC一樣,都是分布式事務的一種實現(xiàn)方案而已。它分為三個操作:
TCC事務的處理流程與2PC兩階段提交類似,不過2PC通常都是在DB層面,而TCC本質(zhì)上就是應用層面的2PC,需要通過業(yè)務邏輯來實現(xiàn)。它的優(yōu)勢在于,可以讓應用自己定義數(shù)據(jù)庫操作的粒度,使得降低鎖沖突、提交吞吐量。
不過對應用的侵入性非常強,業(yè)務邏輯的每個分支都需要實現(xiàn)try、confirm、cancel三個操作。
TCC原理圖如下:
4、消息事務+最終一致性
所謂的消息事務就是基于消息中間件的兩階段提交,本質(zhì)上是中間件的一種特殊利用,他是將本地事務和發(fā)消息放在一個分布式事務里,保證要么本地操作成功并且對外發(fā)消息成功,要么兩者都失敗,開源的RocketMQ就支持這一特性,具體原理如下:
步驟如下:
基于消息中間件的兩階段提交往往用在高并發(fā)場景下,將一個分布式事務拆成一個消息事務(服務A的本地操作+發(fā)消息)+服務B的本地操作,其中服務B的操作由消息驅(qū)動,只要消息事務成功,那么服務A一定成功,消息也一定發(fā)出來了,這時候服務B會收到消息去執(zhí)行本地操作,如果本地操作失敗,消息會重投,直到服務B操作成功,這樣就變相地實現(xiàn)了A與B的分布式事務。
以上幾個步驟可能存在異常情況,現(xiàn)在對其進行分析:

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流