CAP和工程权衡
CAP指出:在网络分离(Partition,P)环境中,分布式系统无法同时保证强一致性(Consistency,C)和可用性(可用性,A)。如果有P,则必须选择CP或AP。在没有划分的情况下,限制不适用,但会出现其他妥协-主要是延迟(后退)和成本。
实用工程超越了CAP:PACELC至关重要(如果P是选择C或A;否则-在Latency和Consistency之间选择),一致性模型,SLA/SLO,yuskeys和业务风险。
1)基本定义(无哲学)
一致性(C):所有客户都看到相同的结果"好像"操作是顺序执行的(线性可变性/强一致性)。
可用性(A):对未访问节点的每个请求都会在合理的时间内完成响应,即使分离也是如此。
分离(P):节点/区域集群之间的通信丢失或严重退化;本质上是大规模的"不可避免的"。
PACELC:在P下,选择C或A;else(当P不在时)选择L(低延迟)或C(强一致性)。
2)直观的选择图片
CP(一致性更重要):在分离时,我们拒绝/阻止一些请求,以免破坏不变量。适用于金钱,交易,余额会计。
AP(可用性更重要):我们总是回答,但我们允许暂时不一致,然后我们建立冲突(CRDT/默奇规则)。适用于sots-fids、喜欢计数器、腰带配置文件。
CA(同时为C和A):只有在没有P的情况下才有可能-也就是说,只要网络健康。在实际操作中,"CA"是临时状态而不是设计属性。
3)PACELC: 不要忘记延迟
没有P时,通常在低潜伏度(L)和强一致性(C)之间进行选择:- 区域之间的高度一致性=洲际法定人数⇒ p95的几十到数百毫秒。
- 本地阅读(低L)=较弱的保证(read-my-writes, bounded staleness, eventual)。
- PACELC有助于解释为什么"快速而严格"地在全球范围内是罕见的:光线不是即时的,而且法定人数随着网络的折叠而增加。
4)一致性模型(快速频谱)
Linearizable/Strong:好像一个顺序。
Serializable:等效于某些串行事务顺序(高于记录级别)。
阅读您的写作/Monotonic reads:客户在自己录制后读取新值。
Bounded staleness:读数不超过N版本/Δ t。
Eventual consistency:随着时间的流逝,所有副本都收敛了;必须解决冲突。
5)产品和协议中的CP和AP模式(概念上)
CP方法:法定日志/领导力(Raft/Paxos),严格的交易,全球领导者位置,同步复制。价格-在P下拒绝部分请求并增加延迟。
AP方法:多向导/多向导,CRDT,gossip分发,异步复制,冲突解决(LWW,矢量时钟,域代理函数)。价格是领域规则的暂时性和复杂性。
6)多区域妥协
全球领导者(CP):简单的逻辑,但"遥远"地区支付潜伏期;P-阻止记录。
本地领导者+asinchron (AP):写入速度快,然后复制;冲突的变化需要一个默契。
Geo partitioning:数据"生活"更接近用户/司法管辖区;跨区域-仅聚合。
禁止在没有传奇/CRDT的情况下进行双重写作:否则会收到幻影和双重注销。
7)工程不变量与业务解决方桉
首先,不变性:什么永远不能被破坏(双流量,负余量,键的唯一性),什么是"幸存的"事件(查看计数器,建议)。
然后选择:- 相应运算的"硬"→ CP不变式。
- "柔和"不变式→ AP,然后进行捏合。
8)缓解妥协的技术
缓存和CQRS:通过接近缓存/投影(AP)读取,写入严格的日志(CP)。
RPO/RTO作为一种折衷语言:可以丢失多少数据(RPO)以及恢复的速度(RTO)。
商定ID和时钟:单调计时器(Hybrid/TrueTime方法),ULID/Snowflake。
传奇/TSS:商业补偿而不是全球锁定。
CRDT和域名merge:用于收藏,柜台,"最后胜利"。
Bounded staleness: UX和准确性的平衡。
9)可观察性,SLO和事件管理
潜伏期SLO(p50/p95/p99)分别用于阅读/记录和区域。
SLO的可用性,考虑到该地区的操纵者。
Lag复制/冲突:冲突比例,平均解决时间。
P号标志上的 Alerta:跨区域渠道的时空激增,法定误差上升。
Degrade计划:仅读取模式,本地维护,然后默许,禁用"昂贵"功能。
10)策略选择支票清单
1.哪些不变量不能被破坏?什么允许事件发生?
2.是否需要低潜伏率的跨区域记录?
3.目标的SLO(潜在性/可用性)和成本(egress/replication)是什么?
4.manual merge还是只允许自动机(CRDT/规则)?
5.网络故障配置文件是什么: 频率、持续时间、爆炸无线电?
6.是否有合法的数据本地化(驻留)?
7.每个数据/操作类型可接受哪种一致性模型?
8.你会如何观察:泻湖,冲突,法定人数的状态?
9.P时系统在做什么: 阻塞、降级、分流?
10.P后恢复和返回数据的计划是什么?
11)典型错误
追逐"CA Forever"。首先,P必须提前选择-最好。
全局多向导没有默奇规则。冲突正在"吞噬"数据和信任。
强烈的一致性"无处不在"。过多的法定人数超过了p95/p99和预算。
没有交易/传奇的双重写作。丢失的不变式和幻影。
忽略PACELC。在和平时期,潜伏期受到影响,在暴风雨中,可及性受到影响。
冲突与滞后零遥测。问题仅对用户可见。
12)快速食谱
付款/余额:具有法定人数的CP存储;仅通过领导者进行记录;读取可以缓存,但是在关键的UX中-读取您的写作。
内容/炸药:AP复制+CRDT/商用规则;P-在本地服务,然后抓取。
全球SaaS:通过"tenant/region"进行地理分组;在"家庭"区域(CP)中进行严格的操作,通过异步投影(AP)进行报告/搜索。
Real Time信号:Anycast/edge+AP总线;关键命令通过确认通道(CP)。
审计/日志:唯一具有CP保证的真理来源(仅附录),周围是缓存和投影。
13)迷你建筑基准(口头)
写核心(CP):领导者+法定复制、严格不变、服务间效应传奇。
阅读平面(AP):实例化视图、缓存、搜索索引、异步更新。
Geo路由:用户进入"家庭"地区;P-本地模式+后续复制。
冲突引擎:CRDT/规则;冲突日志和人工解决手段。
可观察性:法定人数,滞后,网络事件图。
14)实用延迟数学(简单估计)
光学≈每1000公里5毫秒(RTT更大)。洲际法定人数→ p95很容易>150-250毫秒。
任何"全局强"记录都是昂贵的查询。如果UX需要<100-150毫秒,请考虑本地write-home+异步后果。
15)分离政策
CP路径:阻止法定人数以外的记录;包括仅读取;给用户诚实的地位。
AP路径:本地服务;标记版本;还原时-确定性商业;将冲突提升到解析队列。
二.结论
CAP不是教条,而是提醒:网络分离是不可避免的,项目必须提前选择在风暴中牺牲什么--可用性或严格的连贯性。PACELC在晴朗的天气中增加了关键的延迟轴。结合策略:将CP内核保持在不变量神圣的地方,将AP平面保持在速度和稳定性更重要的地方。设置遥测、降级计划和默奇过程-系统将保留数据和用户信任。