Quorum 101
文章目录
前言
在分布式系统中,多副本机制确保了数据的高可用性与容错能力,但同时也带来了副本间一致性的问题。为了在性能、可用性与一致性之间取得平衡,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 是指执行读或写操作时必须成功访问的最小副本数,以保障一致性。
工作原理
一句话:通过确保读写操作都覆盖到一定数量的副本,使得“读”总能读到最新的“写”。
经典公式为:
|
|
其中:
N
:副本总数W
:写操作成功所需副本数R
:读操作成功所需副本数
只要 W + R > N
,就保证了至少有一个副本同时被读写覆盖,从而实现强一致性。
例如:
- 若
N = 3
,W = 2
,R = 2
,则满足W + R = 4 > 3
,因此可以读到最新写入的数据。
属性与指标
Quorum 涉及以下核心属性与指标:
-
副本数 N 系统中每条数据的存储副本总数,通常为 3、5、7。
-
写法定人数 W 每次写入必须成功的副本数量,影响写可用性与一致性。
-
读法定人数 R 每次读取必须访问的副本数量,影响读延迟与一致性。
-
Consistency Level 一般系统支持不同级别:
ONE
、QUORUM
、ALL
、LOCAL_QUORUM
等。 -
Latency vs Consistency 增加 R/W 会提高一致性,但也可能提高延迟。
-
Fault Tolerance 系统最多能容忍
(N - W)
个副本写失败,或(N - R)
个副本读失败。
类型
按读写权重划分
-
强写弱读(W高,R低)
- 保证写入强一致,读取副本少,读延迟低。
- 适合写频繁、读延迟敏感场景。
-
强读弱写(W低,R高)
- 写入快,读取需访问更多副本,保证读到最新值。
- 适合读密集、要求读一致性的业务。
-
对称 Quorum(W = R = ⌈N/2⌉)
- 比较常见的设置,读写一致性较强,适用广泛。
按地理范围划分
-
Local Quorum
- 限定在单个数据中心中满足 W 或 R,适合多机房部署。
-
Global Quorum
- 所有数据中心参与法定人数计算,适合强一致性跨机房场景。
存储系统中的应用
Quorum 机制在许多系统中扮演关键角色:
系统 | 是否使用 Quorum | 说明 |
---|---|---|
Cassandra | ✅ | R/W 可配置,支持 Local/Global |
DynamoDB | ✅ | 源自 Dynamo 论文 |
ZooKeeper | ✅ | 多数派投票机制 |
etcd / Consul | ✅ | 使用 Raft 算法,依赖多数节点确认 |
MongoDB | ✅(部分场景) | WriteConcern 和 ReadPreference 提供类似机制 |
与程序的关系
对于开发者而言:
-
读写一致性调优 通过选择合适的 R/W 组合,控制系统的最终一致性行为。
-
CAP 权衡的体现 Quorum 是 CAP 中 C(Consistency)与 A(Availability)的权衡点。
-
错误处理设计 需处理部分副本失败、超时、数据不一致等场景。
-
可观测性 系统应暴露法定人数满足情况、失败率、响应时间等指标。
常见支持 Quorum 的系统
- Apache Cassandra
- Amazon DynamoDB
- Apache HBase
- Riak
- etcd / Consul
- ZooKeeper
- FoundationDB
- CockroachDB
文章作者 沉风网事
上次更新 2019-01-18