@@ -136,7 +136,7 @@ flowchart TB
136136
137137| 更贴近 CAP 讨论模型 | 需要拆分到分片/对象/操作级别分析 |
138138| ------------------- | ------------------------------------ |
139- | Redis 主从/哨兵集群 | 业务系统(无状态服务)\* |
139+ | Redis 主从/哨兵集群 | 业务系统(无状态服务) |
140140| MySQL 主从/多主集群 | Redis-Cluster(每个 shard 仍有副本) |
141141| MongoDB 副本集 | MongoDB-Cluster(分片 + 副本并存) |
142142| ZooKeeper、etcd | 分库分表(跨分片事务需额外协调) |
@@ -453,7 +453,7 @@ flowchart LR
453453
454454- ** 读时修复(Read Repair)** :在读取数据时,检测数据的不一致,进行修复。适合读多写少场景。
455455- ** 写时修复(Hinted Handoff)** :在写入数据时,如果目标节点不可用,将数据缓存下来,待节点恢复后重传。** 写时修复** 优化了写入延迟,但增加了读取时的不一致风险(数据可能还在缓存队列中未落盘到目标节点)。
456- - ** 异步修复(Anti-Entropy/反熵)** :通过后台比对副本数据差异并修复。工程实现中关键挑战是** 高效检测数据差异** ——暴力逐条比对(O(n))在大规模数据集下不可行,生产系统采用** 默克尔树(Merkle Tree)** 实现低开销差异定位:
456+ - ** 异步修复(Anti-Entropy/反熵)** :通过后台比对副本数据差异并修复。工程实现中关键挑战是** 高效检测数据差异** ——暴力逐条比对(O(n))在大规模数据集下不可行,生产系统采用** 默克尔树(Merkle Tree)** 实现低开销差异定位。
457457
458458** 选择建议** :
459459
@@ -525,48 +525,4 @@ flowchart TB
525525> - ** BASE 的可用性** = 分片式集群的可用性(部分节点故障只影响部分用户)
526526> - ** CAP 与 BASE 的关系** :选择 AP 架构后,BASE 理论指导如何在工程实践中通过最终一致性达到系统收敛
527527
528- ## 生产落地建议
529-
530- ### 选择 CP 还是 AP 的决策框架
531-
532- > ** 重要提示** :简单给系统贴「CP/AP」标签是有风险的。在网络分区下:
533- >
534- > - ** X 的写更倾向于优先保持线性一致** (可能拒绝服务/降级)
535- > - ** Y 更倾向于优先保持可用** (允许短时间读到旧数据)
536- > 具体取决于操作类型与配置。
537-
538- | 场景特征 | 倾向选择 | 典型系统说明 |
539- | ------------------------------ | -------------- | ----------------------------------------------------------- |
540- | 强一致性要求(金融转账) | 倾向线性一致写 | ZooKeeper(写入需 Quorum 确认)、etcd、Consul(CP 模式) |
541- | 高可用优先(服务发现) | 倾向可用性 | Eureka(允许读到旧实例)、Consul(可切换模式) |
542- | 可调一致性(根据业务动态选择) | 可配置 | Nacos(支持 CP/AP 切换)、Cassandra(可调节读写一致性级别) |
543- | 写多读少 | 倾向异步写优化 | Cassandra(可配置 QUORUM 写)、HBase |
544- | 读多写少 | 倾向低延迟读 | DynamoDB(可调节最终一致性级别) |
545-
546- ### 监控指标
547-
548- - ** 分区检测时间** :多久发现网络分区
549- - ** 收敛时间(Convergence Time)** :副本从不一致到一致的时间
550- - ** 读写延迟 P99** :CAP 权衡的直接体现
551- - ** 不一致窗口** :业务可接受的数据延迟
552-
553- ### 常见误区
554-
555- #### CAP 相关误区
556-
557- - ❌ 「选择了 AP 就永远放弃一致性」→ ✅ AP 系统可通过 Read Repair、Anti-Entropy(Merkle Tree)达到最终一致
558- - ❌ 「ZooKeeper 是强一致的」→ ✅ ZooKeeper 提供** 线性化写入** + ** 顺序一致性读取** (非最终一致性),读取存在滞后但保证全局顺序
559- - ❌ 「顺序一致性 = 最终一致性」→ ✅ 顺序一致性保证全局更新顺序,最终一致性不保证顺序;ZooKeeper 普通读取是前者而非后者
560- - ❌ 「银行系统必须 CP」→ ✅ 实际银行采用 BASE + 补偿事务(Saga),核心账务强一致,查询服务可最终一致
561- - ❌ 「业务系统不需要考虑 CAP」→ ✅ 业务系统虽不直接实践 CAP,但 RPC 路由、限流熔断、分布式锁等均受底层组件 CAP 属性影响,忽视会导致级联雪崩
562- - ❌ 「分库分表不需要考虑 CAP」→ ✅ 分片式存储通常仍然需要为每个 shard 做副本复制,因此仍需面对 CAP 的权衡
563- - ❌ 「CAP 的 A 等于低延迟/高 SLA」→ ✅ CAP 的可用性定义不包含延迟要求,只要求非故障节点必须返回响应(可以很慢)
564-
565- #### BASE 相关误区
566-
567- - ❌ 「BASE 是 CAP 的补充/延伸」→ ✅ BASE 首先是 ACID 的替代品;同时 BASE 是 AP 架构的工程实践指南(AP 选择了放弃强一致性,BASE 告诉你如何达到最终一致)
568- - ❌ 「BASE 的一致性 = CAP 的一致性」→ ✅ BASE 的一致性是状态一致性(= ACID 一致性),CAP 的一致性是数据一致性
569- - ❌ 「BASE 只适用于主从集群」→ ✅ BASE 适用于所有分布式系统;其「基本可用」概念在分片式集群中表现更明显(部分节点故障只影响部分用户)
570- - ❌ 「最终一致性是弱一致性」→ ✅ 最终一致性是弱一致性的升级版,保证系统最终会达到一致状态,而弱一致性不提供此保证
571-
572528<!-- @include: @article-footer.snippet.md -->
0 commit comments