原文鏈接 : http://www.bugclosed.com/post/9
什么是CAP
所謂CAP原則,是指在分布式系統(tǒng)中Consistency(一致性)、 Availability(可用性)古话、Partition tolerance(分區(qū)容錯(cuò)性)三者不能同時(shí)得到。
- 一致性:在分布式系統(tǒng)中,一個(gè)數(shù)據(jù)存在多個(gè)副本的情況下梗夸,各個(gè)副本的值是否一致。
- 可用性:當(dāng)系統(tǒng)收到一個(gè)請(qǐng)求后号醉,在一定時(shí)間之內(nèi)反症,總是可以反饋一個(gè)結(jié)果給用戶(hù),無(wú)論成功還是失敗畔派。
- 分區(qū)容錯(cuò)性:當(dāng)網(wǎng)絡(luò)出現(xiàn)分割后铅碍,系統(tǒng)仍然可以提供服務(wù)。
CAP拆解
在當(dāng)今的基礎(chǔ)網(wǎng)絡(luò)中父虑,存在不同的網(wǎng)絡(luò)運(yùn)營(yíng)商该酗,不同地域,不同的骨干線(xiàn)路等情況士嚎。比如在CDN廠(chǎng)商會(huì)按照運(yùn)營(yíng)商和地域?qū)⒄麄€(gè)網(wǎng)絡(luò)分成不同的“覆蓋”呜魄,每個(gè)“覆蓋”可以作為一個(gè)獨(dú)立的服務(wù)節(jié)點(diǎn)提供覆蓋內(nèi)的用戶(hù)訪(fǎng)問(wèn)。為了進(jìn)行細(xì)分拆解莱衩,可以將“覆蓋”看做分區(qū)隔離性中的“區(qū)”;
CA
假設(shè)不考慮分區(qū)(P)的情況下爵嗅,只有一個(gè)分區(qū)(副本),副本的一致性自不必說(shuō)笨蚁,自然是一致的睹晒;可用性方面趟庄,一個(gè)節(jié)點(diǎn)的寫(xiě)入不需要同步到其他節(jié)點(diǎn),可以高效完成伪很。如果增加多個(gè)分區(qū)(提高分區(qū)容錯(cuò)性)戚啥,數(shù)據(jù)的寫(xiě)入需要同步到多個(gè)節(jié)點(diǎn)(強(qiáng)一致性,所有節(jié)點(diǎn)同步成功后再返回用戶(hù))锉试,增加了同步時(shí)間和同步失敗的可能性猫十,降低了可用性;如果采用弱一致性呆盖,即寫(xiě)入操作在主節(jié)點(diǎn)成功后即返回用戶(hù)結(jié)果拖云,再通過(guò)異步方式同步到多個(gè)分區(qū),那么會(huì)增加同步失敗和數(shù)據(jù)丟失的幾率应又,降低了一致性宙项。
CP
假設(shè)不考慮可用性(A)的情況下,多個(gè)分區(qū)之間可以采用強(qiáng)一致性的機(jī)制株扛,保證數(shù)據(jù)的高度一致性(要么都成功要么都失斢瓤稹)。比如某個(gè)分區(qū)出現(xiàn)了故障或者分隔席里,分區(qū)沒(méi)有了響應(yīng)叔磷,由于放棄了可用性,所以可以無(wú)限等待并不斷重試直到網(wǎng)絡(luò)恢復(fù)奖磁,分區(qū)可用后將副本數(shù)據(jù)同步到所有節(jié)點(diǎn)改基。
AP
假設(shè)不考慮一致性(C)的情況下,多個(gè)分區(qū)和副本可以提供高可用性咖为。分區(qū)越多秕狰,用戶(hù)越能就近訪(fǎng)問(wèn),提供響應(yīng)速度躁染;放棄了一致性后鸣哀,副本的寫(xiě)入操作可以寫(xiě)入主節(jié)點(diǎn)成功后即可返回成功,獲得搞可用性吞彤,然后通過(guò)異步的方式將副本同步到多個(gè)分區(qū)節(jié)點(diǎn)上我衬。
由此可見(jiàn),CAP三者確實(shí)不能同時(shí)滿(mǎn)足饰恕,只能根據(jù)具體的分布式業(yè)務(wù)場(chǎng)景做取舍和折中挠羔;比如銀行系統(tǒng)可以犧牲可用性從而保障CP,響應(yīng)慢一點(diǎn)(甚至網(wǎng)絡(luò)故障暫停服務(wù))總比賬戶(hù)資金出現(xiàn)錯(cuò)誤更優(yōu)埋嵌。而很多提供互聯(lián)網(wǎng)服務(wù)可以一定程度犧牲一致性來(lái)保障AP破加,因?yàn)榛ヂ?lián)網(wǎng)競(jìng)爭(zhēng)激烈,追求的是用戶(hù)體驗(yàn)和效率雹嗦,希望用戶(hù)隨時(shí)隨地能夠高效獲得服務(wù)范舀,而一致性則通過(guò)一系列的措施做到最終一致性即可合是。