聊聊分佈式一致性之CAP理論和BASE理論

一致性

在分佈式系統中要解決的一個重要問題就是數據的複製。分佈式系統對於數據的複製需求一般都來自於以下兩個原因: 
1、爲了增加系統的可用性,以防止單點故障引起的系統不可用 
2、提高系統的整體性能,通過負載均衡技術,能夠讓分佈在不同地方的數據副本都能夠爲用戶提供服務

數據複製在可用性和性能方面給分佈式系統帶來的巨大好處是不言而喻的,然而數據複製所帶來的一致性挑戰,也是每一個系統研發人員不得不面對的,那就是一致性(consistency),總得來說,我們無法找到一種能夠滿足分佈式系統所有系統屬性的分佈式一致性解決方案。因此,如何既保證數據的一致性,同時又不影響系統運行的性能,是每一個分佈式系統都需要重點考慮和權衡的。於是,一致性級別由此誕生: 
1、強一致性 
這種一致性級別是最符合用戶直覺的,它要求系統寫入什麼,讀出來的也會是什麼,用戶體驗好,但實現起來往往對系統的性能影響大

2、弱一致性 
這種一致性級別約束了系統在寫入成功後,不承諾立即可以讀到寫入的值,也不久承諾多久之後數據能夠達到一致,但會儘可能地保證到某個時間級別(比如秒級別)後,數據能夠達到一致狀態

3、最終一致性 
最終一致性是弱一致性的一個特例,系統會保證在一定時間內,能夠達到一個數據一致的狀態。這裏之所以將最終一致性單獨提出來,是因爲它是弱一致性中非常推崇的一種一致性模型,也是業界在大型分佈式系統的數據一致性上比較推崇的模型。

隨着人們的努力,形成了很多理論來應對這種一致性,比如CAP和BASE。

CAP理論

什麼是CAP理論 
2000 年,Eric brewer教授指出了著名的CAP理論,後來Seth Gilbert 和 Nancy lynch兩人證明了CAP理論的正確性。CAP(Consistency,Availability,partition tolerance)理論告訴我們,一個分佈式系統不可能滿足一致性,可用性和分區容錯性這三個需求,最多隻能同時滿足兩個。 
CAP的三個方面分別是: 
強一致性(Consistency)。系統在執行過某項操作後仍然處於一致的狀態。在分佈式系統中,更新操作執行成功後所有的用戶都應該讀取到最新的值,這樣的系統被認爲具有強一致性。

可用性(Availability)。每一個操作總是能夠在一定的時間內返回結果,這裏需要注意的是“一定時間內”和“返回結果”。

分區容錯性(Partition Tolerance)。分區容錯性可以理解爲系統在存在網絡分區的情況下仍然可以接受請求(滿足一致性和可用性)。這裏網絡分區是指由於某種原因網絡被分成若干個孤立的區域,而區域之間互不相通。 
我們知道,我們的關係型數據庫就是滿足CA而捨棄了P,因爲數據庫對數據的強一致性要求較高,同時還有事務的需求。 
針對事務的處理,又延伸出來一個ACID規則。

ACID規則

ACID規則原來是在1970被Jim Gray定義,ACID事務解決了很多問題,但是仍然需要和性能做平衡協調,事務越強,性能可能越低,安全可靠性和高性能是一對矛盾。 
一個真正事務應該遵循ACID屬性,ACID事務才真正解決事務,包括併發用戶訪問同一個數據表記錄的頭疼問題。 
ACID的定義: 
Atomic原子性: 一個事務的所有系列操作步驟被看成是一個動作,所有的步驟要麼全部完成要麼一個也不會完成,如果事務過程中任何一點失敗,將要被改變的數據庫記錄就不會被真正被改變。 
Consistent一致性: 數據庫的約束 級聯和觸發機制Trigger都必須滿足事務的一致性。也就是說,通過各種途徑包括外鍵約束等任何寫入數據庫的數據都是有效的,不能發生表與表之間存在外鍵約束,但是有數據卻違背這種約束性。所有改變數據庫數據的動作事務必須完成,沒有事務會創建一個無效數據狀態,這是不同於CAP理論的一致性”consistency”. 
Isolated隔離性: 主要用於實現併發控制, 隔離能夠確保併發執行的事務能夠順序一個接一個執行,通過隔離,一個未完成事務不會影響另外一個未完成事務。 
Durable持久性: 一旦一個事務被提交,它應該持久保存,不會因爲和其他操作衝突而取消這個事務。很多人認爲這意味着事務是持久在磁盤上,但是規範沒有特別定義這點。

BASE理論

那什麼是BASE理論呢。 
eBay的架構師Dan Pritchett源於對大規模分佈式系統的實踐總結,在ACM上發表文章提出BASE理論,BASE理論是對CAP理論的延伸,核心思想是即使無法做到強一致性(Strong Consistency,CAP的一致性就是強一致性),但應用可以採用適合的方式達到最終一致性(Eventual Consitency)。

BASE是指基本可用(Basically Available)、軟狀態( Soft State)、最終一致性( Eventual Consistency)。 
BASE包含三個方面: 
基本可用(Basically Available) 
基本可用是指分佈式系統在出現故障的時候,允許損失部分可用性,即保證核心可用。 
電商大促時,爲了應對訪問量激增,部分用戶可能會被引導到降級頁面,服務層也可能只提供降級服務。這就是損失部分可用性的體現。 
軟狀態( Soft State) 
軟狀態是指允許系統存在中間狀態,而該中間狀態不會影響系統整體可用性。分佈式存儲中一般一份數據至少會有三個副本,允許不同節點間副本同步的延時就是軟狀態的體現。mysql replication的異步複製也是一種體現。 
最終一致性( Eventual Consistency) 
最終一致性是指系統中的所有數據副本經過一定時間後,最終能夠達到一致的狀態。弱一致性和強一致性相反,最終一致性是弱一致性的一種特殊情況。

比較

ACID是傳統數據庫常用的設計理念,追求強一致性模型。BASE支持的是大型分佈式系統,提出通過犧牲強一致性獲得高可用性。ACID和BASE代表了兩種截然相反的設計哲學。在分佈式系統設計的場景中,系統組件對一致性要求是不同的,因此ACID和BASE又會結合使用。 
以上就是分佈式一致性中的一些理論,指導着我們如何設計,如何做架構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章