一言以蔽之:過程鬆,結果緊,最終結果必須保持一致性
為了更好的描述客戶端一致性,我們通過以下的場景來進行,這個場景中包括三個組成部分:
· 存儲係統
存儲係統可以理解為一個黑盒子,它為我們提供了可用性和持久性的保證。
· Process A
ProcessA主要實現從存儲係統write和read操作
· Process B 和ProcessC
ProcessB和C是獨立於A,並且B和C也相互獨立的,它們同時也實現對存儲係統的write和read操作。
下麵以上麵的場景來描述下不同程度的一致性:
· 強一致性
強一致性(即時一致性) 假如A先寫入了一個值到存儲係統,存儲係統保證後續A,B,C的讀取操作都將返回最新值
· 弱一致性
假如A先寫入了一個值到存儲係統,存儲係統不能保證後續A,B,C的讀取操作能讀取到最新值。此種情況下有一個“不一致性窗口”的概念,它特指從A寫入值,到後續操作A,B,C讀取到最新值這一段時間。
· 最終一致性
最終一致性是弱一致性的一種特例。假如A首先write了一個值到存儲係統,存儲係統保證如果在A,B,C後續讀取之前冇有其它寫操作更新同樣的值的話,最終所有的讀取操作都會讀取到最A寫入的最新值。此種情況下,如果冇有失敗發生的話,“不一致性窗口”的大小依賴於以下的幾個因素:交互延遲,係統的負載,以及複製技術中replica的個數(這個可以理解為master/salve模式中,salve的個數),最終一致性方麵最出名的係統可以說是DNS係統,當更新一個域名的IP以後,根據配置策略以及緩存控製策略的不同,最終所有的客戶都會看到最新的值。
· Causal consistency(因果一致性)
如果Process A通知Process B它已經更新了數據,那麼Process B的後續讀取操作則讀取A寫入的最新值,而與A冇有因果關係的C則可以最終一致性。
· Read-your-writes consistency
如果Process A寫入了最新的值,那麼Process A的後續操作都會讀取到最新值。但是其它用戶可能要過一會才可以看到。
· Session consistency
此種一致性要求客戶端和存儲係統交互的整個會話階段保證Read-your-writes consistency.Hibernate的session提供的一致性保證就屬於此種一致性。
· Monotonic read consistency
此種一致性要求如果Process A已經讀取了對象的某個值,那麼後續操作將不會讀取到更早的值。
· Monotonic write consistency
此種一致性保證係統會序列化執行一個Process中的所有寫操作。
說起來很有趣,BASE的英文意義是堿,而ACID是酸。真的是水火不容啊。
· Basically Availble --基本可用
· Soft-state --軟狀態/柔性事務
"Soft state" 可以理解為"無連接"的, 而 "Hard state" 是"麵向連接"的
· Eventual Consistency --最終一致性
最終一致性, 也是是 ACID 的最終目的。
BASE模型反ACID模型,完全不同ACID模型,犧牲高一致性,獲得可用性或可靠性: Basically Available基本可用。支持分區失敗(e.g. sharding碎片劃分數據庫) Soft state軟狀態 狀態可以有一段時間不同步,異步。 Eventually consistent最終一致,最終數據是一致的就可以了,而不是時時一致。
BASE思想的主要實現有
1.按功能劃分數據庫
2.sharding碎片
BASE思想主要強調基本的可用性,如果你需要高可用性,也就是純粹的高性能,那麼就要以一致性或容錯性為犧牲,BASE思想的方案在性能上還是有潛力可挖的。