Strong Consistency:需要時
Strong Consistency(可線性化)是一種模型,其中所有操作看起來都像是在與真實時間一致的單個全球順序中即時一致地執行的。用戶將讀取最後一個確認值,並且兩個並行客戶端不會在邏輯上「超越」彼此。
嚴格的一致性提供了簡單的心理模型並保護了剛性不變量,但需要協調(法定人數/領導者),從而增加了延遲和對網絡分離的敏感性。
1)當Strong-約束時
財務和結算
資產負債表和註銷:「雙重浪費」是不可接受的。
轉賬和互換:同一數額不能兩次。
庫存和限制
剩下的商品/酒店座位/門票:你不能進入負值。
單位時間操作限制(信用限制,API信用)。
唯一性和完整性
唯一的Login/ID/重復數據消除規則。
域級不變量:「在部門中,醫生必須值班」,「隊列中不能有>N活動任務」。
審核和不可更改的日誌
作為真理的法律來源的事件:秩序和完整性至關重要。
如果違反不變性會帶來不可接受的商業風險(金錢損失、制裁、失去信任)-選擇Strong Consistency。
2)究竟是什麼「嚴格」
Linearizability(操作級別):閱讀看到最新的成功記錄;時代受到尊重。
Serializable(事務層):結果等效於按順序執行事務(可能是strong,但有時實現時沒有硬實時順序)。
一個重要的區別是:Serializable可以防止事務級別異常(phantom/write-skew),而Linearizable可以防止單個操作的即時性和順序。通常需要兩個屬性(例如,DB+事件日誌中的金錢)。
3)嚴格價格: PACELC和CAP
PACELC:當網絡分離(P)時,必須選擇C(嚴格)或A(可用性)。Strong → CP:拒絕或阻止比破壞不變性更好。當沒有分離(EL)時,支付L-協調/法定人數增加p95/p99。
實踐:strong for「不變核」,周圍是快速投影/緩存與事件,以免受到UX。
4)如何實現Strong Consistency
領導和法定人數
唯一的領導者接受記錄;閱讀-領導者或法定復制副本。
寫入「W」的法定人數和「R」讀取「R+W> N」的法定人數增加了閱讀「後者」的機會。
匹配算法
Raft/Paxos:復制日誌、多數確認、術語/索引。
同步復制:僅在法定人數保持不變之後才確認記錄。
時鐘和順序
TrueTime/Hybrid Logical Clocks (HLC):用於安全全局序列化的時鐘分頻器限制。
Fence-tokens/version:保護「早晨」領導者和分裂休息。
事務隔離
Serializable (SI+通過謂詞檢查沖突/loki):對幻影/寫作skew的保護。
Strict-serializable:相對於實時,序列化+線性。
5)多區域: 選擇和妥協
全球領導者(CP)
記錄通過一個領導區域進行;讀取是本地緩存/投影或通過領導。
優點:一個簡單的模型。缺點:p95/RTT到領導者,在P-阻止記錄。
區域領導者+同步法定人數
來自多個地區的地理分布法定人數;每個條目等待確認>50%。
優點:沒有單一的「狹窄脖子」,高穩定性。缺點:洲際潛伏。
Geo-partitioning
該地區「自制」數據(tenant/管轄權);全局操作-通過傳奇/聚合。
優點:本地記錄的延遲較低。缺點:規劃數據邊界。
6)設置R/W和閱讀
記錄:「W=majority」是strong的標準。
閱讀:- 「最新鮮」是「R=majority」或領導者的閱讀。
- 為了降低L-從副本中讀取次要屏幕的「stale-ok」(在UX中明確標記)。
- Read-repair/Lease read:在短租領頭羊時,優化不會失去嚴格性。
7)性能和UX
潛伏期:專註於客戶與領導者/法定人數(區域間數百毫秒)之間的RTT。
「Write-strong, read-fast」模式:在寫入+讀取緩存/投影上強制,作者使用RYW。
Batch/Packs:分組記錄,但註意尾部潛伏期。
降解輪廓:在事件中-僅讀取,誠實狀態,禁止危險突變。
8)嚴格路徑的可觀察性
度量標準
p50/p95/p99 latency:寫作法定人數、閱讀法定人數、領導閱讀。
法定人數的成功,重播/回滾,領導者變更。
復制時差(預計很小,但必須監視)。
讀數「stal」的比例(如果包括)。
Tracing
Spans:「領導者接受」,「復制」,「提交法定人數」。
Теги: `term`, `leader_id`, `quorum_size`, `region`.
p95/p99的增長,領導人的頻繁連任,法定時間,分裂大腦指標。
9)測試和混亂
Jepsen類似:網絡分離,延遲,drops,clock-skew。
安全不變量:不可能雙重支出/負余額/雙重預訂。
領導:領導者拒絕,在工作量下重新當選,假令牌。
讀取一致性:寫入後立即讀取必須看到「新」(RYW/linearizable read)。
10)事件花花公子
失去法定人數:切換到只讀,通知客戶,將條目發送到「家庭」區域,如果有地理分區。
潛伏期增長是跨區域的:暫時降低嚴格的記錄量(將部分線程遷移到隊列/投影中),並本地化流量。
領導者Flap:增加選舉時間,檢查網絡/小時漂移/GC停頓。
分裂大腦:啟用fence-tokens/lease驗證,停止操作員級別的舊領導者。
11)典型錯誤
要求Strong「無處不在」:潛伏期和成本的爆炸而不是專註於不變量。
嘗試在實際分離中成為CA:在P時刻,系統仍然做出選擇,通常是隱含的。
雙寫到不同的區域,沒有傳奇/協調員:幻影和不變量損失。
缺少RYW:用戶看不到他們剛剛錄制的實體--信任度下降。
忽略時鐘:沒有HLC/TrueTime邊界,很容易獲得「跳躍」時間和比賽。
沒有降解計劃:在P下,混亂的部分故障開始。
12)快速解決方案(食譜)
付款/資產負債表: 領導者+主要法定人數;strict-serializable交易;短暫的taymout,在P.
預訂(座位/插槽):通過領導者寫入,閱讀-帶有RYW的緩存;TTL儲備+TCC。
全球SaaS:關於「tenant/region」的地理分區;在家庭區域進行嚴格的操作,通過投影進行報告/搜索。
審計/期刊:僅附錄CP期刊;可以對讀數進行散列,但可以通過檢查點進行驗證。
13)售前支票清單
- 寫出要求強度的不變式;其余的在AR/投影中。
- 選擇的模式是:區域間/地理分區的單一領導者/法定人數。
- 對於關鍵路徑設置"W=majority","R=leader" majority"。
- 為UX提供RYW/monotonic;顯式標記為「stale-ok」讀數。
- 包括法定人數,滯後,潛伏期指標;p95/p99的異議和連任。
- 有一個階梯計劃:只閱讀、關閉危險突變、「暴風雨過後」排隊。
- 混沌測試:分裂,時鐘,領導者拒絕;驗證安全不變量。
- 合同文檔:嚴格的「可能滯後」是產品/支持的通信。
結論
Strong Consistency是一種保護錯誤不可接受的真理的工具。在剛性不變量周圍點點地應用它,有意識地支付協調風暴潛伏和可用性的費用。組合:CP內核用於臨界、AP讀取和速度投影。通過正確的遙測,降級和測試,您可以保持正確性和用戶體驗。