相信不少讀者容易搞混事務(wù)的ACID屬性亿鲜、事務(wù)隔離級(jí)別允蜈、CAP理論以及BASE理論都是什么,它們之間有什么關(guān)系蒿柳,本文將對(duì)這些看起來(lái)有一定關(guān)聯(lián)的概念做一個(gè)探討饶套。
事務(wù)的ACID屬性
談到數(shù)據(jù)庫(kù)事務(wù),ACID屬性總是無(wú)法繞過(guò)垒探,先了解下什么是ACID妓蛮,再跟后面內(nèi)容做一個(gè)對(duì)比,加深理解圾叼。
事務(wù)本質(zhì)上是由一組關(guān)聯(lián)SQL組成的執(zhí)行任務(wù)單元蛤克,事務(wù)必須符合4個(gè)基本屬性才能稱之為一個(gè)有效的事務(wù):
- A: Atomic, 原子性,一組執(zhí)行任務(wù)單元要么一起成功夷蚊,要么一起失敗撤銷构挤,不能存在部分成功的情況。
- C: Consistency惕鼓,一致性筋现,事務(wù)執(zhí)行結(jié)束后,邏輯上數(shù)據(jù)的完整性是不變的呜笑。
- I : Isolation, 隔離性夫否,事務(wù)之間彼此獨(dú)立,不會(huì)相互影響叫胁,不允許事務(wù)A讀取到事務(wù)B的中間狀態(tài)的情況凰慈。
- D: Durability,持久性驼鹅,事務(wù)執(zhí)行完成后微谓,數(shù)據(jù)就能持久存儲(chǔ),即便系統(tǒng)崩潰输钩,數(shù)據(jù)也能正巢蛐停恢復(fù)。
ACID的關(guān)注點(diǎn)主要集中在一次事務(wù)的基本能力訴求上买乃,而怎么達(dá)到事務(wù)的這些屬性要求姻氨,需要交由各個(gè)系統(tǒng)去考慮及實(shí)現(xiàn)。
事務(wù)的隔離級(jí)別
事務(wù)有4種隔離級(jí)別剪验,從隔離程度的低到高分別是:
Read uncommitted:讀未提交
一個(gè)事務(wù)尚未提交肴焊,其他事務(wù)就可以讀到它的中間狀態(tài)數(shù)據(jù)前联。
讀未提交的實(shí)現(xiàn)方式是,在事務(wù)過(guò)程中不做任何控制娶眷,一遍執(zhí)行事務(wù)一遍實(shí)時(shí)生效到數(shù)據(jù)庫(kù)中似嗤。
這個(gè)過(guò)程中如果其他事務(wù)在讀寫同一個(gè)數(shù)據(jù),那么最終結(jié)果是會(huì)發(fā)生錯(cuò)誤的届宠,也就是說(shuō)存在“臟讀”的可能性烁落。-
Read committed:讀已提交
事務(wù)只有在提交以后,其他事務(wù)才能讀到它的更新數(shù)據(jù)豌注。
讀已提交的實(shí)現(xiàn)方式是伤塌,同樣不做事務(wù)過(guò)程控制,只關(guān)注單個(gè)事務(wù)執(zhí)行過(guò)程的中間數(shù)據(jù)不直接入庫(kù)幌羞,而是在執(zhí)行完畢后一次性把緩存副本全部刷到數(shù)據(jù)庫(kù)中寸谜。
上述實(shí)現(xiàn)避免中間態(tài)外泄的問(wèn)題,避免了“臟讀”属桦,但無(wú)法避免一個(gè)事務(wù)在兩次讀取A數(shù)據(jù)的過(guò)程中數(shù)據(jù)被其他事務(wù)更新熊痴,導(dǎo)致兩次讀出來(lái)數(shù)據(jù)不一致的問(wèn)題,也就是“不可重復(fù)讀”聂宾。
Repeatable read:可重復(fù)讀
對(duì)事務(wù)過(guò)程的并發(fā)進(jìn)行控制果善,事務(wù)啟動(dòng)后會(huì)鎖著相關(guān)的數(shù)據(jù),禁止其他事務(wù)進(jìn)行讀寫系谐。
這樣又避免了“不可重復(fù)讀”的問(wèn)題巾陕,然而,如果事務(wù)過(guò)程包含count操作纪他,在兩次count之間鄙煤,有一個(gè)插入數(shù)據(jù)的事務(wù)執(zhí)行了,那么兩次count的內(nèi)容又會(huì)不一致茶袒,這就是“幻讀”梯刚。Serializable:序列化
所有事務(wù)進(jìn)入執(zhí)行隊(duì)列串行執(zhí)行,把并發(fā)事務(wù)disable掉薪寓,除了性能問(wèn)題亡资,序列化方案能避免所有問(wèn)題。
CAP理論
不同類型的分布式存儲(chǔ)系統(tǒng)向叉,對(duì)于數(shù)據(jù)可靠的要求程度是不同的锥腻,也就是說(shuō),不同人對(duì)于怎樣的一個(gè)系統(tǒng)算是可靠的定義是不一樣的母谎。那么通過(guò)怎樣的標(biāo)準(zhǔn)來(lái)衡量系統(tǒng)的可靠程度呢瘦黑?
Eric Brewer提出了分布式系統(tǒng)的三個(gè)衡量系統(tǒng)可靠性的指標(biāo),來(lái)論證分布式系統(tǒng)的可靠能力邊界,它們統(tǒng)稱CAP理論:
- Consitency: 一致性
分布式系統(tǒng)各節(jié)點(diǎn)之間的數(shù)據(jù)幸斥,是否能保證嚴(yán)格一致存崖,即每次的數(shù)據(jù)變更,要么同時(shí)在全部節(jié)點(diǎn)生效睡毒,要么全部不生效,不會(huì)出現(xiàn)只有部分節(jié)點(diǎn)生效的情況冗栗,即強(qiáng)一致性演顾。
舉例:
把分布式系統(tǒng)的數(shù)據(jù)A改成B,當(dāng)系統(tǒng)返回成功的時(shí)刻起隅居,任何查詢?cè)摂?shù)據(jù)的請(qǐng)求都能正確得到B钠至,期間不存在部分查詢得到A,部分得到B的中間狀態(tài)胎源。
再稍微擴(kuò)展下棉钧,對(duì)于一致性的等級(jí),可以進(jìn)一步分成三種:
1涕蚤、強(qiáng)一致性
指更新操作完成的時(shí)刻宪卿,對(duì)所有節(jié)點(diǎn)的讀操作都返回更新后的內(nèi)容(基于同一個(gè)數(shù)據(jù)副本)。
2万栅、弱一致性
指更新以后佑钾,允許部分或全部讀取的結(jié)果不能返回更新后的內(nèi)容。
3烦粒、最終一致性
指更新完成一段時(shí)間以后休溶,系統(tǒng)最終達(dá)成數(shù)據(jù)的一致性。
- Availability: 可用性
可用性指的是每一個(gè)向服務(wù)器發(fā)起的請(qǐng)求扰她,都能在可容忍的一定時(shí)間內(nèi)得到符合業(yè)務(wù)預(yù)期的響應(yīng)結(jié)果兽掰。 - Partition tolerance: 分區(qū)容忍性
分區(qū)容忍性指的是系統(tǒng)存在多個(gè)節(jié)點(diǎn)的情況下,不會(huì)因?yàn)槟巢糠止?jié)點(diǎn)故障導(dǎo)致服務(wù)完全不可用徒役。
存在分布式存儲(chǔ)系統(tǒng)的原因孽尽,除了高可用高性能的需求外,最基礎(chǔ)的就是數(shù)據(jù)有備份機(jī)制廉涕,不能存在由于某個(gè)節(jié)點(diǎn)的問(wèn)題導(dǎo)致全部數(shù)據(jù)丟失泻云。基于這個(gè)原因狐蜕,數(shù)據(jù)存儲(chǔ)系統(tǒng)分區(qū)是必須的宠纯。
但是分區(qū)又會(huì)帶入另一個(gè)問(wèn)題,就是分區(qū)系統(tǒng)間的網(wǎng)絡(luò)可能會(huì)抖動(dòng)层释、某些服務(wù)器可能會(huì)崩潰婆瓜,也就是說(shuō)分區(qū)出現(xiàn)數(shù)據(jù)狀態(tài)不一致等的情況幾乎是必然發(fā)生的,分布式存儲(chǔ)服務(wù)的設(shè)計(jì)必須容忍這種情況,并以某種方式讓數(shù)據(jù)最終能夠達(dá)成一致廉白。如果不允許此情況發(fā)生个初,唯一的解決方案就是沒(méi)有分區(qū),也就是單節(jié)點(diǎn)運(yùn)行猴蹂,而這又是服務(wù)器設(shè)計(jì)的兵家大忌院溺。
選擇AP還是CP的現(xiàn)實(shí)問(wèn)題
在理解了CAP理論的定義之后,我們知道了分區(qū)容忍性是必須滿足的磅轻,那么讓我們探討下CAP能否同時(shí)保障珍逸。
假設(shè)我們有一個(gè)由2臺(tái)服務(wù)器組成的分布式數(shù)據(jù)庫(kù)系統(tǒng),現(xiàn)在服務(wù)器之間的網(wǎng)絡(luò)斷開(kāi)了聋溜,然后存儲(chǔ)系統(tǒng)收到了一個(gè)更新操作谆膳,把數(shù)據(jù)A更新為B。
- 如果我們必須保證強(qiáng)一致性(C)撮躁。
1)我們可以讓一臺(tái)服務(wù)器接管所有更新跟后續(xù)的查詢請(qǐng)求漱病,也就是說(shuō)我們必須放棄另一臺(tái)機(jī)器,單機(jī)運(yùn)行把曼,即放棄分區(qū)容忍性杨帽,保障系統(tǒng)的強(qiáng)一致性以及可用性(CA)。
2)我們也可以選擇更新失敗嗤军,等待兩臺(tái)服務(wù)器之間的網(wǎng)絡(luò)連接恢復(fù)睦尽,然后再通知用戶重新發(fā)起請(qǐng)求,放棄可用性(CP)型雳。
- 如果我們必須保證可用性(A)当凡。
這意味著更新操作必須得到成功的響應(yīng)結(jié)果。
3)我們可以選擇兩臺(tái)服務(wù)器一起工作纠俭,每臺(tái)完成自己的獨(dú)立讀寫沿量,實(shí)現(xiàn)分區(qū)容忍性,等網(wǎng)絡(luò)恢復(fù)了再手工進(jìn)行服務(wù)器之間的數(shù)據(jù)同步冤荆,放棄強(qiáng)一致性(AP)朴则。
4)我們也可以選擇只讓一臺(tái)服務(wù)器工作,回到方案1钓简,放棄分區(qū)容忍性(AC)乌妒。
- 如果我們必須保證分區(qū)容忍性(P)。
也就是說(shuō)我們要讓兩臺(tái)服務(wù)器能夠同時(shí)處理請(qǐng)求外邓。
我們可以選擇回到假設(shè)2的方案1撤蚊,放棄強(qiáng)一致性(PC)。
或者可以選擇回到假設(shè)3的方案2损话,放棄可用性(PA)侦啸。
基于上述的假設(shè)槽唾,我們能夠清楚地知道,CAP中的三者不可兼得光涂,我們往往只能選擇兩個(gè)庞萍。
1、保障CA忘闻,舍棄P:
舍棄分區(qū)容忍性钝计,意味著我們只能讓一臺(tái)服務(wù)器接管所有的請(qǐng)求,放棄高可用齐佳。那么就有一個(gè)單點(diǎn)故障的問(wèn)題存在葵蒂,一旦單機(jī)掛了,那么整個(gè)系統(tǒng)就不可用了重虑。
因此,舍棄分區(qū)容忍性基本是不可接受的秦士。
大多數(shù)的關(guān)系型數(shù)據(jù)庫(kù)默認(rèn)都是CA模型缺厉,并不考慮分區(qū)容忍性,有時(shí)候我們會(huì)簡(jiǎn)單地采用master-slave的方式來(lái)做數(shù)據(jù)冷備隧土,這種方式實(shí)際上也是CA提针,因?yàn)閙aster掛了服務(wù)就不可用了。2曹傀、保障AP辐脖,舍棄C:
舍棄強(qiáng)一致性,意味著當(dāng)故障發(fā)生皆愉,有些用戶進(jìn)行寫操作以后嗜价,可能出現(xiàn)某些請(qǐng)求出現(xiàn)結(jié)果,某些請(qǐng)求又返回修改前的數(shù)據(jù)的情況幕庐,只要保障最終一致性就可以久锥。
在大多數(shù)對(duì)數(shù)據(jù)一致性不具有很強(qiáng)要求的應(yīng)用場(chǎng)景,可以采用這種方式异剥,比如各類緩存服務(wù)模塊瑟由,目標(biāo)是服務(wù)穩(wěn)定,至于數(shù)據(jù)是否完全一致冤寿,并不那么重要歹苦。
再接著第一點(diǎn)的master-slave方案中,有讀者又會(huì)提出問(wèn)題督怜,如果master-slave是一主多從殴瘦,主寫從讀呢?-- 這種就沒(méi)法保證一致性了号杠,實(shí)際上是AP模式痴施。3、保障CP,舍棄A:
放棄可用性辣吃,意味著當(dāng)故障發(fā)生的時(shí)候动遭,我們要讓整個(gè)系統(tǒng)處于不可用的狀態(tài),直到故障恢復(fù)神得,系統(tǒng)才能繼續(xù)響應(yīng)用戶的請(qǐng)求厘惦。
這樣的設(shè)計(jì)在應(yīng)用系統(tǒng)中大多在跟錢打交道的應(yīng)用中使用,當(dāng)故障發(fā)生的時(shí)候哩簿,我們讓寫的請(qǐng)求操作不可用宵蕉,只讀不寫,放棄寫的可用性节榜。
在關(guān)系型數(shù)據(jù)庫(kù)的分布式事務(wù)羡玛,或者像上文的master-slave的架構(gòu)升級(jí)版,主寫從讀宗苍,二階段提交稼稿,從掛了就舍棄,主掛了就重新選舉呢讳窟?
實(shí)際上這就是Zookeeper這種數(shù)據(jù)治理系統(tǒng)常用的解決方案让歼,保障了CP,但當(dāng)系統(tǒng)分裂程度達(dá)到分區(qū)的容忍范圍外的情況下(一般是1/2及以上丽啡,避免腦裂發(fā)生)谋右,系統(tǒng)會(huì)不可用,從而放棄可用性补箍。
BASE理論
BASE理論改执,即Basically Available, Soft state, Eventually consistency(基本可用,軟(過(guò)渡)狀態(tài)坑雅,并達(dá)到最終一致)天梧。
BASE理論是在CAP理論的三種剛性要求基礎(chǔ)上提出的折中方案,中心思想是根據(jù)業(yè)務(wù)場(chǎng)景霞丧,在可容忍范圍內(nèi)呢岗,盡可能保障用戶體驗(yàn)及服務(wù)可用。
- Basically Available:基本可用
系統(tǒng)即便在發(fā)生部分故障的情況下蛹尝,也能保持基本可用的狀態(tài)后豫。 - Soft state:軟(過(guò)渡)狀態(tài)
軟狀態(tài)指的是,允許存在中間存在數(shù)據(jù)不一致的情況突那,參考關(guān)于上文Consistency一節(jié)提到的三種一致性等級(jí)挫酿。 - Eventually consistency:達(dá)到最終一致
能通過(guò)自動(dòng)、手動(dòng)同步等方式愕难,讓數(shù)據(jù)達(dá)到最終一致性早龟。
總結(jié)
最后惫霸,我們來(lái)把事務(wù)ACID/隔離級(jí)別,CAP及BASE理論串一下葱弟。
- 一個(gè)生產(chǎn)可用的存儲(chǔ)系統(tǒng)要求至少得是一個(gè)分布式系統(tǒng)壹店,而通過(guò)CAP理論,我們得知分布式存儲(chǔ)系統(tǒng)不是萬(wàn)能的芝加,它具備能力邊界硅卢。
- CAP理論要求的三種指標(biāo)都太剛性,我們可以使用BASE理論來(lái)設(shè)計(jì)一個(gè)存在中間過(guò)渡狀態(tài)的實(shí)現(xiàn)方案藏杖。
- 如果存儲(chǔ)系統(tǒng)需要滿足事務(wù)需求将塑,需要達(dá)到ACID的4種屬性要求。
- 在具體實(shí)現(xiàn)事務(wù)的設(shè)計(jì)方案中蝌麸,存在4種相互隔離的級(jí)別可供選擇点寥,業(yè)務(wù)需根據(jù)自己的使用場(chǎng)景進(jìn)行選擇。