分布式系统的一致性模型
对比线性一致性、顺序一致性、因果一致性和最终一致性,帮助判断多副本系统允许用户观察到多大的状态差异。
#synthesis
#growing
#backend
#architecture
[!info] related notes
- 所属 MOC:Distributed Systems MOC
- 前置:分布式系统、数据复制
- 相邻:CAP 定理、事务隔离级别
分布式系统的一致性模型
[!abstract] 核心问题 一致性模型规定并发操作和多个副本存在时,客户端允许观察到哪些结果。它是系统对读取、写入和顺序的契约,不是“数据最后大概一样”的模糊形容词。
从强到弱理解常见模型
Linearizability:线性一致性
每个操作像在调用与返回之间某一瞬间原子生效,并尊重真实时间顺序:
write(x=2) completes
→ any later read must not return x=1
优点:接近单机变量直觉。代价:跨节点协调、延迟和 Partition 时可用性压力更高。
Sequential Consistency:顺序一致性
所有客户端观察到同一个全局操作顺序,并保持每个客户端自己的程序顺序,但该全局顺序不必遵守真实时间。
它比线性一致弱:某操作已在现实时间完成,另一个客户端仍可能观察到一个逻辑上合法但不同于真实时间的排列。
Causal Consistency:因果一致性
存在因果关系的操作必须按因果顺序被观察;互相独立的并发操作可在不同节点以不同顺序出现。
A posts article
→ B reads it and comments
→ everyone seeing comment must also be able to see article
Session Guarantees
面向单个用户/会话的实用保证:
- Read-your-writes:自己写完后能读到;
- Monotonic Reads:后续读不会倒退到更旧版本;
- Monotonic Writes:自己的写按顺序应用;
- Writes-follow-reads:写入基于自己已读到的版本。
它们比全局强一致便宜,却能改善用户体验。
Eventual Consistency:最终一致性
如果停止新写入,所有可达副本最终收敛到同一状态。
它没有单独规定:
- 多久收敛;
- 收敛前可以读到什么;
- 冲突如何解决;
- 是否保持因果;
- 用户会不会读到倒退值。
所以“最终一致”必须配合更具体契约。
一致性不是单一轴
系统还可能承诺:
- Consistent Prefix;
- Bounded Staleness;
- Snapshot Read;
- Per-key Linearizability;
- Quorum Read / Write;
- Convergent Conflict-free Merge。
设计时应针对实际访问模式组合,而不是给整个系统贴一个“强/弱”标签。
与事务隔离级别的区别
| 一致性模型 | 事务隔离级别 |
|---|---|
| 讨论多个副本/客户端对操作顺序和可见性的观察 | 讨论并发事务之间允许出现哪些读写现象 |
| Linearizability、Causal、Eventual | Read Committed、Repeatable Read、Serializable |
| 可能针对单 Key / 单操作 | 针对多操作事务 |
一个数据库可以提供 Serializable Transaction,却通过异步 Replica 允许 Stale Read;两层契约必须分别说明。
冲突与收敛
弱一致写入通常需要冲突策略:
- Last-write-wins;
- Version Vector / Causal Metadata;
- 应用层 Merge;
- CRDT;
- 拒绝并发更新并让用户重试。
“最终会一致”不代表冲突处理一定符合业务语义。余额、库存等不变量不能仅靠最后写入覆盖。
如何选择
先问:
- 哪些读取必须立即看到最新写入?
- 哪些用户至少需要 Read-your-writes?
- 能容忍多长 Staleness?
- Partition 时是拒绝、等待还是返回旧值?
- 并发写如何检测与合并?
- 强协调增加的延迟是否可接受?
最小例子
用户修改头像后立刻刷新:
- 全局线性一致:所有地区立即只能看到新头像;
- Read-your-writes:该用户自己立即看到,其他地区稍后收敛;
- 最终一致:任何用户短期可能看到旧头像,必须定义缓存和收敛时间。
产品需求常只需要第二种,而不是对所有读强制全局协调。
掌握标准
- 能区分 Linearizable、Sequential、Causal 与 Eventual。
- 能说明 Read-your-writes 等 Session Guarantee 的价值。
- 能区分分布式一致性与事务隔离。
- 能明确 Staleness、Conflict 和 Convergence,而不只说“最终一致”。
- 能根据业务操作选择模型,而不是按数据库品牌判断。