前言

在分布式系统中,多副本机制确保了数据的高可用性与容错能力,但同时也带来了副本间一致性的问题。为了在性能、可用性与一致性之间取得平衡,Quorum(一致性法定人数)机制应运而生,广泛应用于分布式数据库与存储系统,如 Cassandra、Dynamo、etcd、ZooKeeper 等。

定义

Wiki 定义如下:

In distributed computing, a quorum is the minimum number of members of a group that must be present to make the results of any vote valid. In distributed databases, it refers to the minimum number of nodes required to acknowledge a read or write operation to consider it successful.

简而言之: Quorum 是指执行读或写操作时必须成功访问的最小副本数,以保障一致性。

工作原理

一句话:通过确保读写操作都覆盖到一定数量的副本,使得“读”总能读到最新的“写”。

经典公式为:

1
W + R > N

其中:

  • N:副本总数
  • W:写操作成功所需副本数
  • R:读操作成功所需副本数

只要 W + R > N,就保证了至少有一个副本同时被读写覆盖,从而实现强一致性。

例如:

  • N = 3W = 2R = 2,则满足 W + R = 4 > 3,因此可以读到最新写入的数据。

属性与指标

Quorum 涉及以下核心属性与指标:

  1. 副本数 N 系统中每条数据的存储副本总数,通常为 3、5、7。

  2. 写法定人数 W 每次写入必须成功的副本数量,影响写可用性与一致性。

  3. 读法定人数 R 每次读取必须访问的副本数量,影响读延迟与一致性。

  4. Consistency Level 一般系统支持不同级别:ONEQUORUMALLLOCAL_QUORUM 等。

  5. Latency vs Consistency 增加 R/W 会提高一致性,但也可能提高延迟。

  6. Fault Tolerance 系统最多能容忍 (N - W) 个副本写失败,或 (N - R) 个副本读失败。

类型

按读写权重划分

  1. 强写弱读(W高,R低)

    • 保证写入强一致,读取副本少,读延迟低。
    • 适合写频繁、读延迟敏感场景。
  2. 强读弱写(W低,R高)

    • 写入快,读取需访问更多副本,保证读到最新值。
    • 适合读密集、要求读一致性的业务。
  3. 对称 Quorum(W = R = ⌈N/2⌉)

    • 比较常见的设置,读写一致性较强,适用广泛。

按地理范围划分

  1. Local Quorum

    • 限定在单个数据中心中满足 W 或 R,适合多机房部署。
  2. Global Quorum

    • 所有数据中心参与法定人数计算,适合强一致性跨机房场景。

存储系统中的应用

Quorum 机制在许多系统中扮演关键角色:

系统 是否使用 Quorum 说明
Cassandra R/W 可配置,支持 Local/Global
DynamoDB 源自 Dynamo 论文
ZooKeeper 多数派投票机制
etcd / Consul 使用 Raft 算法,依赖多数节点确认
MongoDB ✅(部分场景) WriteConcernReadPreference 提供类似机制

与程序的关系

对于开发者而言:

  1. 读写一致性调优 通过选择合适的 R/W 组合,控制系统的最终一致性行为。

  2. CAP 权衡的体现 Quorum 是 CAP 中 C(Consistency)与 A(Availability)的权衡点。

  3. 错误处理设计 需处理部分副本失败、超时、数据不一致等场景。

  4. 可观测性 系统应暴露法定人数满足情况、失败率、响应时间等指标。


常见支持 Quorum 的系统

  1. Apache Cassandra
  2. Amazon DynamoDB
  3. Apache HBase
  4. Riak
  5. etcd / Consul
  6. ZooKeeper
  7. FoundationDB
  8. CockroachDB