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