分布式系统之一致性
分布式系統(tǒng)一致性概念
在分布式系統(tǒng)中,數(shù)據(jù)一致性往往指的是由于數(shù)據(jù)的復(fù)制,不同數(shù)據(jù)節(jié)點中的數(shù)據(jù)內(nèi)容是否完整并且相同。
一致性的重要性
任何一個分布式系統(tǒng)都無法同時滿足Consistency(一致性)、Availability(可用性)、Partition tolerance(分區(qū)容錯性) 這三個基本需求。最多只能滿足其中兩項。 但是,一個分布式系統(tǒng)無論在CAP三者之間如何權(quán)衡,都無法徹底放棄一致性(Consistency),如果真的放棄一致性,那么就說明這個系統(tǒng)中的數(shù)據(jù)根本不可信,數(shù)據(jù)也就沒有意義,那么這個系統(tǒng)也就沒有任何價值可言。所以,無論如何,分布式系統(tǒng)的一致性問題都需要重點關(guān)注。
這里先簡單提一下,由于一個分布式系統(tǒng)不可能放棄一致性,那么為什么有的架構(gòu)師還說在某些場景中可以犧牲一致性呢?通常這里說的放棄一致性指的是放棄數(shù)據(jù)的強一致性。
一致性問題出現(xiàn)原因
將數(shù)據(jù)復(fù)制到分布式部署的多臺機器中,可以消除單點故障,防止系統(tǒng)由于某臺(些)機器宕機導(dǎo)致的不可用。 通過負載均衡技術(shù),能夠讓分布在不同地方的數(shù)據(jù)副本全都對外提供服務(wù),有效提高系統(tǒng)性能。
引入復(fù)制機制后,不同的數(shù)據(jù)節(jié)點之間由于網(wǎng)絡(luò)延時等原因很容易產(chǎn)生數(shù)據(jù)不一致的情況。
一致性模型
強一致性
當(dāng)更新操作完成之后,任何多個后續(xù)進程或者線程的訪問都會返回最新的更新過的值。這種是對用戶最友好的,就是用戶上一次寫什么,下一次就保證能讀到什么。但是這種實現(xiàn)對性能影響較大。
弱一致性
系統(tǒng)并不保證續(xù)進程或者線程的訪問都會返回最新的更新過的值。系統(tǒng)在數(shù)據(jù)寫入成功之后,不承諾立即可以讀到最新寫入的值,也不會具體的承諾多久之后可以讀到。但會盡可能保證在某個時間級別(比如秒級別)之后,可以讓數(shù)據(jù)達到一致性狀態(tài)。
最終一致性
弱一致性的特定形式。最終一致性,就是不保證在任意時刻任意節(jié)點上的同一份數(shù)據(jù)都是相同的,但是隨著時間的遷移,不同節(jié)點上的同一份數(shù)據(jù)總是在向趨同的方向變化。也可以簡單的理解為在一段時間后,節(jié)點間的數(shù)據(jù)會最終達到一致狀態(tài)。
目前分布式系統(tǒng)中廣泛實現(xiàn)的是最終一致性
最終一致性模型的變種
因果一致性:如果A進程在更新之后向B進程通知更新的完成,那么B的訪問操作將會返回更新的值。如果沒有因果關(guān)系的C進程將會遵循最終一致性的規(guī)則。
讀己所寫一致性:因果一致性的特定形式。一個進程總可以讀到自己更新的數(shù)據(jù)。
會話一致性:讀己所寫一致性的特定形式。進程在訪問存儲系統(tǒng)同一個會話內(nèi),系統(tǒng)保證該進程讀己之所寫。
單調(diào)讀一致性:如果一個進程已經(jīng)讀取到一個特定值,那么該進程不會讀取到該值以前的任何值。
單調(diào)寫一致性:系統(tǒng)保證對同一個進程的寫操作串行化。
總結(jié)
- 上一篇: 分布式系统之异常
- 下一篇: 服务降级,服务熔断,服务限流