概念
?分布式系統(tǒng)中的數(shù)據(jù)一致性模型定義了在事務(wù)處理過(guò)程中,系統(tǒng)如何保證數(shù)據(jù)在不同節(jié)點(diǎn)間的正確性和一致性。
分類(lèi)
?在分布式系統(tǒng)中,一致性模型主要分為六大類(lèi):
?1.強(qiáng)一致性模型 (Strong Consistency)
?2.弱一致性模型 (Weak Consistency)
?3.最終一致性模型 (Eventual Consistency)
?4.線性一致性 (Linearizability)
?5.順序一致性 (Sequential Consistency)
?6.因果一致性 (Causal Consistency)
介紹
強(qiáng)一致性模型 (Strong Consistency)
?描述:所有節(jié)點(diǎn)在同一時(shí)間看到的數(shù)據(jù)完全一致
?特點(diǎn):
- 任何讀操作都能獲取最新的寫(xiě)入值
- 性能較低但可靠性最高(需要等待所有節(jié)點(diǎn)同步)
- 實(shí)現(xiàn)復(fù)雜度高
?缺點(diǎn):
- 犧牲了可用性
?實(shí)現(xiàn)方式:
?兩階段提交(2PC)、三階段提交(3PC),Raft/Paxos共識(shí)算法
示例:銀行轉(zhuǎn)賬(2PC)
?事務(wù):用戶(hù)A向用戶(hù)B轉(zhuǎn)賬100元。
?過(guò)程:
?準(zhǔn)備階段:協(xié)調(diào)者詢(xún)問(wèn)A和B的賬戶(hù)服務(wù)是否可執(zhí)行扣款和加款。
?提交階段:如果A和B都同意,則執(zhí)行轉(zhuǎn)賬;否則回滾。
?特點(diǎn):要么全部成功,要么全部失敗,保證數(shù)據(jù)強(qiáng)一致。
弱一致性模型 (Weak Consistency)
?描述:不保證讀操作能立即看到最新寫(xiě)入
系統(tǒng)并不保證續(xù)進(jìn)程或者線程的訪問(wèn)都會(huì)返回最新的更新過(guò)的值。用戶(hù)讀到某一操作對(duì)系統(tǒng)特定數(shù)據(jù)的更新需要一段時(shí)間,稱(chēng)這段時(shí)間為“不一致性窗口”。系統(tǒng)在數(shù)據(jù)寫(xiě)入成功之后,不承諾立即可以讀到最新寫(xiě)入的值,也不會(huì)具體的承諾多久之后可以讀到。
?特點(diǎn):
- 系統(tǒng)性能較高
- 可能出現(xiàn)暫時(shí)不一致(這段時(shí)間稱(chēng)為“不一致性窗口”)
?缺點(diǎn):
?犧牲了一致性
?典型應(yīng)用:
?DNS系統(tǒng)、網(wǎng)頁(yè)緩存
示例:社交媒體的點(diǎn)贊計(jì)數(shù)
?事務(wù):用戶(hù)A給某帖子點(diǎn)贊,計(jì)數(shù)+1。
?過(guò)程:
- 主數(shù)據(jù)庫(kù)更新點(diǎn)贊數(shù),但緩存可能不會(huì)立即刷新。
- 不同用戶(hù)可能短暫看到不同的點(diǎn)贊數(shù),但最終會(huì)一致。
最終一致性模型 (Eventual Consistency)
?描述:弱一致性的特例,保證在沒(méi)有新更新的情況下,最終所有訪問(wèn)都將返回最后更新的值
是弱一致性的一種特例。在這種一致性下系統(tǒng)保證用戶(hù)最終能夠讀取到某操作對(duì)系統(tǒng)特定數(shù)據(jù)的更新(讀取操作之前沒(méi)有改數(shù)據(jù)的其他更新操作)。在沒(méi)有故障發(fā)生的前提下,不一致窗口的時(shí)間主要受通信延遲,系統(tǒng)負(fù)載和復(fù)制副本的個(gè)數(shù)影響。
?特點(diǎn)
- 延遲較低
- 需要沖突解決機(jī)制
- 高可用和高性能
- 平衡了系統(tǒng)的 可用性/一致性
?實(shí)現(xiàn)方式:
?異步復(fù)制、消息隊(duì)列(Kafka)、Saga模式
?變種:
- 因果一致性(Causal Consistency)
- 讀寫(xiě)一致性(Read-your-writes Consistency)
- 會(huì)話一致性(Session Consistency)
- 單調(diào)讀一致性(Monotonic Read Consistency)
- 單調(diào)寫(xiě)一致性(Monotonic Write Consistency)
示例:電商訂單處理(Saga模式)
?事務(wù):用戶(hù)下單 → 扣庫(kù)存 → 支付 → 發(fā)貨。
?過(guò)程:
- 如果支付失敗,Saga會(huì)觸發(fā)補(bǔ)償事務(wù)(如恢復(fù)庫(kù)存)。
- 系統(tǒng)可能短暫不一致(如庫(kù)存已扣但支付未完成),但最終會(huì)調(diào)整。
?特點(diǎn):適用于長(zhǎng)事務(wù),避免長(zhǎng)時(shí)間鎖資源。
線性一致性 (Linearizability)
?描述:最強(qiáng)的單對(duì)象一致性模型
?特點(diǎn):
- 所有操作看起來(lái)像是原子性的
- 操作有全局順序
- 實(shí)現(xiàn)代價(jià)高
?實(shí)現(xiàn)方式:
? ZooKeeper、Redis
示例:分布式鎖(ZooKeeper)
?事務(wù):多個(gè)服務(wù)競(jìng)爭(zhēng)同一把鎖。
?過(guò)程:
- 服務(wù)A獲取鎖后,所有其他服務(wù)必須等待,直到鎖釋放。
- 所有節(jié)點(diǎn)看到的鎖狀態(tài)一致,沒(méi)有歧義。
?特點(diǎn):
?適用于分布式協(xié)調(diào),如選主、配置管理。
順序一致性 (Sequential Consistency)
?描述:所有節(jié)點(diǎn)看到的操作順序一致,但不一定實(shí)時(shí)
?特點(diǎn):
- 比線性一致性弱
- 保證操作的全局順序
- 不保證操作的實(shí)時(shí)性
?適用場(chǎng)景:
?分布式日志、數(shù)據(jù)庫(kù)復(fù)制
示例:數(shù)據(jù)庫(kù)主從復(fù)制
?事務(wù):主庫(kù)寫(xiě)入數(shù)據(jù),從庫(kù)異步復(fù)制。
?過(guò)程:
- 主庫(kù)按順序?qū)懭階 → B → C。
- 從庫(kù)可能延遲,但最終會(huì)按相同順序A → B → C同步。
?特點(diǎn):適用于讀寫(xiě)分離,讀操作可能讀到舊數(shù)據(jù)。
因果一致性 (Causal Consistency)
?描述:保證有因果關(guān)系的操作順序在所有節(jié)點(diǎn)一致
?特點(diǎn):
- 無(wú)因果關(guān)系的操作可以并發(fā)執(zhí)行
- 比順序一致性更高效
?適用場(chǎng)景:社交網(wǎng)絡(luò)、評(píng)論系統(tǒng)
示例:論壇的評(píng)論和回復(fù)
?事務(wù):
- 用戶(hù)A發(fā)表帖子(操作X)。
- 用戶(hù)B回復(fù)A的帖子(操作Y,依賴(lài)X)。
?過(guò)程:
- 所有節(jié)點(diǎn)必須先看到X,再看到Y(jié)。
- 但無(wú)關(guān)操作(如用戶(hù)C的獨(dú)立評(píng)論)可以亂序。
?特點(diǎn): 比順序一致性更靈活,適用于社交應(yīng)用。
總結(jié)
| 一致性模型 | 保證級(jí)別 | 示例 | 適用場(chǎng)景 |
|---|---|---|---|
| 強(qiáng)一致性 | 所有節(jié)點(diǎn)實(shí)時(shí)一致 | 銀行轉(zhuǎn)賬(2PC) | 金融、支付 |
| 弱一致性 | 可能短暫不一致 | 社交媒體點(diǎn)贊 | 緩存、CDN |
| 最終一致性 | 最終一致 | 電商訂單(Saga) | 微服務(wù)事務(wù) |
| 線性一致性 | 全局順序一致 | 分布式鎖(ZooKeeper) | 協(xié)調(diào)服務(wù) |
| 順序一致性 | 操作順序一致 | 主從數(shù)據(jù)庫(kù) | 數(shù)據(jù)復(fù)制 |
| 因果一致性 | 因果操作有序 | 論壇評(píng)論 | 社交網(wǎng)絡(luò) |
關(guān)鍵說(shuō)明:
- 強(qiáng)一致性通過(guò)同步阻塞實(shí)現(xiàn)最高一致性
- 最終一致性通過(guò)異步機(jī)制實(shí)現(xiàn)高可用
- 線性一致性是強(qiáng)一致性的強(qiáng)化版(包含實(shí)時(shí)性)
- 因果一致性在社交場(chǎng)景中平衡性能與正確性
- 實(shí)際系統(tǒng)常采用混合模式(如:支付用強(qiáng)一致,訂單用最終一致)