一致性模型谱系:从线性一致到最终一致
03-一致性与复制
核心
约 25 分钟
#一致性模型#线性一致#顺序一致#因果一致#最终一致
更新 2026-10-02
当前状态:未学
本文基于模型知识整理(生成时未联网核对),关键结论建议对照经典文献复核。
一句话定义
一致性模型是"并发读写表现成什么样"的契约谱系:线性一致最强(像单机),顺序一致、因果一致逐级放宽,最终一致最弱(只保证停止更新后收敛);模型越强,实现代价越高。
为什么重要
"这个系统一致吗"是个伪问题,"它承诺哪一档一致性"才是真问题。选错档位的代价是隐蔽的正确性 bug(读到旧值、因果倒置)或无谓的性能开销(该用最终一致的地方上了线性一致)。这张谱系图是分布式存储选型的坐标系。
前置知识
kp-004(happens-before 与并发)、kp-011(复制产生不一致)。
核心概念(由强到弱)
- 线性一致性(linearizability):每个操作表现得发生在"调用开始与返回之间的某一瞬间",全体节点看到同一个全序;等价于"数据只有一份"。等价说法:可线性化 = 最近的写立刻对所有读者可见。
- 顺序一致性(sequential consistency):所有节点看到同一个全序,但该全序只需与单节点自己的操作顺序一致,不要求尊重跨节点的实时先后(弱于线性一致之处:别的客户端的写可以"迟到")。
- 因果一致性(causal consistency):有因果关系的操作(kp-004 的 happens-before)全体按同序观察;并发操作可以各节点各序。
- 最终一致性(eventual consistency):只承诺"停止更新后,副本最终收敛",期间可以任意旧。
- 辨析:可线性化(一致性)≠ 可串行化(事务隔离)——前者关于单对象读写可见性,后者关于多对象事务等价某个串行执行;线性一致的可串行化(strict serializability)才是最强组合。
原理与机制
强弱代价:线性一致要求读操作与最新写交互(要么读主、要么 quorum 交叉验证),每次读写都有协调成本且分区时少数派停服(kp-012 的 C 侧);最终一致读写都可本地/多数派完成,代价是读到旧值与冲突修复。中间档(因果一致)用向量时钟/因果上下文追踪依赖,实现复杂度显著(如 COPS)。
判定方法(工程视角):线性一致性可形式化检查(Jepsen 的 linearizable 历史检验,kp-033);顺序一致与因果一致较难穷举,实践中靠协议结构(是否走共识日志)判断。经验法则:基于共识日志的键值读(etcd/ZooKeeper 的 linearizable read)是线性一致;只走本地/从库副本读是最终一致;声明"顺序一致"的系统较少见,文档要逐字确认。
图示
强 ◄──────────────────────────────────────► 弱
线性一致 ── 顺序一致 ── 因果一致 ── 读己之写 ── 最终一致
(单机感) (统一全序) (因果不乱) (会话内) (收敛即可)
代价: 高协调/延迟 ◄──────────────► 本地读写/需修复
实例或案例
- etcd / ZooKeeper:读可选择线性一致(默认经 leader/quorum)或更快的本地顺序读(ZooKeeper sync API 语义)。
- Kafka:分区内顺序一致;结合幂等生产与事务可支撑 read-committed 语义。
- COPS:学术界因果一致 KV 的代表,"get_after"原语显式追踪依赖。
- 图数据库/社交流:评论列表只需因果一致(先看到的回复必须晚于被回复的评论)。
常见误区
- 误区一:"最终一致 = 最终会变对,无所谓"。收敛前的窗口内可能反复读到旧值,业务(如库存扣减)不能只依赖最终一致。
- 误区二:"可线性化 = 可串行化"。两码事:前者单对象,后者多对象事务;只有 strict serializability 二者兼得,成本最高。
- 误区三:"复制因子 3 就是强一致"。副本数与一致性档位无关;不经过 quorum/共识的复制即使 5 副本也是最终一致。
与其他知识点的关系
- kp-012:线性一致正是 CAP 的 C。
- kp-014:quorum 读写叠加版本比较可达到线性一致(条件较苛刻)。
- kp-016:读己之写等会话保证是弱一致系统的实用补丁。
- kp-027:MVCC/时间戳是实现一致性读的机制底座。
自测题
- 线性一致与顺序一致的关键差别?
答:线性一致要求全序尊重操作的真实时间区间;顺序一致只要求与各节点自身顺序一致,跨节点实时先后可以颠倒。
- 为什么说"可线性化 ≠ 可串行化"?
答:线性化管单对象的读写实时可见性;串行化管多对象事务的等价串行执行;二者维度不同,最强是 strict serializability。
- 举一个不需要线性一致、因果一致就够的场景。
答:评论区/对话流:回复必须出现在被回复内容之后(因果),不同评论之间的先后无需全局实时一致。
延伸阅读
- Leslie Lamport, "How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs"(1979,顺序一致性)。
- Mahajan 等, "COPS: Practical Causal Consistency"(SIGMOD 2011)。
- Kyle Kingsbury 的线性一致性 Jepsen 分析(jepsen.io/consistency)。