1. 程式人生 > >三分鐘分散式CAP理論就這麼複雜

三分鐘分散式CAP理論就這麼複雜

分散式系統架構理論,定義了三種指標,理論說我們最多隻能滿足兩個。

## 分散式系統

首先我們這個理論所說的分散式系統,是指系統內會共享資料,互相有連線有互動,才能完成系統功能的的分散式系統。而這個理論的關注點是**資料**的讀寫。

 

## 三種指標

- Consistency 一致性:

這裡的一致性是針對於分散式讀寫的。對於一個分散式系統,當一條資料寫成功,那麼無論我怎麼使用這個系統,我都應當能馬上讀取到這條最新的資料。

不一致性的例子:我更新了一條微博,而我的關注者還不能看到。


- Avalilability 可用性:

是指系統應當隨時可用,在reasonable的時間內返回reasonable的結果。

一個反例:我更新了一條微博,我的關注者在刷我微博的時候顯示對方正在更新微博,請稍後再試,或者顯示一直在讀取中。


- Partition Toleranc 分割槽容忍性:

分散式環境中資料必然會被劃分成多個區分到不同的機器上,不同的機器之間會有資料交換。

而機器一多某臺機器發生發生故障的概率就會比較高,而且機器間資料的交換依賴於網路,網路也很有可能會有延時、丟包之類的問題。

分割槽容忍性就要求在分散式系統要考慮到分散式環境的複雜性的前提下能正常提供服務。

(原版cap中的p其實指的是網路分割槽現象[參考Wiki network partition] ,只由於網路裝置的影響,分散式叢集被劃分成多個子網,但這樣理解我始終想不通,可能這樣解釋更合理)


## 三種指標的意義

- CAP-P:

首先我們來看分割槽容忍性,由於我們討論的就是分散式環境,我們的系統肯定不能被這網路環境機器環境所影響,分割槽容忍性就是個公認的前提,要麼你就是很多個單機提供服務,但那不是分散式。為了實現分割槽容忍性,就需要我們設計多個數據副本,多個副本還不能在同一臺機器上,甚至要在多個機房、多個地區存放副本。如果有必要機器之間的網路也需要多個通道,防止網路通路出現問題。


- CAP-CA:

 

cap理論

 

前提環境保證了,我們就來討論下讀寫功能。系統的功能無外乎輸出輸出,也就是讀寫操作咯。對於讀寫操作我們需要在一致性和可用性之間有所取捨,當然並不是完全捨去另一方,而是我們不能完美的同時實現C和A。

為啥呢,前提P已經說了我們需要多副本分佈在多機器上,這副本之間同步資料是會有延時,其次如何保證在寫的同時(副本未同步完成)我的讀操作可能會發生在各個副本上,那我應該如何返回正確的資料。所以C和A只能完美保證一個。


## 例子

- 舍C保A(AP)的例子:

比如剛剛的微博這個例子,我們更新了一條微博,不是所有的人都能馬上刷出來的,對於哪些還只能刷出舊的微博資料的人來說資料就和我真實的操作不一致了。然而這種業務也不需要要求我們強一致性,沒有刷出我的最新微博,也不是什麼大事,大不了認為我沒有更新而已,對業務影響很小。但是呢也不能一直都不一致是吧,所以C還是不能丟的,可以遲到。


- 舍A保C(CP)的例子:

比如銀行賬戶的例子,大家生活中也許也已經注意到了,銀行轉賬需要幾個小時甚至幾天,都會顯示正在轉賬中。這時就是視作一種丟失可用性的狀態。當然這是業務決定的。


- 舍P保C又保A的場景:

不是分散式的場景的話,我們可以選擇CA,比如我是個小銀行,我的轉賬功能可以設計為多地賬戶不互通,只能本地轉賬,只在一臺伺服器上操作,保證可用性和一致性。但整體來看可用性和一致性都丟失了。


# 思考題 acid

通用的關係型資料庫設計理論,需要滿足四種指標:

- Atomicity 原子性:

- Consistency 一致性:

- Isolation 獨立性:

- Durability 永續性: