分布式系統(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ù)的持久化。
兩階段提交協(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)
同步阻塞
所有參與者(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ī)制解決了同步阻塞的問題
三階段提交協(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ù)同步偶惠。