在CAP理論中,C代表一致性,A代表可用性(在一定時間內,用戶的請求都會得到應答),P代表分區容錯。
這里分區容錯到底是指數據上的多個備份還是說其它的 ? 我感覺分布式系統中,CAP理論應該是C和A存在不可同時滿足, 既要保證高可用,又要保證強一致性,因為多個節點之間存在數據復制,所以要么保證強一致性,就不一定能在指定的時間內返回客戶的請求, 要么保證高可用,但是各個節點的數據不一定是一致的。 但是和P有什么關系呢 ?
一個分布式系統里面,節點組成的網絡本來應該是連通的。然而可能因為一些故障,使得有些節點之間不連通了,整個網絡就分成了幾塊區域。數據就散布在了這些不連通的區域中。這就叫分區。
當你一個數據項只在一個節點中保存,那么分區出現后,和這個節點不連通的部分就訪問不到這個數據了。這時分區就是無法容忍的。
提高分區容忍性的辦法就是一個數據項復制到多個節點上,那么出現分區之后,這一數據項就可能分布到各個區里。容忍性就提高了。
然而,要把數據復制到多個節點,就會帶來一致性的問題,就是多個節點上面的數據可能是不一致的。要保證一致,每次寫操作就都要等待全部節點寫成功,而這等待又會帶來可用性的問題。
總的來說就是,數據存在的節點越多,分區容忍性越高,但要復制更新的數據就越多,一致性就越難保證。為了保證一致性,更新所有節點數據所需要的時間就越長,可用性就會降低。C:集群中所有機器狀態是一致的。
A:客戶端訪問集群中任意一個節點,總能得到"處理成功"的結果
假設有五個節點:n1~n5 ,出現網絡分區被分成兩組:[n1~n2]和[n3~n5],那么當n1出來客戶端請求時(為了處理這種情況,也就是說"容忍網絡分區",即支持 P):
1:如果要保證C(一致性),那么它需要把消息復制到所有節點,但是網絡分區導致無法成功復制到n3~n5,所以它只能返回"處理失敗"的結果給客戶端。(這時系統就處於不可用狀態,即喪失了A)
2:如果要保證可用性A,那么n1就只能把消息復制到n2,而不用復制到n3~n5(或者無視復制失敗/超時),但n3同時也可能在處理客戶端請求(譬如對同一個值進行修改),n3也為了保證A而做了同樣的處理。 那么 [n1~n2]和[n3~n5]的狀態就不一致了,於是就喪失了 C。
那么如果不支持P(也就是不容忍網絡分區),也就是說 (很樂觀的認為)假設系統不會出現網絡分區C:集群中所有機器狀態是一致的。
A:客戶端訪問集群中任意一個節點,總能得到"處理成功"的結果
假設有五個節點:n1~n5 ,出現網絡分區被分成兩組:[n1~n2]和[n3~n5],那么當n1出來客戶端請求時(為了處理這種情況,也就是說"容忍網絡分區",即支持 P):
1:如果要保證C(一致性),那么它需要把消息復制到所有節點,但是網絡分區導致無法成功復制到n3~n5,所以它只能返回"處理失敗"的結果給客戶端。(這時系統就處於不可用狀態,即喪失了A)
2:如果要保證可用性A,那么n1就只能把消息復制到n2,而不用復制到n3~n5(或者無視復制失敗/超時),但n3同時也可能在處理客戶端請求(譬如對同一個值進行修改),n3也為了保證A而做了同樣的處理。 那么 [n1~n2]和[n3~n5]的狀態就不一致了,於是就喪失了 C。
那么如果不支持P(也就是不容忍網絡分區),也就是說 (很樂觀的認為)假設系統不會出現網絡分區分區容錯性P其實就是每個服務都會部署多個節點,這樣就可以保證此服務的一個節點掛了之后,此服務的其他節點依然可以響應,這就是分區容錯性。
但是一個服務有多個節點之后,一個服務的多個節點之間的數據為了保持一致性就要進行數據復制,在此過程中就會出現數據一致性C(強一致性)的問題。 (數據一致性包含強一致性,弱一致性,最終一致性,這里指的是強一致性)
如果一定要保持一致性C,可以不做分區,即每個服務都是單節點,這樣就不用考慮數據一致性問題了,但是每個服務只有一個節點,此節點掛了,此服務就能不可用了,分區就不能容錯了,那就不是高可用分布式系統了,所以一般分布式系統都必須滿足分區容錯性P。
在滿足了分區容錯性P后,想要滿足一致性C,一個服務的多個節點之間就必須進行數據復制達到數據一致之后再返回給調用者響應,然而在多個節點數據復制的過程中,可能節點之間會出現網絡等問題使得數據復制阻塞或失敗導致響應超時,服務調用失敗,這就失去了系統的可用性A。
如果不強制滿足強一致性,那在服務被調用的時候不用管數據復制的問題,直接返回響應,這就滿足了可用性,但是由於此服務的多個節點數據可能沒有完成復制,節點數據可能不一致,這就失去了系統的一致性。
結論:一個高可用的分布式系統分區容錯性P是一定要滿足的,在此基礎上,只能滿足可用性A或者一致性C。