分布式事務(wù)
對(duì)于單機(jī)系統(tǒng)我們很容易實(shí)現(xiàn)一套滿足ACID的事務(wù)處理系統(tǒng),但是在分布式數(shù)據(jù)庫中枪芒,數(shù)字分散在各臺(tái)不同的機(jī)器上边坤,如何對(duì)這些數(shù)據(jù)進(jìn)行分布式的事務(wù)處理具有非常大的調(diào)整。在分布式環(huán)境中會(huì)碰到很多問題讼稚,比如機(jī)器宕機(jī)和各種網(wǎng)絡(luò)異常等括儒。雖然問題很多,但是為了保證分布式應(yīng)用程序的可靠性锐想,分布式事務(wù)是無法回避的帮寻。
分布式事務(wù)是指事務(wù)的參與者,支持事務(wù)的服務(wù)器赠摇,資源服務(wù)器以及事務(wù)管理器分別位于分布式系統(tǒng)的不同節(jié)點(diǎn)上固逗。一個(gè)分布式事務(wù)中會(huì)涉及多個(gè)數(shù)據(jù)源或業(yè)務(wù)系統(tǒng)的操作。
分布式事務(wù)場(chǎng)景
一個(gè)跨銀行的轉(zhuǎn)賬操作涉及調(diào)用兩個(gè)異地的銀行服務(wù)蝉稳,其中一個(gè)是本地銀行提供的取款服務(wù)抒蚜,另一個(gè)則是目標(biāo)銀行提供的存款服務(wù),這兩個(gè)服務(wù)本身是無狀態(tài)并且是相互獨(dú)立的耘戚,共同構(gòu)成了一個(gè)完整的分布式事務(wù)嗡髓。如果從本地銀行取款成功,但是因?yàn)槟撤N原因存款服務(wù)失敗了收津,那么就必須回滾到取款前的狀態(tài)饿这,否則用戶可能會(huì)發(fā)現(xiàn)自己的錢消失了。
CAP和BASE理論
對(duì)于本地事務(wù)或集中式事務(wù)處理系統(tǒng)撞秋,顯然我們可以采用被實(shí)踐證明很成熟的ACID模型來保證數(shù)據(jù)的嚴(yán)格一致性长捧。但是隨著分布式事務(wù)的出現(xiàn),傳統(tǒng)的單機(jī)事務(wù)已經(jīng)無法勝任了吻贿。特別是對(duì)于高并發(fā)的互聯(lián)網(wǎng)分布式系統(tǒng)來說串结,如果我們期望實(shí)現(xiàn)一套嚴(yán)格滿足ACID特性的分布式事務(wù),很可能出現(xiàn)在系統(tǒng)可用性和嚴(yán)格一致性之間的沖突----因?yàn)楫?dāng)我們要求分布式系統(tǒng)具有嚴(yán)格一致性時(shí),就很可能會(huì)犧牲掉系統(tǒng)的可用性肌割。但是卧蜓,可用性又是所有消費(fèi)者不允許我們討價(jià)還價(jià)的系統(tǒng)屬性。而對(duì)于一致性則是消費(fèi)者對(duì)一個(gè)軟件系統(tǒng)的剛需把敞。因此弥奸,在可用性和一致性之間我們無法存在一個(gè)兩全其美的方案,如何構(gòu)建一個(gè)兼顧可用性和一致性的分布式系統(tǒng)呢奋早?于是出現(xiàn)了CAP和BASE理論盛霎。
CAP理論
根據(jù)CAP理論,一個(gè)分布式系統(tǒng)不可能同時(shí)滿足一致性(C:Consistency),可用性(A:Availability)和分區(qū)容錯(cuò)性(P:Partition tolerance)這三個(gè)基本需求耽装,最多只能同時(shí)滿足其中的兩項(xiàng)愤炸。
一致性
在分布式環(huán)境中,一致性指數(shù)據(jù)在多個(gè)副本之間保持一致的特性剂邮。當(dāng)一個(gè)系統(tǒng)在數(shù)據(jù)一致的狀態(tài)下執(zhí)行更新操作后摇幻,應(yīng)該保證系統(tǒng)的數(shù)據(jù)仍然處于一致的狀態(tài)。
對(duì)于一個(gè)將數(shù)據(jù)副本分布在不同分布式節(jié)點(diǎn)上的系統(tǒng)來說挥萌,如果對(duì)第一個(gè)節(jié)點(diǎn)的數(shù)據(jù)進(jìn)行了更新操作并且更新成功后绰姻,并沒有使其它的節(jié)點(diǎn)上的數(shù)據(jù)得到相應(yīng)的更新,于是對(duì)其它節(jié)點(diǎn)的數(shù)據(jù)進(jìn)行讀取的時(shí)候引瀑,獲取的依然是老的數(shù)據(jù)(臟數(shù)據(jù))狂芋,這就是典型的分布式數(shù)據(jù)不一致的情況。在分布式系統(tǒng)中如果能做到針對(duì)一個(gè)數(shù)據(jù)項(xiàng)的更新操作執(zhí)行成功后憨栽,所有的用戶都可以讀取到最新的值帜矾,那么這樣的系統(tǒng)就被認(rèn)為具有強(qiáng)一致性(或嚴(yán)格的一致性)。
可用性
可用性是指系統(tǒng)提供的服務(wù)必須一致處于可用的狀態(tài)屑柔,對(duì)于用戶的每一個(gè)操作請(qǐng)求總是在有限的時(shí)間內(nèi)返回結(jié)果屡萤。
“有限的時(shí)間內(nèi)”是指,對(duì)于用戶的一個(gè)操作的請(qǐng)求掸宛,系統(tǒng)必須能夠在指定的時(shí)間(即響應(yīng)時(shí)間)內(nèi)返回對(duì)應(yīng)的處理結(jié)果死陆,如果超過了這個(gè)時(shí)間范圍,那么系統(tǒng)就被認(rèn)為是不可用的唧瘾。而且措译,“有限的時(shí)間內(nèi)”是一個(gè)系統(tǒng)設(shè)計(jì)之初就設(shè)定好的系統(tǒng)運(yùn)行指標(biāo),不同的系統(tǒng)之間會(huì)有很大的不同饰序。比如领虹,在支付系統(tǒng)中要求能夠在3秒返回,這樣不會(huì)影響用戶的體驗(yàn)求豫。而在搜索引擎中塌衰,比如Google要在0.3秒鐘返回上千萬個(gè)檢索結(jié)果诉稍,否則用戶會(huì)很失望,影響用戶的體驗(yàn)猾蒂。所以均唉,“有限的時(shí)間內(nèi)”在不同的系統(tǒng)差別很大。
“返回結(jié)果”是可用性另一個(gè)非常重要的指標(biāo)肚菠,它要求系統(tǒng)在完成對(duì)用戶請(qǐng)求的處理后,返回一個(gè)正常的響應(yīng)結(jié)果罩缴。正常的響應(yīng)結(jié)果通常能夠明確地反映出對(duì)請(qǐng)求的處理結(jié)果蚊逢,即成功或失敗,而不是一個(gè)令用戶感到困惑的結(jié)果箫章。比如烙荷,返回結(jié)果是一個(gè)系統(tǒng)錯(cuò)誤,如“OutOfMemoryError”等提示語檬寂,那么我們就認(rèn)為此時(shí)這個(gè)系統(tǒng)不可用终抽。
分區(qū)容錯(cuò)性
約束了一個(gè)分布式系統(tǒng)需要具有如下特征:分布式系統(tǒng)在遇到任何網(wǎng)絡(luò)分區(qū)故障的時(shí)候,需要能夠保證對(duì)外提供滿足一致性和可用性的服務(wù)桶至,除非整個(gè)網(wǎng)絡(luò)環(huán)境都發(fā)送了故障昼伴。
網(wǎng)絡(luò)分區(qū)是指在分布式系統(tǒng)中,不同的節(jié)點(diǎn)分布在不同的自網(wǎng)絡(luò)(機(jī)房或異地網(wǎng)絡(luò)等)中镣屹,由于一些特殊的原因?qū)е逻@些自網(wǎng)絡(luò)之間出現(xiàn)網(wǎng)絡(luò)不連通的狀況圃郊,但是各個(gè)自網(wǎng)絡(luò)的內(nèi)部網(wǎng)絡(luò)是正常的,這樣會(huì)導(dǎo)致整個(gè)系統(tǒng)的網(wǎng)絡(luò)被切分成了若干孤立的區(qū)域女蜈。
CAP定理應(yīng)用
放棄CAP定理 | 說明 |
---|---|
放棄P | 如果希望能夠避免系統(tǒng)出現(xiàn)分區(qū)容錯(cuò)性的問題持舆,簡(jiǎn)單做法就是將所有的數(shù)據(jù)(或者那些僅僅與事務(wù)相關(guān)的數(shù)據(jù))都放到一個(gè)分布式節(jié)點(diǎn)上。這樣的做法雖然無法100%地保證系統(tǒng)不會(huì)出錯(cuò)伪窖,但至少不會(huì)碰到由于網(wǎng)絡(luò)分區(qū)帶來的負(fù)面影響逸寓。但同時(shí)需要注意的是,放棄P就放棄了系統(tǒng)的可擴(kuò)展性 |
放棄A | 相對(duì)于放棄“分區(qū)容錯(cuò)性”來說覆山,放棄可用性則正好相反竹伸,做法是一旦系統(tǒng)遇到網(wǎng)絡(luò)分區(qū)或其他故障時(shí),那么受到影響的服務(wù)需要等待一定的時(shí)間汹买,因此在等待期間系統(tǒng)無法對(duì)外提供正常的服務(wù)佩伤,即不可用 |
放棄C | 這里的放棄一致性,并不是完全不要數(shù)據(jù)的一致性了晦毙,如果這樣的話生巡,那么系統(tǒng)的數(shù)據(jù)就都沒有意義了,整個(gè)系統(tǒng)就沒有意義了见妒。事實(shí)上孤荣,放棄一致性指的是放棄數(shù)據(jù)的強(qiáng)一致性,而保留數(shù)據(jù)的最終一致性。這樣的系統(tǒng)無法保證數(shù)據(jù)保持實(shí)時(shí)一致性盐股,但是能夠保證的是:數(shù)據(jù)最終會(huì)達(dá)到一致的狀態(tài)钱豁,這就引入了一個(gè)時(shí)間窗口的概念,具體多久能夠達(dá)到數(shù)據(jù)一致性取決于系統(tǒng)的設(shè)計(jì)疯汁,主要包括數(shù)據(jù)副本在不同節(jié)點(diǎn)之間的復(fù)制時(shí)間長(zhǎng)短 |
CAP定理結(jié)論
一個(gè)分布式系統(tǒng)不可能同時(shí)滿足一致性牲尺,可用性和分區(qū)容錯(cuò)性這三個(gè)需求。另一個(gè)方面幌蚊,對(duì)于一個(gè)分布式系統(tǒng)而言谤碳,分區(qū)容錯(cuò)性可以說是一個(gè)最基本的要求。因?yàn)榧热皇且粋€(gè)分布式系統(tǒng)溢豆,那么必然出現(xiàn)子網(wǎng)絡(luò)蜒简,網(wǎng)絡(luò)問題是一個(gè)必定會(huì)出現(xiàn)的異常情況,因此分區(qū)容錯(cuò)性也就成為了一個(gè)分布式系統(tǒng)必然要面對(duì)和解決的問題漩仙。因此搓茬,對(duì)于分布式系統(tǒng)而言,我們要把精力用在如何根據(jù)業(yè)務(wù)特點(diǎn)在C(一致性)和A(可用性)之間尋求平衡队他。