參考資料:http://www.jdon.com/37625
CAP定理:在理論計算機科學中,CAP定理(CAP theorem),又被稱作布魯爾定理(Brewer's theorem),它指出對於一個分布式計算系統來說,不可能同時滿足以下三點:
- 一致性(Consistency)(所有節點在同一時間具有相同的數據)
- 可用性(Availability)(保證每個請求不管成功或者失敗都有響應)
- 分隔容忍(Partition tolerance)(系統中任意信息的丟失或失敗不會影響系統的繼續運作)
根據定理,分布式系統只能滿足三項中的兩項而不可能滿足全部三項。
架構師不要將精力浪費在如何設計能滿足三者的完美分布式系統,而是應該進行取舍。
ACID模型:ACID,是指數據庫管理系統(DBMS)在寫入/異動資料的過程中,為保證交易(transaction)是正確可靠的,所必須具備的四個特性:
- 原子性(Atomicity,或稱不可分割性)、
- 一致性(Consistency)
- 隔離性(Isolation,又稱獨立性)
- 持久性(Durability)。
在數據庫系統中,一個交易是指:由一系列數據庫操作組成的一個完整的邏輯過程。例如銀行轉帳,從原賬戶扣除金額,以及向目標賬戶添加金額,這兩個數據庫操作的總和,構成一個完整的邏輯過程,不可拆分。這個過程被稱為一個交易,具有ACID特性。ACID的概念在ISO/IEC 10026-1:1992文件的第四段內有所說明。
目前主要有兩種方式實現ACID:第一種是Write ahead logging,也就是日志式的方式。第二種是Shadow paging。
相關論述:
關系數據庫的ACID模型擁有 高一致性 + 可用性 很難進行分區:
Atomicity原子性:一個事務中所有操作都必須全部完成,要么全部不完成。
Consistency一致性. 在事務開始或結束時,數據庫應該在一致狀態。
Isolation隔離層. 事務將假定只有它自己在操作數據庫,彼此不知曉。
Durability. 一旦事務完成,就不能返回。
跨數據庫事務:2PC (two-phase commit), 2PC is the anti-scalability pattern (Pat Helland) 是反可伸縮模式的,JavaEE中的JTA事務可以支持2PC。因為2PC是反模式,盡量不要使用2PC,使用BASE來回避。
BASE模型反ACID模型,完全不同ACID模型,犧牲高一致性,獲得可用性或可靠性:
Basically Available基本可用。支持分區失敗(e.g. sharding碎片划分數據庫)
Soft state軟狀態 狀態可以有一段時間不同步,異步。
Eventually consistent最終一致,最終數據是一致的就可以了,而不是時時高一致。
BASE思想的主要實現有
1.按功能划分數據庫
2.sharding碎片
BASE思想主要強調基本的可用性,如果你需要High 可用性,也就是純粹的高性能,那么就要以一致性或容錯性為犧牲,BASE思想的方案在性能上還是有潛力可挖的。
現在NoSQL運動豐富了拓展了BASE思想,可按照具體情況定制特別方案,比如忽視一致性,獲得高可用性等等,NOSQL應該有下面兩個流派:
1. Key-Value存儲,如Amaze Dynamo等,可根據CAP三原則靈活選擇不同傾向的數據庫產品。
2. 領域模型 + 分布式緩存 + 存儲 (Qi4j和NoSQL運動),可根據CAP三原則結合自己項目定制靈活的分布式方案,難度高。
這兩者共同點:都是關系數據庫SQL以外的可選方案,邏輯隨着數據分布,任何模型都可以自己持久化,將數據處理和數據存儲分離,將讀和寫分離,存儲可以是異步或同步,取決於對一致性的要求程度。
不同點:NOSQL之類的Key-Value存儲產品是和關系數據庫頭碰頭的產品BOX,可以適合非Java如PHP RUBY等領域,是一種可以拿來就用的產品,而領域模型 + 分布式緩存 + 存儲是一種復雜的架構解決方案,不是產品,但這種方式更靈活,更應該是架構師必須掌握的。
相關書籍:語言與機器計算機科學理論導論