CAP原理
任何一個(gè)分布式系統(tǒng),只能滿足CAP三個(gè)中的兩個(gè)
CAP分別是什么
Consistency 一致性
一致性
"all nodes see the same data at the same time"兩個(gè)視角
客戶端:多并發(fā)訪問時(shí)更新過(guò)的數(shù)據(jù)如何獲取;
服務(wù)端:如何復(fù)制分布到整個(gè)系統(tǒng),保證數(shù)據(jù)最終一致性三種一致性策略
強(qiáng)一致性:對(duì)于關(guān)系型數(shù)據(jù)庫(kù),更新過(guò)的數(shù)據(jù)能立即被后續(xù)訪問看到
弱一致性:能容忍后續(xù)部分或全部訪問不到
最終一致性:如果經(jīng)過(guò)一段時(shí)間后要求能訪問到更新后的數(shù)據(jù)
CAP理論說(shuō)不能同時(shí)滿足的一致性指的是強(qiáng)一致性
Availability 可用性
"Reads and writes always succeed",服務(wù)一直可用
每一個(gè)可用性的分布式系統(tǒng),每一個(gè)非故障節(jié)點(diǎn)必須對(duì)每一個(gè)請(qǐng)求作出響應(yīng)。
一般衡量一個(gè)系統(tǒng)的可用性通過(guò)停機(jī)時(shí)間來(lái)計(jì)算。
5個(gè)9:可用水平99.999%
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ù)。
簡(jiǎn)單來(lái)說(shuō),就是在網(wǎng)絡(luò)中斷,消息丟失的情況下,系統(tǒng)依然能夠正常工作。
CAP權(quán)衡
CA without P
- 不存在,網(wǎng)絡(luò)分區(qū)是必然的,舍棄P意味著舍棄分布式系統(tǒng)
CP without A
一個(gè)分布式系統(tǒng)容許系統(tǒng)停機(jī)或者長(zhǎng)時(shí)間無(wú)響應(yīng),舍棄A保C
一旦發(fā)生網(wǎng)絡(luò)故障或者消息丟失,犧牲用戶體驗(yàn),等待所有數(shù)據(jù)全部一致后才可以訪問
最典型的,分布式數(shù)據(jù)庫(kù)。一致性是最基本最重要的條件
分布式存儲(chǔ)系統(tǒng)Redis,HBase,分布式協(xié)調(diào)組件Zookeeper
AP without C
為了保證高可用,需要在用戶訪問時(shí)可以馬上得到返回,每個(gè)節(jié)點(diǎn)只能用本地?cái)?shù)據(jù)庫(kù)提供服務(wù),這樣會(huì)導(dǎo)致全局?jǐn)?shù)據(jù)的不一致性
大多數(shù)大型互聯(lián)網(wǎng)應(yīng)用,由于主機(jī)眾多,部署分散,集群規(guī)模大,因此節(jié)點(diǎn)故障、網(wǎng)絡(luò)故障是常態(tài),需要保證可用性,犧牲一點(diǎn)強(qiáng)一致性,不會(huì)造成嚴(yán)重的用戶流失
比如:淘寶的購(gòu)物,12306的買票。這里犧牲的是強(qiáng)一致性
怎么取舍
沒有定論,根據(jù)場(chǎng)景定奪,適合的才是最好的。
一般,涉及到錢的必須保證C,網(wǎng)絡(luò)故障寧可停止服務(wù),保證CA,舍棄P
其他場(chǎng)景普遍做法是選擇AP,舍棄強(qiáng)一致性,退而求其次保證最終一致性