Skip to content

第九章:一致性与共识

1. 一致性问题的范围

一致性不是单一概念,常见语义包括副本新鲜度、事务隔离、因果顺序与全局决策一致。设计前必须先明确业务真正需要哪一种保证。

2. 线性一致性(Linearizability)

2.1 定义

线性一致性要求系统看起来像“只有一个副本”,且每次读都能看到最近一次已完成写入。

2.2 与可串行化的区别

  • 可串行化:关注事务之间是否等价于某个串行顺序。
  • 线性一致性:关注操作顺序是否符合真实时间先后。

两者组合得到严格可串行化(Strict Serializability)。

2.3 代价与边界

线性一致通常需要跨节点同步确认,延迟上限受网络往返时间约束。网络分区时,系统必须在一致性与可用性之间取舍。

3. 顺序与因果

3.1 因果关系

因果顺序是偏序,不要求全局唯一顺序,但要求“先因后果”。很多业务只需要因果一致,不需要线性一致。

3.2 序列号与逻辑时钟

  • 物理时钟难以可靠表达因果。
  • Lamport 时间戳可构建全序近似,但不足以单独解决唯一性与冲突裁决。
  • 向量时钟可表达并发关系,适合冲突检测。

3.3 全序广播

全序广播要求所有节点以相同顺序交付消息。它与共识问题在能力上等价,是状态机复制的核心基础。

4. 分布式事务与原子提交

4.1 两阶段提交(2PC)

2PC 通过“Prepare/Commit”保证跨节点原子提交,但协调者故障会导致参与者阻塞。

4.2 XA 的工程现实

XA 能统一异构资源事务,但部署复杂、时延高、故障恢复困难。高并发场景常采用本地事务 + 事件驱动补偿替代全局强事务。

4.3 三阶段提交的局限

3PC 依赖较强同步网络假设,现实网络环境下难以提供预期收益。

5. 共识算法

5.1 共识目标

在节点故障下,集群仍需对某个值达成一致,并保证一致性、有效性与最终可决定性。

5.2 主流算法

PaxosRaftZabVSR 的核心思想一致:

  • 用任期(term/epoch)避免旧主继续写入。
  • 用多数派 quorum 保证新旧决策交集。
  • 用复制日志驱动状态机一致。

5.3 成本

共识组通常规模较小(如 35 节点),追求的是强一致控制面,而不是海量数据面扩展。

6. 协调服务(ZooKeeper / etcd)

6.1 定位

协调服务不是通用数据库,而是提供线性一致小数据存储与协调原语:锁、选主、配置、服务发现。

6.2 常见能力

  • 原子读改写。
  • 单调递增版本号(可用于 fencing token)。
  • 临时节点与会话失效检测。
  • 变更订阅通知。

6.3 设计建议

把复杂共识能力“外包”给成熟协调系统,业务只消费稳定原语,可显著降低协议实现风险。

7. 实务建议

  • 先按业务语义定义一致性级别,再选算法与系统。
  • 强一致控制面与高吞吐数据面分层设计。
  • 对外显式声明一致性承诺,避免“默认强一致”的错误预期。