看《大明王朝1566》聊分散式中的CAP和BASE理論

battle_field發表於2019-04-08

概述 CAP 和 BASE 理論

基本上接觸過分散式系統的朋友都知道 CAP 和 BASE 理論,這兩個理論對工程實踐中的分散式架構設計具有重要的影響。CAP 理論是加州大學伯克利分校的 Eric Brewer 教授提出的,並被 MIT 的 Seth Gilbert 和 Nancy Lynch 使用學術理論進行了嚴格的證明。

CAP 和 BASE 理論都有數學證明,但今天打算以一種輕鬆些的方式來最兩個理論做個淺顯的解釋。

最近偶爾刷一集《大明王朝1566》,這部劇之前看過開頭幾集,後來因為畫質差沒資源沒有繼續看,最近優酷貌似重製了,清晰度好了一些,就偶爾有時間刷一集,這真是一部好劇啊。今天就拿大明王朝的故事背景來對 CAP 和 BASE 理論做個介紹吧,希望不會寫的太爛。

大明王朝故事背景

歷史上學過明朝設有內閣和司禮監,皇帝通過管理內閣和司禮監來管理天下,這種機制其實應該是很先進的皇權機制了。不過,明嘉靖帝,沉迷修道昇仙,執政期間嚴嵩父子把持朝政、一手遮天、貪墨不計其數。雖說內閣和司禮監腐敗嚴重,但劇裡內閣的嚴嵩和司禮監的呂公公在決策上還是會聽皇帝的。這就不講了,現在迴歸主題吧,現在主要引入劇中的如下幾個人:

  • 嘉靖:明朝皇帝,對於重要決策,一般會聯合內閣和司禮監進行商討,最終各方達成一致;
  • 嚴嵩:內閣首輔,主要管理兩京一十三省的各地官員;
  • 呂芳:司禮監總管,主要管理宮廷有關的事宜;
  • 楊金水:呂芳乾兒子,任浙江任織造局總管,主要負責江浙織造絲綢管理,賣絲綢,其實就是替皇帝做生意的;
  • 鄭泌昌、何茂才:嚴嵩手下,一個任浙江巡撫,一個是按察使,屬封疆大吏;
  • 海瑞:時任杭州淳安縣知縣,由裕王舉薦而來,奉命處理堤壩決堤後的賑災事情;

為什麼 CAP 無法同時被滿足?

故事發生時,南有戚繼光抗倭激戰,北有韃靼入侵,急需大量軍需,然經過長達二十多年的朝政腐敗,國庫空虛,皇帝經過與內閣和司禮監商量後,決定在浙江推行改稻為桑的國策,就是把稻田改為桑田養蠶生絲,進而多織絲綢出口賺錢,然而遭到農民反對,鄭必昌何茂才在收到嚴嵩兒子密令後,決定決堤淹城,以達到改稻為桑的目的,事發後,淳安全部被淹、建德半數被淹,災民無數。這時,海瑞出場了,其到達淳安後,發現貪腐嚴重,堤壩被毀另有隱情,阻止改稻為桑,決定一查到底。

海瑞畢竟是皇帝兒子舉薦的官兒,鄭何和楊金水等人不敢任意幹掉海瑞,只能上書上司,楊金水就寫信給呂芳,鄭何二人就寫信給嚴嵩兒子。因為改稻為桑推行不下去是大事啊,所以嚴嵩和呂芳都非常重視,收到來信後立即想了對策,然而兩人想的對策不一樣,等皇上來決定吧,決定完了下發到浙江官員。正巧這個時候嘉靖在修道昇仙,閉關不問世事。這樣,兩個人的意見不一致,並且無法達到統一,底下人都在等著回信,如果十天收不到回信下面可能就亂了,但是皇帝要閉關一個月。

上面這段陳述中:

  • 皇帝閉關就相當於嚴嵩和呂芳達成一致的通道斷了,在分散式中就是兩個節點發生了網路分割槽;

  • 底下人等著回信,十天沒收到回信就亂了,如果十天內收到了上面的回信,對應到分散式中就是保證了可用性;

  • 嚴嵩和呂芳就意見無法達成一致,那麼對應到分散式中就是沒有保證一致性

再簡述一下分散式系統中 CAP 的意義:

  • P 代表著分割槽容忍性,要滿足 P 就表示允許網路分割槽的發生(允許嘉靖帝閉關);

  • C 表示一致性,滿足 C 就要求所有節點資料需要一致(嚴嵩和呂芳意見應該達成一致);

  • A 表示可用性,就是說對於他人的請求,節點需要提供服務響應的返回(嚴嵩和呂芳不讓下面的人等過久)

那為什麼 CAP 無法同時滿足呢?

  • 如果滿足 CP,那麼由於嘉靖帝閉關的一個月期間(P),嚴嵩和呂芳無法通過嘉靖帝達成一致,如果要保證一致(C),那就只能等嘉靖帝出關,然而這需要一個月的時間,下面的人早就等瘋了,這就相當於服務不可用了,所以無法滿足 A;

  • 如果滿足 AP,那麼嚴嵩和呂芳必須在10天內回覆(A),然而皇帝閉關一個月(P),那麼兩人在十天內是無法達成一致的,也就是無法滿足 C;

  • 如果滿足 CA,要在10天內回覆下層官員,另外嚴嵩和呂芳兩人也要意見一致,那隻能在10天內請皇帝出關了,那就無法滿足 P;

不知道這麼講是否夠明白,CAP三個要求是無法同時滿足的,那 BASE 理論在 CAP 的基礎上做了什麼讓步和平衡?下面一起來看看。

BASE 基於 CAP 做了什麼樣的權衡?

BASE 包含三個方面:Basically Available(基本可用)、Soft state(弱狀態)和 Eventually consistent(最終一致性)。我們從上面的故事來說一下這幾個概念。

對於分散式系統來說,必須要滿足分割槽容錯性,否則各個節點就相當於一個節點了,分散式就沒有任何意義了。在滿足分割槽容錯性的條件下:

  • Basically Available

就是說節點在出現問題時,不是完全不可用,而是允許損失部分可用性。例如,嚴嵩和呂芳無法達成一致,這時不能讓下面等待一個月沒有回信,這時傳送一個降級的決策(例如讓下面官員先跟海瑞等進行斡旋,不讓其查到要命的證據),或者下面官員自己先搞一些應對措施,然後加長等待時間(可以等待一個月),這樣,整個系統不至於完全亂掉,而是先有一些應對措施。這就是基本可用。

  • Soft state

嚴嵩和呂芳先將自己的第一個建議性的決策下發,等待皇帝出關後再進行一致性決策。在第一個建議性的決策到最終一致性決策期間,其實兩方的意見並不一致,BASE理論允許在一定時間記憶體在這種狀態。這就是軟狀態。

  • Eventually consistent

在皇帝出關後,呂芳嚴嵩立即與皇帝協商,然後得到一致的決策。這個時候,如果下面應付不了,那麼會再次上書,這時,嚴嵩呂芳已經有了一致的結論,那麼再次下發給下層官員時,就是一致的決策了,這樣鄭必昌、何茂才、楊金水就可以已一致性的態度對待海瑞了。這就是最終一致性。

相關文章