✅ 分布式系统一致性模型笔记
一、CAP 理论中的一致性(Consistency)
📌 定义
CAP 理论中的“C”指的是 线性一致性(Linearizability),即:
所有节点在同一时刻看到的数据是完全一致的,每次读取都能读到最新的写入。
-
强一致性的代价是牺牲系统的可用性(例如发生网络分区时)。
二、工程实践中常见的一致性模型(从强到弱)
1. 强一致性(Strong Consistency / Linearizability)
-
✅ 每次读取都返回最新写入的结果。
-
📌 就像访问单机内存一样,一致性最强。
-
❌ 通常需要分布式锁、Raft/Paxos 等协议,性能开销大。
-
✅ 常见于分布式数据库的强事务(如 Google Spanner、Zookeeper)
2. 顺序一致性(Sequential Consistency)
-
✅ 所有操作按某个全局顺序执行。
-
❗但不一定是实时的(即不是线性化的时间顺序)。
-
✅ 所有节点观察到的顺序相同,但不一定是提交顺序。
-
应用于:共享内存模型、多线程 CPU 操作顺序。
3. 因果一致性(Causal Consistency)
-
✅ 如果操作 A 发生在 B 之前(有因果关系),所有节点都保证看到 A 在 B 前。
-
❌ 无因果关系的操作,顺序可能不同步。
-
实现方式:版本向量、逻辑时钟(如 Lamport Clock)
-
应用于:社交网络(先发动态、再点赞)
4. 会话一致性(Session Consistency)
-
✅ 同一客户端在一个会话中,写入的数据读操作能立即读到。
-
❌ 不对不同客户端或会话做保证。
-
常用于:移动 App、浏览器 Session 缓存。
5. 单调读一致性(Monotonic Read Consistency)
-
✅ 如果客户端读到某个值,则之后不会再读到更旧的值。
-
❌ 不保证能立即读到最新值,但至少“值越来越新”。
-
常用于:缓存层、分布式只读副本系统。
6. 最终一致性(Eventual Consistency)
-
✅ 写入的数据最终将传播到所有节点。
-
❌ 不保证操作顺序,不保证多久同步完成。
-
✅ 但最终一定会同步成功。
-
应用于:DNS、社交平台内容同步、Cassandra、DynamoDB。
7. 弱一致性(Weak Consistency)
-
❌ 不保证数据一定能被读到。
-
❌ 不保证顺序、不保证传播、不保证成功。
-
✅ 性能极高,延迟极低。
-
应用于:缓存系统(如 Memcached)、CDN 边缘节点
三、对比总结表格
| 模型 | 是否保证可读 | 是否保证实时最新 | 是否保证顺序 | 适用场景 |
|---|---|---|---|---|
| 强一致性 | ✅ 一定 | ✅ 一定 | ✅ 一定 | 金融交易、Zookeeper |
| 顺序一致性 | ✅ 一定 | ❌ 不一定 | ✅ 一定 | 多线程/多副本模型 |
| 因果一致性 | ✅ 一定 | ❌ 不一定 | ✅ 部分(有因果) | 社交平台 |
| 会话一致性 | ✅ 一定 | ✅ 会话内 | ❌ | 移动应用 |
| 单调读一致性 | ✅ 一定 | ❌ 不一定 | ✅ 趋势新 | 弱一致缓存 |
| 最终一致性 | ✅ 最终 | ❌ 不一定 | ❌ | DNS、Dynamo |
| 弱一致性 | ❌ 不一定 | ❌ 不一定 | ❌ | 缓存系统、CDN |
四、常见系统中一致性模型实现
| 系统 | 一致性模型 |
|---|---|
| Zookeeper | 强一致性(线性化) |
| Cassandra | 最终一致性 + 可调一致性 |
| Redis | 弱一致性(主从)/ 强一致性(哨兵+事务) |
| Kafka | 顺序一致性(分区内) |
| MongoDB | 会话一致性 + 可调一致性 |
| DynamoDB | 最终一致性(默认)/ 强一致性(可选) |

672

被折叠的 条评论
为什么被折叠?



