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读取和速度投影。通过正确的遥测,降级和测试,您可以保持正确性和用户体验。