在數(shù)據(jù)庫中,一些技術(shù)人員因為數(shù)據(jù)的一致性問題而導(dǎo)致數(shù)據(jù)庫的運行出現(xiàn)問題。那么何為數(shù)據(jù)的一致性呢?中培偉業(yè)《ORACLE高級管理與性能調(diào)優(yōu)最佳實踐》培訓(xùn)專家賈老師指出,在數(shù)據(jù)有多分副本的情況下,如果網(wǎng)絡(luò)、服務(wù)器或者軟件出現(xiàn)故障,會導(dǎo)致部分副本寫入成功,部分副本寫入失敗。這就造成各個副本之間的數(shù)據(jù)不一致,數(shù)據(jù)內(nèi)容沖突。 實踐中,導(dǎo)致數(shù)據(jù)不一致的情況有很多種,表現(xiàn)樣式也多種多樣,比如數(shù)據(jù)更新返回操作失敗,事實上數(shù)據(jù)在存儲服務(wù)器已經(jīng)更新成功。
賈老師指出,CAP定理是2000年,由 Eric Brewer 提出來的。Brewer認為在分布式的環(huán)境下設(shè)計和部署系統(tǒng)時,有3個核心的需求,以一種特殊的關(guān)系存在。這里的分布式系統(tǒng)說的是在物理上分布的系統(tǒng),比如我們常見的web系統(tǒng)。
3個核心的需求是:Consistency,Availability和Partition Tolerance,賦予了該理論另外一個名字 - CAP。
Consistency:一致性,這個和數(shù)據(jù)庫ACID的一致性類似,但這里關(guān)注的所有數(shù)據(jù)節(jié)點上的數(shù)據(jù)一致性和正確性,而數(shù)據(jù)庫的ACID關(guān)注的是在在一個事務(wù)內(nèi),對數(shù)據(jù)的一些約束。系統(tǒng)在執(zhí)行過某項操作后仍然處于一致的狀態(tài)。在分布式系統(tǒng)中,更新操作執(zhí)行成功后所有的用戶都應(yīng)該讀取到最新值。
Availability:可用性,每一個操作總是能夠在一定時間內(nèi)返回結(jié)果。需要注意“一定時間”和“返回結(jié)果”。“一定時間”是指,系統(tǒng)結(jié)果必須在給定時間內(nèi)返回。“返回結(jié)果”是指系統(tǒng)返回操作成功或失敗的結(jié)果。
Partition Tolerance:分區(qū)容忍性,是否可以對數(shù)據(jù)進行分區(qū)。這是考慮到性能和可伸縮性。
CAP定理認為,一個提供數(shù)據(jù)服務(wù)的存儲系統(tǒng)無法同事滿足數(shù)據(jù)一致性、數(shù)據(jù)可用性、分區(qū)容忍性。
為什么不能完全保證這個三點了,個人覺得主要是因為一旦進行分區(qū)了,就說明了必須節(jié)點之間必須進行通信,涉及到通信,就無法確保在有限的時間內(nèi)完成指定的行文,如果要求兩個操作之間要完整的進行,因為涉及到通信,肯定存在某一個時刻只完成一部分的業(yè)務(wù)操作,在通信完成的這一段時間內(nèi),數(shù)據(jù)就是不一致性的。如果要求保證一致性,那么就必須在通信完成這一段時間內(nèi)保護數(shù)據(jù),使得任何訪問這些數(shù)據(jù)的操作不可用。
如果想保證一致性和可用性,那么數(shù)據(jù)就不能夠分區(qū)。一個簡單的理解就是所有的數(shù)據(jù)就必須存放在一個數(shù)據(jù)庫里面,不能進行數(shù)據(jù)庫拆分。這個對于大數(shù)據(jù)量,高并發(fā)的互聯(lián)網(wǎng)應(yīng)用來說,是不可接受的。
在大型網(wǎng)站應(yīng)用中,數(shù)據(jù)規(guī)模總是快速擴張的,因此可伸縮性即分區(qū)容忍性必不可少,規(guī)模變大以后,機器數(shù)量也會變得龐大,這是網(wǎng)絡(luò)和服務(wù)器故障會頻繁出現(xiàn),要想保證應(yīng)用可用,就必須保證分布式處理系統(tǒng)的高可用性。所以在大型網(wǎng)站中,通常會選擇強化分布式存儲系統(tǒng)的可用性(A)和伸縮性(P),在某種程度上放棄一致性(C)。一般來說,數(shù)據(jù)不一致通常出現(xiàn)在系統(tǒng)高并發(fā)寫操作或者集群狀態(tài)不穩(wěn)(故障恢復(fù)、集群擴容等)的情況下,應(yīng)用系統(tǒng)需要對分布式數(shù)據(jù)處理系統(tǒng)的數(shù)據(jù)不一致性有所了解并進行某種意義上的補償和糾錯,以避免出現(xiàn)應(yīng)用系統(tǒng)數(shù)據(jù)不正確。