<xmp id="siekq">
<xmp id="siekq"><nav id="siekq"><strong id="siekq"></strong></nav>
<menu id="siekq"><menu id="siekq"></menu></menu> <dd id="siekq"></dd>
  • <xmp id="siekq"><nav id="siekq"></nav>
  • <menu id="siekq"><strong id="siekq"></strong></menu>
    <nav id="siekq"><code id="siekq"></code></nav>

    CAP 定理的含義

    作者: 阮一峰

    日期: 2018年7月16日

    騰訊課堂 NEXT 學院

    分布式系統(distributed system)正變得越來越重要,大型網站幾乎都是分布式的。

    分布式系統的最大難點,就是各個節點的狀態如何同步。CAP 定理是這方面的基本定理,也是理解分布式系統的起點。

    本文介紹該定理。它其實很好懂,而且是顯而易見的。下面的內容主要參考了 Michael Whittaker 的文章

    一、分布式系統的三個指標

    1998年,加州大學的計算機科學家 Eric Brewer 提出,分布式系統有三個指標。

    • Consistency
    • Availability
    • Partition tolerance

    它們的第一個字母分別是 C、A、P。

    Eric Brewer 說,這三個指標不可能同時做到。這個結論就叫做 CAP 定理。

    二、Partition tolerance

    先看 Partition tolerance,中文叫做"分區容錯"。

    大多數分布式系統都分布在多個子網絡。每個子網絡就叫做一個區(partition)。分區容錯的意思是,區間通信可能失敗。比如,一臺服務器放在中國,另一臺服務器放在美國,這就是兩個區,它們之間可能無法通信。

    上圖中,G1 和 G2 是兩臺跨區的服務器。G1 向 G2 發送一條消息,G2 可能無法收到。系統設計的時候,必須考慮到這種情況。

    一般來說,分區容錯無法避免,因此可以認為 CAP 的 P 總是成立。CAP 定理告訴我們,剩下的 C 和 A 無法同時做到。

    三、Consistency

    Consistency 中文叫做"一致性"。意思是,寫操作之后的讀操作,必須返回該值。舉例來說,某條記錄是 v0,用戶向 G1 發起一個寫操作,將其改為 v1。

    接下來,用戶的讀操作就會得到 v1。這就叫一致性。

    問題是,用戶有可能向 G2 發起讀操作,由于 G2 的值沒有發生變化,因此返回的是 v0。G1 和 G2 讀操作的結果不一致,這就不滿足一致性了。

    為了讓 G2 也能變為 v1,就要在 G1 寫操作的時候,讓 G1 向 G2 發送一條消息,要求 G2 也改成 v1。

    這樣的話,用戶向 G2 發起讀操作,也能得到 v1。

    四、Availability

    Availability 中文叫做"可用性",意思是只要收到用戶的請求,服務器就必須給出回應。

    用戶可以選擇向 G1 或 G2 發起讀操作。不管是哪臺服務器,只要收到請求,就必須告訴用戶,到底是 v0 還是 v1,否則就不滿足可用性。

    五、Consistency 和 Availability 的矛盾

    一致性和可用性,為什么不可能同時成立?答案很簡單,因為可能通信失敗(即出現分區容錯)。

    如果保證 G2 的一致性,那么 G1 必須在寫操作時,鎖定 G2 的讀操作和寫操作。只有數據同步后,才能重新開放讀寫。鎖定期間,G2 不能讀寫,沒有可用性不。

    如果保證 G2 的可用性,那么勢必不能鎖定 G2,所以一致性不成立。

    綜上所述,G2 無法同時做到一致性和可用性。系統設計時只能選擇一個目標。如果追求一致性,那么無法保證所有節點的可用性;如果追求所有節點的可用性,那就沒法做到一致性。

    [更新 2018.7.17]

    讀者問,在什么場合,可用性高于一致性?

    舉例來說,發布一張網頁到 CDN,多個服務器有這張網頁的副本。后來發現一個錯誤,需要更新網頁,這時只能每個服務器都更新一遍。

    一般來說,網頁的更新不是特別強調一致性。短時期內,一些用戶拿到老版本,另一些用戶拿到新版本,問題不會特別大。當然,所有人最終都會看到新版本。所以,這個場合就是可用性高于一致性。

    (完)

    留言(53條)

    三個圓為什么不能有重合?CAP也應該有前提,如果技術提升了,比如量子通信,CAP還能成立嗎?

    可以順便講講BASE

    引用Mike的發言:

    三個圓為什么不能有重合?CAP也應該有前提,如果技術提升了,比如量子通信,CAP還能成立嗎?

    網絡通信不管怎么樣都會有失敗的可能,只能盡量提高可用性

    看起來提高可用性是比較合理的

    沒有一致性只有可用性的使用場景是什么,可以給舉倆例子不

    引用史蒂夫的發言:

    網絡通信不管怎么樣都會有失敗的可能,只能盡量提高可用性

    我想表達的是,CAP不應該是拿來就用,而是需要帶有懷疑的精神看問題。

    學到了。每種架構都有其不可控的因素。沒有完美的設計。

    這個的前提是網絡通信可能失敗。假設解決了這個問題,那么就有更遠的通信,以后若是星球級的網絡通信呢?

    如果這3個指標不能同時做到,那分布式系統不是不靠譜么,現如今互聯網上這么多的分布式系統都是怎么解決這些問題的呢?

    AP 不是沒有C 只是在不能在某一刻實現數據一致性,只是有延時而已。

    "一般來說,分區容錯無法避免,因此可以認為 CAP 的 P 總是成立。"這個按照文中邏輯應該是P 總是不成立吧

    引用史蒂夫的發言:

    網絡通信不管怎么樣都會有失敗的可能,只能盡量提高可用性

    阮老師開頭已經說了,是 “介紹該定理”, 一個勁在這杠,有意思么

    要強一致性的地方: 唯一ID生成, 這種性能很差. 并發不高.

    要高可用: 最終一致, 即有可能讀到臟數據. 但是一段時間之后總是能夠讀到新數據.

    《前方的路》和《未來世界的幸存者》買到了

    老師您好,叨擾了,請問您是否有意向做公開課程和知識分享呢,當然是付費的。我們是一個還沒上線的區塊鏈APP

    引用迷茫的小白一個的發言:

    如果這3個指標不能同時做到,那分布式系統不是不靠譜么,現如今互聯網上這么多的分布式系統都是怎么解決這些問題的呢?

    很多折中的辦法,比如分布式存儲就是可用性+最終一致性

    就像最后說的,一般情況還是先保證可用性,然后才是一致性,當然兩個都很總要,最好都能滿足。

    例子讓我想到前端講的“漸進增強”。不要求所有訪問者體驗一致,關鍵是先能夠看到。

    小小筆誤:
    "鎖定期間,G2 不能讀寫,沒有可用性不"
    最后應該是多寫了一個“不”~

    阮老師,您首頁隨機圖片的那段代碼能不能拿來用啊????

    引用Mike的發言:

    三個圓為什么不能有重合?CAP也應該有前提,如果技術提升了,比如量子通信,CAP還能成立嗎?

    我感覺不成立了,因為運算速度超塊,

    引用阮老師的小粉絲的發言:

    我感覺不成立了,因為運算速度超塊,

    再快也不能等于零

    多個了‘不’

    阮老師,你推薦看的書我都買來看了哦,特別是《黑客與畫家》,《窮爸爸和富爸爸》。

    引用lance6716的發言:

    "一般來說,分區容錯無法避免,因此可以認為 CAP 的 P 總是成立。"這個按照文中邏輯應該是P 總是不成立吧

    分區相當于對通信的時限要求。系統如果不能在時限內達成數據一致性,就意味著發生了分區的情況,必須就當前操作在C和A之間做出選擇

    簡單明了 贊

    引用Mike的發言:

    三個圓為什么不能有重合?CAP也應該有前提,如果技術提升了,比如量子通信,CAP還能成立嗎?

    1. 量子通信不是這樣玩的……目前量子通訊還得借助傳統信道傳點東西,所以量子通訊只能用于機密傳輸(或者僅僅傳一串真隨機數)

    2. 只有所有服務器同時(或者高頻率同步)接收數據修改,才能同時滿足C和A。然而這個前提違反了P。

    3. 就是因為所有服務器并不總是能完成同步,才說“可以認為P總是成立”,于是C和A不能同時滿足。

    (ps: 2的前提不就是我們努力追求的嗎……)

    謝謝阮老師

    引用lance6716的發言:

    "一般來說,分區容錯無法避免,因此可以認為 CAP 的 P 總是成立。"這個按照文中邏輯應該是P 總是不成立吧

    我也這么覺得,是不是我們理解有問題啊

    引用lance6716的發言:

    "一般來說,分區容錯無法避免,因此可以認為 CAP 的 P 總是成立。"這個按照文中邏輯應該是P 總是不成立吧

    "分區容錯的意思是,區間通信可能失敗。"劃重點,注意看這一句,即“區間通信可能失敗”這件事總是成立

    引用lance6716的發言:

    "一般來說,分區容錯無法避免,因此可以認為 CAP 的 P 總是成立。"這個按照文中邏輯應該是P 總是不成立吧

    是的,分區容錯性是指具有容錯性,無法避免,那就是不總是滿足的,所以應該是描述不夠準確吧

    這個定理說的是,“一個分區的系統,不可能同時做到數據嚴格一致和即時響應”,要是總能保持實時一致的話那就不叫分區了。

    之前有人說阮一峰老師分享的很多知識都不準確,都是相當入門的概念,詳細理解之后都是錯的,我都沒有太care,因為很多分享的東西我也不需要深入學習,只是了解一下就好了。
    但是看到這盤文章之后,發現準確性實在是太有問題了。底下的評論也都是在裝畢討論一些不知所謂的東西。

    引用Cat的發言:

    之前有人說阮一峰老師分享的很多知識都不準確,都是相當入門的概念,詳細理解之后都是錯的,我都沒有太care,因為很多分享的東西我也不需要深入學習,只是了解一下就好了。
    但是看到這盤文章之后,發現準確性實在是太有問題了。底下的評論也都是在裝畢討論一些不知所謂的東西。

    所以為什么你不說一下哪里有問題呢?是不是這里空白的地方太小,你寫不下?

    引用Mike的發言:

    三個圓為什么不能有重合?CAP也應該有前提,如果技術提升了,比如量子通信,CAP還能成立嗎?

    是這樣的:她說的不能實現的意思,是不能完全滿足,因為總會有失敗的情況出現,技術提高了,是提高了它的可用范圍,但是最終還是會遇到瓶頸。

    我覺得提到 CAP 首先要先指明這是針對分布式 “存儲系統”的一個理論。

    引用lance6716的發言:

    "一般來說,分區容錯無法避免,因此可以認為 CAP 的 P 總是成立。"這個按照文中邏輯應該是P 總是不成立吧

    文中的討論邏輯是: 1. CAP定理表明,C、A、P必有1個不成立; 2. 一般情況下,P一定成立 所以,由1、2推導出C、A中必有1個不成立。后續的寫作也都是建立在這個推論基礎上。

    一致性和可用性例子,哪里有分區容錯?

    如果p成立還有其他什么事

    謝謝老師的講解 看其他博客差點被一些瞎扯的人給誤導了

    關于CAP理論,這一篇算是寫的比較準確且淺顯易懂的了。
    還是建議加上關于拜占庭將軍問題的前篇,和最終一致性等應用的續篇,這樣前因后果才完整。

    不過理論終究是理論,如果聯系實際Availability就很難確定。什么叫不可用呢?
    多久不響應叫不可用,是超過1秒,1毫秒還是永遠,永遠有多遠?
    還有一個因素就是分區的時間,理論中G1和G2的連接是永久斷開了,但是聯系實際難道中國和美國服務器連接斷了沒人去查,沒人去修嗎?難道不會建兩條物理鏈路隨時切換?

    所以把可用性的時間約束和分區的時間約束聯合起來考慮,現實中的分布式系統是有可能同時滿足CAP的。

    引用lance6716的發言:

    "一般來說,分區容錯無法避免,因此可以認為 CAP 的 P 總是成立。"這個按照文中邏輯應該是P 總是不成立吧

    分區容錯發生在分布式系統內部互訪通信,是指分布式網絡中部分網絡不可用,但系統依然正常對外提供服務。

    比如:北京的訂單系統,訪問上海的庫存系統,可能導致失敗。如果發生失敗,就要在A和C之間做出選擇。
    要么停止系統進行錯誤恢復,要么繼續服務但是降低一致性,所以說只能保證AP或CP。

    引用Mike的發言:

    我想表達的是,CAP不應該是拿來就用,而是需要帶有懷疑的精神看問題。

    你要懷疑什么?!這是已經嚴格證明過的定理。不是猜想。

    引用jason.zhang的發言:

    分區容錯發生在分布式系統內部互訪通信,是指分布式網絡中部分網絡不可用,但系統依然正常對外提供服務。

    比如:北京的訂單系統,訪問上海的庫存系統,可能導致失敗。如果發生失敗,就要在A和C之間做出選擇。
    要么停止系統進行錯誤恢復,要么繼續服務但是降低一致性,所以說只能保證AP或CP。

    都CP了還能叫正常對外提供服務嗎?

    引用yz的發言:

    看起來提高可用性是比較合理的

    不一定,對一致性要求比較高的系統,例如銀行

    分布式系統:在互相隔離的空間中,提供數據服務的系統。
    CAP抽象:不同空間的數據,在同一時間,狀態一致。

    C:代表狀態一致
    A:代表同一時間
    P:代表不同空間
    CP:不同空間中的數據,如果要求他們所有狀態一致,則必然不在同一時間。
    AP:不同空間中,如果要求同一時間都可以從任意的空間拿到數據,則必然數據的狀態不一致。
    CA:不同空間的數據,如果要求任意時間都可以從任意空間拿到狀態一致的數據,則空間數必然為1.

    個人認為:理論上,系統響應必定需要延時,如果,一致性同步時間小于或等于響應時間,那么在保證分區容錯和可用的基礎上,用戶在感官和體驗上是可以達到CAP的。

    引用jason.zhang的發言:

    分區容錯發生在分布式系統內部互訪通信,是指分布式網絡中部分網絡不可用,但系統依然正常對外提供服務。

    比如:北京的訂單系統,訪問上海的庫存系統,可能導致失敗。如果發生失敗,就要在A和C之間做出選擇。
    要么停止系統進行錯誤恢復,要么繼續服務但是降低一致性,所以說只能保證AP或CP。

    這個例子超贊

    個人理解,分區容錯性是指在部分機器掛掉或者不能通訊后,系統是否還能繼續提供正常的服務,因此P是必須要保證的。

    評論我看不下去了,簡單的說博主的原文沒有錯

    #chongzi:

    這個解釋既形象又準確

    當數據允許延遲的情況下,CAP同時保證,只是A被延遲處理了。
    只要要求實時的情況下,CAP無法同時保證。

    我是這么理解的

    我要發表看法

    «-必填

    «-必填,不公開

    «-我信任你,不會填寫廣告鏈接

    湖北快3湖北快3平台湖北快3主页湖北快3网站湖北快3官网湖北快3娱乐湖北快3开户湖北快3注册湖北快3是真的吗湖北快3登入湖北快3快三湖北快3时时彩湖北快3手机app下载湖北快3开奖 娄底 | 天水 | 曹县 | 任丘 | 甘南 | 包头 | 四川成都 | 柳州 | 南安 | 金华 | 福建福州 | 吕梁 | 任丘 | 阿拉尔 | 乐清 | 汉川 | 娄底 | 喀什 | 库尔勒 | 改则 | 萍乡 | 无锡 | 宜宾 | 燕郊 | 六盘水 | 梅州 | 六盘水 | 商丘 | 黔东南 | 廊坊 | 德宏 | 广汉 | 衡阳 | 赵县 | 桐城 | 绥化 | 七台河 | 白银 | 保定 | 博罗 | 克孜勒苏 | 新疆乌鲁木齐 | 阳江 | 泰兴 | 攀枝花 | 乌海 | 长垣 | 德阳 | 忻州 | 温岭 | 吉林长春 | 亳州 | 白银 | 运城 | 仁寿 | 宁夏银川 | 嘉峪关 | 烟台 | 台北 | 克孜勒苏 | 怒江 | 黄山 | 陵水 | 珠海 | 德州 | 巴中 | 毕节 | 馆陶 | 滕州 | 临猗 | 大理 | 湘潭 | 苍南 | 咸阳 | 楚雄 | 芜湖 | 韶关 | 盐城 | 无锡 | 铜陵 | 云浮 | 诸城 | 三明 | 新沂 | 吉安 | 垦利 | 青海西宁 | 沭阳 | 灵宝 | 嘉善 | 襄阳 | 温州 | 丽江 | 甘孜 | 青海西宁 | 四川成都 | 黄山 | 朔州 | 宁波 | 瑞安 | 阿勒泰 | 广饶 | 钦州 | 秦皇岛 | 兴安盟 | 日土 | 建湖 | 定西 | 巴彦淖尔市 | 绵阳 | 六盘水 | 镇江 | 赵县 | 普洱 | 邯郸 | 福建福州 | 西藏拉萨 | 邢台 | 怀化 | 宁波 | 益阳 | 广饶 | 济宁 | 海南 | 苍南 | 山东青岛 | 海西 | 高雄 | 神农架 | 阳江 | 张掖 | 海西 | 贵州贵阳 | 黔西南 | 东方 | 寿光 | 寿光 | 安徽合肥 | 宜宾 | 衢州 | 衡阳 | 澳门澳门 | 巴彦淖尔市 | 鹤壁 | 黄南 | 瓦房店 | 楚雄 | 琼海 | 三亚 | 双鸭山 | 张家口 | 朔州 | 牡丹江 | 宜宾 | 临汾 | 吉林长春 | 湛江 | 黑河 | 内江 | 湘潭 | 洛阳 | 德清 | 深圳 | 大庆 | 庆阳 | 池州 | 温岭 | 锦州 | 巢湖 | 海西 | 平凉 | 北海 | 嘉善 | 阿里 | 延边 | 广安 | 丽水 | 神农架 | 景德镇 | 长治 | 遵义 | 平顶山 | 肇庆 | 岳阳 | 西藏拉萨 | 邵阳 | 金华 | 宿州 | 梧州 | 青海西宁 | 屯昌 | 朔州 | 吉林长春 | 襄阳 | 黑河 | 江西南昌 | 高雄 | 钦州 | 仁寿 | 果洛 | 徐州 | 乐清 | 张北 | 塔城 | 阿里 | 赤峰 | 长兴 |