CAP 理論常被解釋為一種「三選二」定律,這是否是一種誤解?

時間 2021-05-11 16:00:04

1樓:四猿外

誤解,是誤解沒跑了。

-------先說一下在CAP之中怎麼選擇------

在設計分布式系統時,架構師們在 C、A、P 這三種特性裡,只能選擇兩種。

但是,這道 CAP 的選擇題,就像別人在問你「小明的父親有三個孩子,老大叫大朗,老二叫二郎,請問老三叫什麼」一樣。在以分布式存系統為限定條件的 CAP 世界裡,P 是早已經確定的答案,P 是必須的。

因為,在分布式系統內,P 是必然的發生的,不選 P,一旦發生分割槽錯誤,整個分布式系統就完全無法使用了,這是不符合實際需要的。所以,對於分布式系統,我們只能能考慮當發生分割槽錯誤時,如何選擇一致性和可用性。

而根據一致性和可用性的選擇不同,開源的分布式系統往往又被分為 CP 系統和 AP 系統。

當一套系統在發生分割槽故障後,客戶端的任何請求都被卡死或者超時,但是,系統的每個節點總是會返回一致的資料,則這套系統就是 CP 系統,經典的比如 Zookeeper。

如果一套系統發生分割槽故障後,客戶端依然可以訪問系統,但是獲取的資料有的是新的資料,有的還是老資料,那麼這套系統就是 AP 系統,經典的比如 Eureka。

說了這麼多,其實 CAP 定理本質很簡單,它就是一種分布式系統設計的不同理念概括,包括它說的一致性,可用性和分割槽容錯性。這就類似乙個大學的校訓,是極度概念化的東西。

所以,大白話來形容下 CAP 吧,CAP 就是告訴程式設計師們當分布式系統出現內部問題了,你要做兩種選擇:

要麼遷就外部服務,像外包公司。

要麼讓外部服務遷就你,像銀行。

遷就外部服務就是我們不能因為我們自己的問題讓外部服務的業務執行受到影響,所以要優先可用性。而讓外部服務遷就我們,就要優先一致性。

--------接下來再說對 CAP 的常見誤解

很多人在沒有對 CAP 做深入了解的情況下,聽到很多人說分布式系統必須在 CAP 三個特性裡選擇兩個,就覺得一套分布式系統肯定要麼只有可用性要麼只有一致性,不存在完整的可用性和一致性功能。

這種理解是大有問題的。因為,P 這種問題發生的概率非常低,所以:

當沒有出現分割槽問題的時候,系統就應該有完美的資料一致性和可用性。

你什麼時候見過乙個系統,當內部沒有問題的時候,會經常讓外部請求卡一下的?要麼就冷不丁的提供陳舊的老資料?那還能叫系統嗎?

這個理解也是不對的。當分割槽發生的時候,其實對一致性和可用性的抉擇是區域性性的,而不是針對整個系統的。

可能是在一些子系統做一些抉擇,甚至很可能只需要對某個事件或者資料,做一致性和可用性的抉擇而已。

比如,當我們做一套支付系統的時候,會員的財務相關像賬戶餘額,賬務流水是必須強一致性的。這時候,你就要考慮選 C。但是,會員的名字,會員的支付設定就不必考慮強一致性,可以選擇可用性 A。

一套分布式系統的執行,就像人生一樣,就是一次又一次的選擇。在不同階段,不同的時刻有不同的事件發生的時候,又怎麼可能會有完全一樣的選擇呢?

這種二元性的理解更是極其誤導人。

CAP 理論的三種特性不是 Boolean 型別的,不是一致和不一致,可用和不可用,分割槽和沒分割槽的這類二選一的選項。而是這三種特性都是範圍型別。

拿可用性來說,就像我從銀行取錢。當我目的是派發壓歲錢的時候,我很可能就想全要新票子,但是,新票子很可能就還得多乙個步驟,就是需要拿舊票子去換一些新票,此時,我可以多等會兒,能拿到新票子就好。而當我的目的就是做生活花銷的時候,票子是新是舊,我根本不那麼關心,快點拿到錢就行。

這就是可用性的範圍需求之一,對時延性的要求。

再比如,分割槽容錯則由於探測機制的問題,可能還得各節點搞投票去協商分割槽是否存在,當某一台機器出現了問題,可能不影響業務的話,就會被機器投票認為分割槽不存在。然後一直等到多數機器出現了問題,才會投票確認出現了分割槽問題。這就好像新冠疫情,還會分低、中、高風險區呢,不是一出現通訊故障就都被邏輯認定為分割槽問題。

四猿外:CAP理論該怎麼理解?為什麼是三選二?為什麼是CP或者AP?面試題有哪些?

2樓:Alkaid小船

是的,這是一種誤解。

我理解中的CAP中的P,並不是所謂的分割槽容錯性(Partition tolerance

),而僅僅只是指網路分割槽(Partition)我理解中的CAP理論:在分布式系統中,當P(網路分割槽)發生的時候,A(可用性)和C(持續性)這兩個之中,我們只能進行二選一,而不可兼得。

3樓:Xpecya

不算誤解,但嚴格來也說不是三選二

是AP CP二選一 AC算不上選項。

所以所謂的三選二其實也只有兩種方法選。

也就是要麼可用要麼一致。

今天的普遍做法是選擇可用和乙個能接受的一致性(即最終一致性)但這只適用於網際網路公司。

4樓:迷途書童

確實是一種誤解。

P代表著網路故障,網路故障是客觀存在的事情,我們是無法繞過去的。

CAP的問題可以簡化一些:當 P 發生的時候,我們應該如何選擇C和A?

5樓:chenxinlong

實際上是2選1. 在 C 和 A 之間選,因為你提到 CAP 的時候,意味著 P 已經是乙個既定事實了。

CAP 是 "分布式儲存系統的理論", 當你說到 CAP,意味著你是乙個分布式儲存系統。當你的儲存是分布式的,那麼 P 就已經不是可選的了。因為對於分布式儲存系統來說,具備 P 這個特性已經是乙個既定事實了。

什麼是不具備 P 的系統呢?就是你的儲存系統是中心化的,簡單說就是單機資料庫。這個資料庫掛了,或者你的服務和資料庫之間無法通訊了,或者你的服務於資料庫通訊超時了,你的整個系統就掛了,你沒得選。

CAP 理論既然是乙個 「分布式」 的理論,那麼把它套進單點裡就不合適了。

什麼是具備 P 的系統呢,就是你的儲存系統是分布式的。當發生了網路分割槽怎麼辦?這時候有兩個選擇,一就是要一致性不要可用性(C),二就是要可用性不要一致性(A)。

發生了網路分割槽之後你還能有在 C 和 A 之間選擇的餘地,因為你有得選擇,所以你能容忍網路分割槽,所以你具備分割槽容忍性。

我覺得應該叫做 「分布式儲存系統的 AP 二選一」 更好理解,C和A是在滿足了P之後而衍生出來的兩個選擇方案。沒有 P 就不會出現 C 和 A,所以不是三選二,而是二選一。

6樓:比昂日記

舉個例子, 服務或者儲存部署的機器是分region或者zone的, 比如,北京移動機房,北京聯通機房, 上海鐵通機房,正常情況下雖然處於不同的網路或者運營商,但是實際是可以聯通的。 但是如果部署在乙個機房,那麼出口的網路,光纖斷了(也可能是入口負責排程的如nginx等不可用了等),或者運營商提供的網路出了問題,那麼會造成整個服務的不可訪問的問題, 所以要分割槽, 分到不同的機房, 不同的運營商。就類似分region或者分zone。

這樣如果乙個機房出了問題,或者乙個乙個網路出了問題,還可以訪問其他的網路或者機房了, 這樣就提高了分割槽容錯性(P)。

順著這樣乙個思路, 是不是越多機房(全國各個城市,國外的),越多運營網路越好?越多可用性(A)提高了, 這個就帶來了乙個新的問題, 如果訪問分不到不同的機房或者網路,資料儲存到了對應的機房,機房見的訪問速度和跨城市的訪問延遲比較大, 這樣寫入到上海聯通機房的資料同步到北京移動機房的速度就會比較長,這樣造成乙個新的問題就是,上個使用者如果落到北京機房查詢相關的資料,這個時候上海機房的資料可能還沒有來得及複製到北京機房, 這樣造成了乙個問題就是一致性(C)的問題。

所以正常情況下, 都是在A -- 可用性和C--一致性之前的權衡, 是要更多的機房保證可用性,還是為了快速的節點同步保證一致性。

架構本身就是基於業務形態的平衡的權衡, 在CAP這個問題中,就是A與C的權衡。

7樓:lyning

當 P 是前提,A 和 C 只能選乙個,少了的前置條件往往就會讓很多沒有去驗證的人理解成三選二,不一定錯誤,但一定不嚴謹。

8樓:科技大昊哥

可用性本身就是連續譜,99-99.9-99.99-99.

999%。一致性也是,強一致性也即linearizability線性化,有界stale一致性,單調原子檢視一致性,字首一致性,最終一致性,你說哪個是一致性?網路分割槽不可避免,但是機率在不同場景不同,資料中心內機率極小,且事實上我們無法分辨網路分割槽還是只是響應延遲放大。

綜上所述,這是乙個trade off,可以看daniel abadi文章

9樓:facetothefate

是誤解,一般來說 P 是前提。所以基本是CA裡選,不是任意3選2.

為什麼呢?

P 意指分割槽容忍性。 這個分割槽容忍性什麼意思,很多人容易望文生義,不要見風就是雨,理解成別的什麼意思。所謂分割槽指的是網路分割槽的意思,這個一樣還是容易望文生義。

詳細一點解釋,比如你有A B兩台伺服器,它們之間是有通訊的,突然,不知道為什麼,它們之間的網路鏈結斷掉了。好了,那麼現在本來AB在同乙個網路現在發生了網路分割槽,變成了A所在的A網路和B所在的B網路。所謂的分割槽容忍性,就是說乙個資料服務的多台伺服器在發生了上述情況的時候,依然能繼續提供服務。

所以顯而易見的,P是大前提,如果P發生了,咱們的資料服務直接不服務了,還談個毛的可用性和一致性呢。

因此CAP要解釋成,當P發生的時候,A和C只能而選一。

舉個簡單的例子,A伺服器B伺服器同步資料,現在A B之間網路斷掉了,那麼現在發來A乙個寫入請求,但是B卻沒有相關的請求,顯然,如果A不寫,保持一致性,那麼我們就失去了A的服務,但是如果A寫了,跟B的資料就不一致了,我們自然就喪失了一致性。

這裡設計就涉及到架構師的選擇了。注意這裡的一致性是強一致性,意思是AB的資料時刻都是同步的,如果我們放棄了強一致性,不代表我們的資料就是一定是不一致的了,我們可以讓A先寫入本地,等到通訊恢復了再同步給B,這就是所謂的最終一致性,長遠的看我們的資料還是一致的,我們只是在某乙個時間視窗裡資料不一致罷了。如果這個時間視窗小過了使用者邏輯處理的時間。

那麼其實對於使用者來說根本毛都感覺不到。

最終一致性有個很有意思的協議叫gossip就跟傳八卦乙個意思,我就把我收到裡資訊裡我本地沒有的部分加到我本地,再把這個資訊發出去,那麼長遠的看,網路時好時壞,但是最終所有人都會有所有的資訊。因此我們還是能夠保證資料的最終一致性的。

綜上,CAP應該描述成,當發生網路分割槽的時候,如果我們要繼續服務,那麼強一致性和可用性只能2選1。

有沒有一種理論可以解釋什麼是真正的正義?

流動的銀 盲人摸象了解一下,理論可以試圖把握住正義的一部分,真正的正義需要在實踐中感悟。當然信上帝的可以聲稱自己通過上帝可以進行解決,但是不解決實際問題。 十個人欺負乙個人叫打架,一百個人欺負乙個人叫群毆,一萬個人欺負乙個人就叫正義。正義往往和法律掛鉤,正義或是法律,都是由人制定的,為了保障多數人的...

佛法到底是一種解釋,還是一種追求?

護法居士 如來明證下四法故。何謂為四。一曰一切萬物皆歸無常。二曰一切諸有悉為苦毒。三曰一切諸法皆無有我。四曰一切有形悉至於空無。為泥洹寂。 不等式的證明 問這種問題,1還是對佛法沒有信心,2對佛法沒有深信,1是因為不了解,2是因為沒有觀察,沒有實踐,將佛法當做世間法,和自己對立起來了。右手指月聽說過...

經常被舉報是一種怎樣的體驗?

知乎有乙個好,別人舉報你被刪了還不知道為什麼,我沒有針對惡意舉報行吧 我回去看了看答主的話,我很認同啊,要我回覆就是 認同答主的話 之類的,莫名其妙。越來越覺得貴乎真的沒意思,要不是google個問題第四條鏈結是貴乎我都不知道自己有新訊息。 徐榮華1 作為一枚被惡意舉報後導致大號被廢的心痛小答主也只...