中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

分布式事務(wù)的總結(jié)與思考

2018-07-20    來(lái)源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

思來(lái)想去,個(gè)人覺得要理解 「分布式事務(wù)」 ,必須先知道什么是“事務(wù)(Transaction)”。

當(dāng)然,這里提到的“事務(wù)”是在事務(wù)型數(shù)據(jù)庫(kù)(Transactional Database)知識(shí)領(lǐng)域內(nèi)的。

一個(gè)事務(wù)包含了若干個(gè)數(shù)據(jù)庫(kù)操作,這些操作通常都會(huì)對(duì)數(shù)據(jù)庫(kù)產(chǎn)生變化。值得一提的是,多個(gè)事務(wù)之間是互不影響,獨(dú)立運(yùn)行的,事務(wù)里的各個(gè)操作最終都得以持久化。

事務(wù)一個(gè)很重要的特性是: "all-or-nothing" 。

通俗來(lái)講,事務(wù)是對(duì)數(shù)據(jù)的一個(gè)邏輯操作,事務(wù)內(nèi)的各個(gè)單元操作要么完整執(zhí)行成功,要么全部都不執(zhí)行。

因此,數(shù)據(jù)庫(kù)的事務(wù)機(jī)制為一系列的數(shù)據(jù)庫(kù)操作提供了相對(duì)獨(dú)立(隔離)的運(yùn)行環(huán)境,保證了 數(shù)據(jù)的一致性 ,并且使得數(shù)據(jù)庫(kù)能被正確的恢復(fù)過來(lái)。

0、事務(wù)的特性

這一小節(jié)講的是數(shù)據(jù)庫(kù)事務(wù)四個(gè)經(jīng)典的特性: 「ACID」 。

讀者如果熟悉,可以選擇性略過。

「ACID」是四個(gè)單詞的首字母縮寫,首次被提出來(lái)是在1983年。

與其說(shuō)這是事務(wù)的四大特性,倒不如認(rèn)為是一種設(shè)計(jì)思想,這種思想在以后影響了數(shù)據(jù)庫(kù)系統(tǒng)開發(fā)的方方面面。

Atomicity - 原子性

這個(gè)特性在上文中也有提到過,即 "all or nothing":一個(gè)事務(wù)中的所有操作都順利完成了,才可以認(rèn)為這個(gè)事務(wù)是成功的,否則,但凡有一個(gè)操作失敗了,就意味著整個(gè)事務(wù)的失敗,數(shù)據(jù)庫(kù)的相關(guān)數(shù)據(jù)狀態(tài)也就不會(huì)被改變。

值得一提的是,操作失敗不僅僅是業(yè)務(wù)或者編碼層面,也包括一些外部因素,比如斷點(diǎn),磁盤故障等。

Consistency - 一致性

講到事務(wù)的一致性,通常指的是數(shù)據(jù)庫(kù)相關(guān)的約束條件,包括數(shù)據(jù)庫(kù)自帶的約束以及用戶自定義的約束,比如數(shù)據(jù)的唯一性(unique),數(shù)據(jù)的級(jí)聯(lián)相關(guān)性(cascade),觸發(fā)器(trigger)等。

這一系列的約束旨在保證事務(wù)能將數(shù)據(jù)庫(kù)從一個(gè)合理的狀態(tài)轉(zhuǎn)移到另一個(gè)合理的狀態(tài),而所寫入的數(shù)據(jù)也都是遵從上述定義的約束條件。

當(dāng)然,這里所提到的一致性,沒法從更高的應(yīng)用層面(通常是業(yè)務(wù)層)保證數(shù)據(jù)一致性,僅僅是從程序上規(guī)避編碼錯(cuò)誤導(dǎo)致對(duì)約束條件的破壞。比如插入了一個(gè)已經(jīng)存在的主鍵值,或者沒給一個(gè)NOT NULL字段賦上一個(gè)合理的值……

Durability - 持久性

這個(gè)特性比較好理解,一個(gè)事務(wù)一旦被成功提交,那么所操作的數(shù)據(jù)將被永久存放在磁盤里了。持久化到磁盤,也是為了防止斷電導(dǎo)致數(shù)據(jù)丟失,直接放內(nèi)存中,顯然不是明智的選擇。

Isolation - 隔離性

這個(gè)特性是最晚被提出來(lái)的,Jim Gray最早只提出上述的三個(gè)特性,后來(lái)Andreas Reuter和 Theo H?rder在此基礎(chǔ)上,增加了隔離性。

隔離性的提出,是為了解決事務(wù)并發(fā)的問題,是指并發(fā)的兩個(gè)事務(wù)的執(zhí)行互不干擾,一個(gè)事務(wù)不能看到其他事務(wù)運(yùn)行過程的中間狀態(tài)。

從隔離性的使用場(chǎng)景能感受到,提出此特性也是有時(shí)代背景的,也是人們?yōu)榱私鉀Q并發(fā)控制問題而提出的對(duì)策。

1、何為「分布式事務(wù)」

在事務(wù)的基礎(chǔ)上,加上了「分布式」,這意味著要在分布式的環(huán)境下滿足事務(wù)的ACID特性。而分布式意味著網(wǎng)絡(luò)可能是異構(gòu)的,操作系統(tǒng)也不盡相同,數(shù)據(jù)庫(kù)系統(tǒng)也不只在一臺(tái)主機(jī)上了。

實(shí)際上,隨著數(shù)據(jù)規(guī)模的急劇增長(zhǎng),單體數(shù)據(jù)庫(kù)無(wú)法承載如此海量的數(shù)據(jù),需要對(duì)原有數(shù)據(jù)進(jìn)行合理的分庫(kù)分表,此外,對(duì)于近來(lái)盛行的「微服務(wù)」架構(gòu),每個(gè)服務(wù)獨(dú)立部署,有獨(dú)立的數(shù)據(jù)庫(kù),也不得不面臨分布式事務(wù)的問題。

總之,隨著分布式架構(gòu)的大規(guī)模運(yùn)用,分布式事務(wù)是不可回避的問題。

如果我們將「分布式事務(wù)」認(rèn)為是一種事務(wù),那么又該如何設(shè)計(jì),使其滿足ACID四大特性呢?

2、兩段式提交

最經(jīng)典的分布式事務(wù)解決方法就是“兩段式提交(two-phase commit)”。

在兩段式提交過程中,涉及兩類角色, 協(xié)調(diào)者(Coordinator) 和 參與者(Participants) 。

顧名思義,“兩段式提交”將事務(wù)的提交過程分為了兩個(gè)階段:

  • 第一個(gè)階段:預(yù)提交階段,也可以稱之為投票階段。在這個(gè)階段,協(xié)調(diào)者詢問所有的參與者是否已準(zhǔn)備好提交事務(wù),參與者通常都會(huì)給出一個(gè)“YES or NO”的回答,即我們認(rèn)為的投票過程。根據(jù)事務(wù)的Atomic特性,但凡有一個(gè)參與者Say NO,那么協(xié)調(diào)者就認(rèn)為這個(gè)事務(wù)提交是失敗的。只有全部參與者給出“YES”的回答,才能讓事務(wù)順利提交。

  • 第二個(gè)階段:提交決定階段。協(xié)調(diào)者根據(jù)上一個(gè)階段的投票結(jié)果決定是Commit還是Abort,這個(gè)決定是全局性的,會(huì)通知到所有的參與者執(zhí)行最終的決定,并回傳一個(gè)ack確認(rèn)信息。

值得注意的是,在進(jìn)入兩段式提交過程期間,所有的參與者不能臨時(shí)改變主意,即投票不可反悔,下面是兩段式提交過程的示意圖:

two-phase commit protocol

仔細(xì)想想,兩段提交協(xié)議也并不完美。

兩段式提交時(shí)一個(gè)典型的 中心化架構(gòu) 協(xié)議,被指定為協(xié)調(diào)者的節(jié)點(diǎn)如果沒有做高可用措施的話,協(xié)調(diào)者的宕機(jī)意味著事務(wù)再也無(wú)法正常提交了。與此同時(shí),各個(gè)節(jié)點(diǎn)(包括協(xié)調(diào)者和參與者)只有在永無(wú)故障的前提下(雖然絕大多數(shù)的時(shí)候是OK的),才能使得事務(wù)順利提交。

這些假設(shè)條件無(wú)疑是嚴(yán)苛的,因?yàn)橐_(dá)到 強(qiáng)一致性 的目的。

不過,這也使得兩段式提交協(xié)議在某些時(shí)候是比較脆弱的。兩段式提交協(xié)議的性能比較差, 消息交互多,且受最慢節(jié)點(diǎn)影響。

基于兩段式提交的分布式事務(wù)在提交事務(wù)時(shí)需要在多個(gè)節(jié)點(diǎn)之間進(jìn)行協(xié)調(diào),最大限度地推后了提交事務(wù)的時(shí)間點(diǎn)。

客觀上延長(zhǎng)了事務(wù)的執(zhí)行時(shí)間,同時(shí)也會(huì)

提高事務(wù)在訪問共享資源時(shí)發(fā)生沖突和死鎖的幾率

。隨著數(shù)據(jù)庫(kù)節(jié)點(diǎn)的增多,這種趨勢(shì)會(huì)越來(lái)越嚴(yán)重,從而成為系統(tǒng)在數(shù)據(jù)庫(kù)層面上水平伸縮的"枷鎖"。 這是很多Sharding系統(tǒng)不采用分布式事務(wù)的主要原因。

就好比你在旅游網(wǎng)站上訂了一個(gè)行程,除了生成一個(gè)出行訂單外,還需要去航空公司為你預(yù)訂相應(yīng)的機(jī)票,還要去酒店為你預(yù)訂每天的房間。如果根據(jù)兩段式提交協(xié)議,只有當(dāng)訂單、機(jī)票和房間都準(zhǔn)備好了,這個(gè)行程才算預(yù)訂好了,這在顯然是不合理的。對(duì)于這種長(zhǎng)生命周期的分布式事務(wù)就不適合兩段式提交。

3、三段式提交

顯然,三段式提交協(xié)議是基于兩段式提交而生的,為了解決兩段式提交帶來(lái)的阻塞等待問題,三段式提交引入TIMEOUT機(jī)制,可在超時(shí)后自動(dòng)釋放資源。

和兩段式提交一樣,三段式提交協(xié)議有兩類角色, 協(xié)調(diào)者(Coordinator) 和 參與者(Participants) ,由三個(gè)階段構(gòu)成。

  • 第一個(gè)階段:詢問階段。協(xié)調(diào)者詢問每個(gè)參與者是否可以進(jìn)行提交,這時(shí)候會(huì)出現(xiàn)多種情況。參與者明確自己是否能提交,可以給出“YES or NO”的準(zhǔn)確回答,也有可能因?yàn)楦鞣N因素,導(dǎo)致不能確定,直到此次詢問超時(shí),返回“NO”。

  • 第二個(gè)階段:預(yù)提交階段。根據(jù)上階段得到的應(yīng)答,協(xié)調(diào)者決定事務(wù)Commit or Abort,將投票最終結(jié)果發(fā)送給各個(gè)參與者,參與者收到此決定后再繼續(xù)下面的操作,只不過到了此階段,雙方都有超時(shí)機(jī)制了。協(xié)調(diào)者也有可能因?yàn)楦鞣N原因不能及時(shí)做出決定,超時(shí)后就自動(dòng)給出了Abort決定,與此同時(shí),參與者收到了協(xié)調(diào)者的決定,需要回傳ACK信息以確定,如果沒有在規(guī)定的時(shí)間窗口內(nèi)確認(rèn),協(xié)調(diào)者認(rèn)為事務(wù)應(yīng)該Abort。

  • 第三個(gè)階段:正式提交階段。在上一個(gè)階段,各個(gè)參與者已經(jīng)收到了事務(wù)Commit or Abort的確認(rèn)信息,其實(shí)這個(gè)階段可以認(rèn)為是一個(gè)二次確認(rèn)階段,協(xié)調(diào)者會(huì)發(fā)送一個(gè)DoCommit指令,參與者才真正開始進(jìn)行事務(wù)的操作,并給協(xié)調(diào)者回復(fù)一個(gè)ACK。如果此時(shí)協(xié)調(diào)者接收ACK超時(shí),協(xié)調(diào)者也會(huì)Abort整個(gè)事務(wù)。值得注意的是,如果協(xié)調(diào)者本身發(fā)送DoCommit就超時(shí)了,參與者也不會(huì)直接Abort事務(wù),而是按照第二個(gè)階段的結(jié)果執(zhí)行。

下面附上兩段式提交與三段式提交的框架圖:

4、TCC

TCC包含了三個(gè)階段: T ry, C onfirm, C ancel,因此而得名「TCC」。

TCC的概念屬于國(guó)產(chǎn),因?yàn)橹Ц秾毜募夹g(shù)布道而廣為人知。

其實(shí),TCC算是一種編程模型,通常被理解為是一種柔性事務(wù)解決方案。

  • Try ,嘗試執(zhí)行業(yè)務(wù)。完成所有業(yè)務(wù)檢查,預(yù)留相應(yīng)的業(yè)務(wù)資源。

  • Confirm ,如果Try階段執(zhí)行成功,則此階段利用Try階段預(yù)留的資源,不再進(jìn)行業(yè)務(wù)檢查,而是執(zhí)行真正的業(yè)務(wù)提交。并且Confirm階段的操作滿足冪等性,以便支持重試。這個(gè)階段有一個(gè)假設(shè):只要Try階段成功,那么Confirm階段一定成功。

  • Cancel ,此階段是發(fā)生在Try階段出現(xiàn)失敗的時(shí)候,回滾之前的操作,釋放Try階段預(yù)留的業(yè)務(wù)資源,同樣也滿足冪等性。

借用一個(gè)例子:

用戶下完訂單后,使用紅包帳戶和資金帳戶來(lái)付款,紅包帳戶服務(wù)和資金帳戶服務(wù)在不同的系統(tǒng)中。一個(gè)是CapitalTradeOrderService,代表著資金帳戶服務(wù),另一個(gè)是RedPacketTradeOrderService,代表著紅包帳戶服務(wù)。

下完訂單后,訂單狀態(tài)為DRAFT,在TRY階段,訂單支付服務(wù)將訂單狀態(tài)變成PAYING,同時(shí)遠(yuǎn)程調(diào)用紅包帳戶服務(wù)和資金帳戶服務(wù),將付款方的余額減掉(預(yù)留業(yè)務(wù)資源);

如果在Try階段,任何一個(gè)服務(wù)失敗,將會(huì)調(diào)用這些服務(wù)對(duì)應(yīng)的cancel方法,訂單支付服務(wù)將訂單狀態(tài)變成PAY_FAILED,同時(shí)遠(yuǎn)程調(diào)用紅包帳戶服務(wù)和資金帳戶服務(wù),將付款方余額減掉的部分增加回去;

如果Try階段正常完成,則進(jìn)入Confirm階段,在Confirm階段,訂單支付服務(wù)將訂單狀態(tài)變成CONFIRMED,同時(shí)遠(yuǎn)程調(diào)用紅包帳戶服務(wù)和資金帳戶服務(wù)對(duì)應(yīng)的Confirm方法,將收款方的余額增加。

總結(jié)

本文對(duì)事務(wù)進(jìn)行了簡(jiǎn)單介紹,重點(diǎn)分析了事務(wù)的ACID四大特性,接著介紹分布式事務(wù)的解決方案。

希望對(duì)你有所幫助!

THANKS!

 

來(lái)自:http://mp.weixin.qq.com/s/UKNK9UzdiZzrNCd5U_4Ytg

 

標(biāo)簽: 數(shù)據(jù)庫(kù) 網(wǎng)絡(luò)

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:函數(shù)式編程中的 “函數(shù)們”

下一篇:你所不知道的Java之HashCode