分布式系統(tǒng)-事務(wù)一致性的解決原理和兩個(gè)理論模型

分布式系統(tǒng)中經(jīng)常出現(xiàn)的異常

機(jī)器宕機(jī),網(wǎng)絡(luò)異常杠步,消息丟失氢伟,消息亂序,數(shù)據(jù)錯(cuò)誤幽歼,不可靠的tcp朵锣,存儲(chǔ)數(shù)據(jù)丟失。

分布式事務(wù)問題

也叫分布式數(shù)據(jù)一致性問題甸私,簡(jiǎn)單來(lái)說就是如何在分布式場(chǎng)景中保證多個(gè)節(jié)點(diǎn)數(shù)據(jù)的一致性诚些。分布式事務(wù)產(chǎn)生的核心原因在于存儲(chǔ)資源的分布性,比如多個(gè)數(shù)據(jù)庫(kù),或者M(jìn)ySQL和Redis兩種不同存儲(chǔ)設(shè)備的數(shù)據(jù)一致性等诬烹。在實(shí)際應(yīng)用中砸烦,我們應(yīng)該盡可能地從設(shè)計(jì)層面去避免分布式事務(wù)的問題,因?yàn)槿魏我环N解決方案都會(huì)增加系統(tǒng)的復(fù)雜度绞吁。

基于XA協(xié)議解決分布式數(shù)據(jù)一致性的基本原理

X/Open分布式事務(wù)模型

X/Open DTP(X/Open Distributed Transaction Processing Reference Model)是X/Open這個(gè)組織定義的一套分布式事務(wù)的標(biāo)準(zhǔn)幢痘。這個(gè)標(biāo)準(zhǔn)提出了使用兩階段提交(2PC,Two-Phase-Commit)來(lái)保證分布式事務(wù)的完整性家破。

X/Open DTP中包含以下三種角色

? AP:Application颜说,表示應(yīng)用程序。

? RM:Resource Manager汰聋,表示資源管理器门粪,比如數(shù)據(jù)庫(kù)。

? TM:Transaction Manager马僻,表示事務(wù)管理器庄拇,一般指事務(wù)協(xié)調(diào)者,負(fù)責(zé)協(xié)調(diào)和管理事務(wù)韭邓,提供AP編程接口或管理RM措近。可以理解為Spring中提供的Transaction Manager女淑。

也就是將一次事務(wù)提交分為了三個(gè)角色瞭郑,AP負(fù)責(zé)業(yè)務(wù)編寫產(chǎn)生實(shí)務(wù)操作,TM負(fù)責(zé)封裝事務(wù)的操作作為事務(wù)的協(xié)調(diào)者鸭你,AP通過TM將事務(wù)提交給RM屈张,也就是事務(wù)的持久化。

image.png

兩階段提交協(xié)議

在X/Open模型中袱巨,TM實(shí)現(xiàn)了多個(gè)RM事務(wù)的提交阁谆,實(shí)際上事務(wù)的提交分為兩個(gè)階段,第一階段為事務(wù)的準(zhǔn)備階段愉老,第二階段是事務(wù)的提交或者回滾階段场绿。這兩個(gè)階段都是由事務(wù)管理器發(fā)起的。

兩階段提交流程

準(zhǔn)備階段

事務(wù)管理器(TM)通知資源管理器(RM)準(zhǔn)備分支事務(wù)嫉入,記錄事務(wù)日志焰盗,并告知事務(wù)管理器的準(zhǔn)備結(jié)果。

提交/回滾階段

如果所有的資源管理器(RM)在準(zhǔn)備階段都明確返回成功咒林,則事務(wù)管理器(TM)向所有的資源管理器(RM)發(fā)起事務(wù)提交指令完成數(shù)據(jù)的變更熬拒。反之,如果任何一個(gè)資源管理器(RM)明確返回失敗垫竞,則事務(wù)管理器(TM)會(huì)向所有資源管理器(RM)發(fā)送事務(wù)回滾指令澎粟。

兩階段提交的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

兩階段提交將一個(gè)事務(wù)的處理過程分為準(zhǔn)備和執(zhí)行兩個(gè)階段,它的優(yōu)點(diǎn)在于充分考慮到了分布式系統(tǒng)的不可靠因素,并且采用非常簡(jiǎn)單的方式(兩階段提交)就把由于系統(tǒng)不可靠而導(dǎo)致事務(wù)提交失敗的概率降到最小捌议。

缺點(diǎn)
image.png
同步阻塞

所有參與者(RM)都是事務(wù)阻塞型的哼拔,對(duì)于任何一次指令都必須要有明確的響應(yīng)才能繼續(xù)進(jìn)行下一步,否則會(huì)處于阻塞狀態(tài)瓣颅,占用的資源一直被鎖定倦逐。

過于保守

任何一個(gè)節(jié)點(diǎn)失敗都會(huì)導(dǎo)致數(shù)據(jù)回滾。

事務(wù)協(xié)調(diào)者的單點(diǎn)故障

如果協(xié)調(diào)者在第二階段出現(xiàn)了故障宫补,那么其他的參與者(RM)會(huì)一直處于鎖定狀態(tài)檬姥。

“腦裂”導(dǎo)致數(shù)據(jù)不一致問題

在第二階段中,事務(wù)協(xié)調(diào)者向所有參與者(RM)發(fā)送commit請(qǐng)求后粉怕,發(fā)生局部網(wǎng)絡(luò)異常導(dǎo)致只有一部分參與者(RM)接收到了commit請(qǐng)求健民,這部分參與者(RM)收到請(qǐng)求后會(huì)執(zhí)行commit操作,但是未收到commit請(qǐng)求的節(jié)點(diǎn)由于事務(wù)無(wú)法提交贫贝,導(dǎo)致數(shù)據(jù)出現(xiàn)不一致問題秉犹。

三階段提交協(xié)議

三階段提交協(xié)議是兩階段提交協(xié)議的改進(jìn)版本,它利用超時(shí)機(jī)制解決了同步阻塞的問題

image.png

三階段提交協(xié)議的具體描述如下:

CanCommit(詢問階段)

事務(wù)協(xié)調(diào)者向參與者發(fā)送事務(wù)執(zhí)行請(qǐng)求稚晚,詢問是否可以完成指令崇堵,參與者只需要回答是或者不是即可,不需要做真正的事務(wù)操作客燕,這個(gè)階段會(huì)有超時(shí)中止機(jī)制鸳劳。

PreCommit(準(zhǔn)備階段)

事務(wù)協(xié)調(diào)者會(huì)根據(jù)參與者的反饋結(jié)果決定是否繼續(xù)執(zhí)行,如果在詢問階段所有參與者都返回可以執(zhí)行操作也搓,則事務(wù)協(xié)調(diào)者會(huì)向所有參與者發(fā)送PreCommit請(qǐng)求赏廓,參與者收到請(qǐng)求后寫redo和undo日志,執(zhí)行事務(wù)操作但是不提交事務(wù)傍妒,然后返回ACK響應(yīng)等待事務(wù)協(xié)調(diào)者的下一步通知幔摸。如果在詢問階段任意參與者返回不能執(zhí)行操作的結(jié)果,那么事務(wù)協(xié)調(diào)者會(huì)向所有參與者發(fā)送事務(wù)中斷請(qǐng)求颤练。

DoCommit(提交或回滾階段)

這個(gè)階段也會(huì)存在兩種結(jié)果抚太,仍然根據(jù)上一步驟的執(zhí)行結(jié)果來(lái)決定DoCommit的執(zhí)行方式。如果每個(gè)參與者在PreCommit階段都返回成功昔案,那么事務(wù)協(xié)調(diào)者會(huì)向所有參與者發(fā)起事務(wù)提交指令。反之电媳,如果參與者中的任一參與者返回失敗踏揣,那么事務(wù)協(xié)調(diào)者就會(huì)發(fā)起中止指令來(lái)回滾事務(wù)。

三階段提交協(xié)議和兩階段提交協(xié)議相比有一些不同點(diǎn)

? 增加了一個(gè)CanCommit階段匾乓,用于詢問所有參與者是否可以執(zhí)行事務(wù)操作并且響應(yīng)捞稿,它的好處是,可以盡早發(fā)現(xiàn)無(wú)法執(zhí)行操作而中止后續(xù)的行為。

? 在準(zhǔn)備階段之后娱局,事務(wù)協(xié)調(diào)者和參與者都引入了超時(shí)機(jī)制彰亥,一旦超時(shí),事務(wù)協(xié)調(diào)者和參與者會(huì)繼續(xù)提交事務(wù)衰齐,并且認(rèn)為處于成功狀態(tài)任斋,因?yàn)樵谶@種情況下事務(wù)默認(rèn)為成功的可能性比較大。

實(shí)際上耻涛,一旦超時(shí)废酷,在三階段提交協(xié)議下仍然可能出現(xiàn)數(shù)據(jù)不一致的情況,當(dāng)然概率是比較小的抹缕。另外澈蟆,最大的好處就是基于超時(shí)機(jī)制來(lái)避免資源的永久鎖定。需要注意的是卓研,不管是兩階段提交協(xié)議還是三階段提交協(xié)議趴俘,都是數(shù)據(jù)一致性解決方案的實(shí)現(xiàn),我們可以在實(shí)際應(yīng)用中靈活調(diào)整奏赘。比如ZooKeeper集群中的數(shù)據(jù)一致性寥闪,就用到了優(yōu)化版的兩階段提交協(xié)議,優(yōu)化的地方在于志珍,它不需要所有參與者在第一階段返回成功才能提交事務(wù)橙垢,而是利用少數(shù)服從多數(shù)的投票機(jī)制來(lái)完成數(shù)據(jù)的提交或者回滾。

分布式事務(wù)的兩個(gè)理論模型

1.CAP 定理

CAP 理論為:一個(gè)分布式系統(tǒng)最多只能同時(shí)滿足一致性(Consistency)伦糯、可用性(Availability)和分區(qū)容錯(cuò)性(Partition tolerance)這三項(xiàng)中的兩項(xiàng)柜某。(也就是說一致性和可用性不可兼得)

一致性(Consistency):

一致性指 (all nodes see the same data at the same time),即更新操作成功并返回客戶端完成后敛纲,所有節(jié)點(diǎn)在同一時(shí)間的數(shù)據(jù)完全一致喂击。(等同于所有節(jié)點(diǎn)訪問最新的數(shù)據(jù)副本,這是強(qiáng)一致性)

可用性(Availability):

可用性指(Reads and writes always succeed)淤翔,即服務(wù)一直可用翰绊,而且是正常響應(yīng)時(shí)間,系統(tǒng)對(duì)外提供的服務(wù)必須一直處于可用狀態(tài)旁壮,在任何故障下监嗜,客戶端都能在合理的時(shí)間內(nèi)獲得服務(wù)端的非錯(cuò)誤響應(yīng)。

分區(qū)容錯(cuò)性(Partition tolerance):

分區(qū)容錯(cuò)性指(the system continues to operate despite arbitrary message loss or failure of part of the system)抡谐,即分布式系統(tǒng)在遇到某節(jié)點(diǎn)或網(wǎng)絡(luò)分區(qū)故障的時(shí)候裁奇,仍然能夠?qū)ν馓峁M足一致性和可用性的服務(wù)。(出現(xiàn)網(wǎng)絡(luò)分區(qū))

為什么沒有CA/CAP

如果要實(shí)現(xiàn)CA或者說CAP這種情況麦撵,相當(dāng)于需要網(wǎng)絡(luò)百分百可用刽肠,否則當(dāng)出現(xiàn)網(wǎng)絡(luò)分區(qū)的情況時(shí)溃肪,為了保證數(shù)據(jù)的一致性,系統(tǒng)必須等待網(wǎng)絡(luò)分區(qū)故障結(jié)束之后音五,進(jìn)行數(shù)據(jù)同步惫撰,那么這個(gè)等待故障節(jié)點(diǎn)恢復(fù)的過程中,就必須拒絕客戶端的請(qǐng)求躺涝。但是如果拒絕了請(qǐng)求厨钻,就無(wú)法滿足A,所以在分布式系統(tǒng)中不可能選擇CA诞挨,因此只能有AP或者CP兩種選擇莉撇。(其實(shí)不是說沒有CAP,而是CA不共存惶傻,所以也就沒有CA的衍生特性CAP了)
AP:對(duì)于AP來(lái)說棍郎,相當(dāng)于放棄了強(qiáng)一致性,實(shí)現(xiàn)最終的一致银室,這是很多互聯(lián)網(wǎng)公司解決分布式數(shù)據(jù)一致性問題的主要選擇涂佃。
CP:放棄了高可用性,實(shí)現(xiàn)強(qiáng)一致性蜈敢。前面提到的兩階段提交和三階段提交都采用這種方案辜荠。可能導(dǎo)致的問題是用戶完成一個(gè)操作會(huì)等待較長(zhǎng)的時(shí)間抓狭。

notice:

網(wǎng)絡(luò)分區(qū);

不同節(jié)點(diǎn)分布在不同的子網(wǎng)絡(luò)中時(shí)伯病,在內(nèi)部子網(wǎng)絡(luò)正常的情況下,由于某些原因?qū)е逻@些子節(jié)點(diǎn)之間出現(xiàn)網(wǎng)絡(luò)不通的情況否过,導(dǎo)致整個(gè)系統(tǒng)環(huán)境被切分成若干獨(dú)立的區(qū)域午笛,這就是網(wǎng)絡(luò)分區(qū)。

2.BASE理論

BASE理論是對(duì)CAP訂立的一種延伸苗桂,他的思想就是:
即使無(wú)法做到強(qiáng)一致性药磺,也要做到最終一致性。也就是強(qiáng)調(diào)可以支持弱一致性煤伟。

基本可用(Basically Available)

基本可用是指分布式系統(tǒng)在出現(xiàn)故障的時(shí)候癌佩,允許損失部分可用性,即保證核心可用便锨。電商大促時(shí)围辙,為了應(yīng)對(duì)訪問量激增,部分用戶可能會(huì)被引導(dǎo)到降級(jí)頁(yè)面放案,服務(wù)層也可能只提供降級(jí)服務(wù)姚建。這就是損失部分可用性的體現(xiàn)。

軟狀態(tài)(Soft State)

軟狀態(tài)是指允許系統(tǒng)存在中間狀態(tài)卿叽,而該中間狀態(tài)不會(huì)影響系統(tǒng)整體可用性桥胞。分布式存儲(chǔ)中一般一份數(shù)據(jù)至少會(huì)有三個(gè)副本,允許不同節(jié)點(diǎn)間副本同步的延時(shí)就是軟狀態(tài)的體現(xiàn)考婴。MySQL Replication 的異步復(fù)制也是一種體現(xiàn)贩虾。

最終一致性(Eventual Consistency)

最終一致性是指系統(tǒng)中的所有數(shù)據(jù)副本經(jīng)過一定時(shí)間后,最終能夠達(dá)到一致的狀態(tài)沥阱。弱一致性和強(qiáng)一致性相反缎罢,最終一致性是弱一致性的一種特殊情況。

特性

弱一致性考杉,允許基本可用性

BASE理論和CAP定理的對(duì)比

BASE理論和CAP定理針對(duì)的都是分布式策精,BASE理論是對(duì)CAP定理的一種延伸,或者說是CAP定理實(shí)際應(yīng)用中的一種妥協(xié)崇棠,也就是弱一致性和允許基本可用性咽袜,主要是提出了軟狀態(tài),這個(gè)狀態(tài)是分布式系統(tǒng)實(shí)現(xiàn)一致性前的一種狀態(tài)枕稀,可以說是已執(zhí)行的延遲狀態(tài)询刹,BASE理論允許一定時(shí)間內(nèi)分布式節(jié)點(diǎn)出現(xiàn)這種中間狀態(tài),但是最終要實(shí)現(xiàn)一致性萎坷。

強(qiáng)一致性凹联,弱一致性,最終一致性

在我看來(lái)可能從宏觀上來(lái)看哆档,只有強(qiáng)一致性和弱一致性蔽挠,強(qiáng)一致性也就是線性一致性,他的所有數(shù)據(jù)同步過程都是同步的瓜浸,而弱一致性即其所有同步過程都不是同步的澳淑,即異步的,而最終一致性也是弱一致性中的一種體現(xiàn)斟叼,最終一致性指允許節(jié)點(diǎn)延遲一段時(shí)間后和主節(jié)點(diǎn)數(shù)據(jù)同步偶惠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市朗涩,隨后出現(xiàn)的幾起案子忽孽,更是在濱河造成了極大的恐慌,老刑警劉巖谢床,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兄一,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡识腿,警方通過查閱死者的電腦和手機(jī)出革,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)渡讼,“玉大人骂束,你說我怎么就攤上這事耳璧。” “怎么了展箱?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵旨枯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我混驰,道長(zhǎng)攀隔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任栖榨,我火速辦了婚禮昆汹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘婴栽。我一直安慰自己满粗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布居夹。 她就那樣靜靜地躺著败潦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪准脂。 梳的紋絲不亂的頭發(fā)上劫扒,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音狸膏,去河邊找鬼沟饥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛湾戳,可吹牛的內(nèi)容都是我干的贤旷。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼砾脑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼幼驶!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起韧衣,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盅藻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后畅铭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氏淑,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年硕噩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了假残。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡炉擅,死狀恐怖辉懒,靈堂內(nèi)的尸體忽然破棺而出阳惹,到底是詐尸還是另有隱情,我是刑警寧澤眶俩,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布穆端,位于F島的核電站,受9級(jí)特大地震影響仿便,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜攒巍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一嗽仪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柒莉,春花似錦闻坚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至跨蟹,卻和暖如春雳殊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窗轩。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工夯秃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痢艺。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓仓洼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親堤舒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子色建,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容