CAP,能少了P?你知道嗎?
哈嘍,大家好,我是指北君。
大型網(wǎng)站幾乎都是分布式系統(tǒng),分布式系統(tǒng)也越來越重要,你也會(huì)發(fā)現(xiàn)周圍的許多事物已經(jīng)是分布式理論的最佳實(shí)踐了。
前言
分布式系統(tǒng)(distributed system)主要有三個(gè)指標(biāo) 一致性 (Consistency),可用性(Availability),分區(qū)容錯(cuò)性(Partition tolerance)。
一致性是指更新操作成功后,所有節(jié)點(diǎn)在同一時(shí)間的數(shù)據(jù)完全一致。
可用性是指用戶訪問數(shù)據(jù)時(shí),系統(tǒng)是否能正常響應(yīng)時(shí)間內(nèi)返回?cái)?shù)據(jù)。
分區(qū)容錯(cuò)性是指分布式系統(tǒng)在遇到某個(gè)節(jié)點(diǎn)或網(wǎng)絡(luò)分區(qū)故障時(shí),仍然能夠?qū)ν馓峁M足一致性和可用性的服務(wù)。
CAP理論基本可以定義為,以上的三個(gè)指標(biāo)不能全部做到,即只能同時(shí)滿足CA, CP, AP。
1. 分區(qū)容錯(cuò)性
分布式系統(tǒng)存在多個(gè)子系統(tǒng),每個(gè)子系統(tǒng)子網(wǎng)絡(luò)可以叫做區(qū)。各個(gè)節(jié)點(diǎn)之間的數(shù)據(jù)需要同步,子系統(tǒng)之間也需要通信。而分區(qū)容錯(cuò)指的是某個(gè)節(jié)點(diǎn)出現(xiàn)故障,而整個(gè)服務(wù)不會(huì)受到大的影響。
若一個(gè)服務(wù)為單節(jié)點(diǎn)服務(wù),那么它可以說是滿足CA。
C表示任何時(shí)間點(diǎn)讀取的數(shù)據(jù)都是相同的,保證了一致性。
A表示只要有節(jié)點(diǎn)可以用,那么就可以提供服務(wù)
由于是單節(jié)點(diǎn)服務(wù),那么總是滿足CA的條件。
而在分布式系統(tǒng)中,大多時(shí)候,單節(jié)點(diǎn)出問題之后,我們是需要保障整個(gè)系統(tǒng)都是可以使用的。所以可以認(rèn)為CAP中的P總是需要成立的。
2. 一致性
一致性指的是分布式系統(tǒng)中所有節(jié)點(diǎn)在同一時(shí)間訪問時(shí),返回?cái)?shù)據(jù)完全一致。
從客戶端看,就是并發(fā)訪問時(shí)獲取數(shù)據(jù)的一致性。
服務(wù)端來看,就是數(shù)據(jù)節(jié)點(diǎn)之間的同步問題,即節(jié)點(diǎn)之間通過通信保持?jǐn)?shù)據(jù)的實(shí)時(shí)更新。
也有對(duì)一致性分成強(qiáng),弱以及最終一致性三類。
強(qiáng)一致性 要求數(shù)據(jù)更新后,對(duì)于其他節(jié)點(diǎn),必須立馬同步,并可見。
弱一致性 可以允許在數(shù)據(jù)更新后,部分節(jié)點(diǎn)不能訪問到最新的數(shù)據(jù)。
最終一致性 要求一段時(shí)間內(nèi)不能訪問最新數(shù)據(jù),但是一段時(shí)間后,分布式系統(tǒng)的所有數(shù)據(jù)需要統(tǒng)一
3. 可用性
相對(duì)來說,可用性比較容易理解,就是說任何時(shí)候,我們都可以從系統(tǒng)中獲取數(shù)據(jù)。系統(tǒng)可以提供正常的用戶服務(wù)。不會(huì)出現(xiàn)操作失敗,訪問超時(shí)等情況
總結(jié)
由于網(wǎng)絡(luò)通信肯定會(huì)出現(xiàn)延遲丟包等問題,所以一般情況而言,分區(qū)容錯(cuò)性是必須實(shí)現(xiàn)的。那么分布式系統(tǒng)會(huì)在一致性和可用性之間進(jìn)行權(quán)衡, 即C和A之間的選擇。
CP without A 即要求一致性,每個(gè)請(qǐng)求都要求服務(wù)之間保持強(qiáng)一致性,分區(qū)則會(huì)使同步時(shí)間無限延長(zhǎng),如果網(wǎng)絡(luò)嚴(yán)重故障,消息丟失的情況下,用戶體驗(yàn)差,需要全部數(shù)據(jù)一致后才能提供訪問。比如Redis,Hbase 等就會(huì)要求數(shù)據(jù)一致性。Zookeeper 也是遵循CP原則,Leader節(jié)點(diǎn)掛掉之后,集群會(huì)進(jìn)行選舉,選舉期間整個(gè)Follower都是不可用的,需要同步數(shù)據(jù),所以需要Zookeeper恢復(fù)之后才可以使用。
AP without C 即要求高可用而且可以分區(qū),此時(shí)需要放棄一致性。分區(qū)節(jié)點(diǎn)出現(xiàn)故障時(shí),為了滿足高可用,每個(gè)節(jié)點(diǎn)只能使用本地的數(shù)據(jù)提供訪問,避免服務(wù)中斷。這種典型的應(yīng)用就是搶票等情形,前一秒還有票,當(dāng)我輸入驗(yàn)證碼之后再點(diǎn)擊,票已售罄。心里的草泥馬無限增生。Eureka是采用AP原則,犧牲一致性,達(dá)到可用性的目的。
在一致性方面做出讓步之后,有些系統(tǒng)會(huì)實(shí)現(xiàn)最終一致性,盡力保證整個(gè)系統(tǒng)的數(shù)據(jù)一致性。
分布式系統(tǒng)的一致性和可用性之間的選擇沒有固定的搭配,而需要根據(jù)不同的業(yè)務(wù)場(chǎng)景進(jìn)行選擇,吹牛沒用,合適才行。