🎓 レベル:標準 | 重要度:A(必須)
📎 前提:レプリケーション方式(同期/非同期・リーダー/リーダーレス) | 関連:Paxos・PACELC・結果整合性
要点(BLUF)
- クォーラム=読み書きを成立させるのに必要な複製数。書き込みは W 個、読み取りは R 個に触れる(全 N 複製のうち)。
- 条件 R + W > N が成り立つと、任意の読みクォーラムと任意の書きクォーラムが必ず1つ以上重なる。重なったノードが最新値を持つので、最新を必ず読める(強い読み取り)。
- W に関する W > N/2 は書き込みの順序衝突を防ぐ。R・W を動かすことで一貫性・読み性能・書き性能・可用性を連続的に調整できる。
問題設定 ── 全部に書かず最新を読みたい
全複製に同期書き込みすると遅く、1台でも落ちると書けない。逆に1台だけ書くと速いが、別の1台から読むと古い。「いくつ書き、いくつ読めば、最新が保証されるか」——この最小の重なりを与えるのがクォーラムです。
モデル ── 重なりの条件
N 個の複製に対し、書き込みは W 個、読み取りは R 個に問い合わせる。鳩の巣原理から:
重なったノードは直近の書き込みを持つので、読み手はそれを(バージョン比較で)最新と判定できます。さらに書き込み同士の衝突を防ぐには:
(2つの書きクォーラムが必ず重なり、順序が一意化される。これは合意の過半数と同じ発想——Paxos)。
flowchart LR
W["書きクォーラム W個"] -->|"R+W>N なら"| OV["必ず共有ノードあり"]
R["読みクォーラム R個"] -->|"R+W>N なら"| OV
OV --> LATEST["共有ノードが最新値を持つ -> 最新を読める"]
具体例 ── 境界条件を全数検証(実機)
ラボ 06-02_quorum.py(N=5)。全ての読み×書きクォーラムの組合せで最悪の重なりを調べ、R+W>N と「必ず最新を読める」が一致するか確認:
R W R+W 最悪の重なり 最新を必ず読める?
4 1 5 0 NG (R+W>N: False, 一致:True)
5 1 6 1 OK (R+W>N: True, 一致:True)
3 2 5 0 NG (R+W>N: False, 一致:True)
4 2 6 1 OK (R+W>N: True, 一致:True)
3 3 6 1 OK (R+W>N: True, 一致:True)
R=3, W=3 (R+W=6): 最悪の重なり=1 -> 強い読み取り保証
R=2, W=3 (R+W=5): 最悪の重なり=0 -> 古い値を読みうる
R=2, W=2 (R+W=4): 最悪の重なり=0 -> 古い値を読みうる
R+W=N=5(境界)では最悪の重なりが0=交わらない選び方があり古い値を読みうる。R+W=6>5 で初めて最悪でも1重なる。全組合せで「R+W>N ⇔ 必ず最新が読める」が完全一致しました(鳩の巣原理の確認)。
設計のつまみ ── R と W の選び方
| 設定(N=5) | 特徴 |
|---|---|
| W=5, R=1 | 書きが重い・読みが速い(読み多用システム) |
| W=1, R=5 | 書きが速い・読みが重い(書き多用・即時応答書き込み) |
| W=3, R=3 | バランス(過半数同士、強い読み取り) |
| W=2, R=2(R+W≤N) | 高可用・低遅延だが結果整合(古い値あり、PACELC・結果整合性) |
Dynamo系(Cassandra等)は R・W をリクエスト単位で選べ、R+W>N にすれば強い読み取り、R+W≤N にすれば速さ優先、と動的に取引できます。
正しさの観点 ── 安全性と可用性
- 安全性(最新を読む):R+W>N の重なりが保証。バージョン(ベクトル時計/タイムスタンプ)で最新を選別。
- 書き込み一意化:W>N/2 で2つの書きが必ず重なり、衝突を順序付け/検出できる。
- 可用性:N−W 台までの故障で書け、N−R 台までの故障で読める。R・W を小さくするほど可用性↑だが一貫性↓。
なぜ分散だと難しいか(直観)
「最新を読む」を全複製確認なしに保証するのが難所。クォーラムは「全部は確認しないが、必ず1つは最新と重なる」を鳩の巣原理で作る、巧妙だが単純な仕掛け。重なりが0になる境界(R+W=N)を1つ超えるだけで保証が生まれる/消える、という鋭さがポイントです。
⚠️ よくある誤解・落とし穴
- 「R+W=N で十分」→ 境界はNG。等号では交わらない選び方が残る。**厳密に > **が要る(実機で確認済み)。
- 「R+W>N なら線形化可能」→ 厳密にはスロッピークォーラムやヒンテッドハンドオフ併用時は破れうる。素朴な意味の「強い読み取り」と線形化は別途注意。
- 「W を増やせば常に安全」→ W を増やすと書き込み可用性が下がる(N−W 台しか落とせない)。
- 「読みは軽いから R=1 でいい」→ R=1 だと最新保証が消える(R+W>N を満たさなくなる)。
対応ラボ
distributed-systems-study/labs/06-02_quorum.py(N=5 で全クォーラム組合せを網羅し、R+W>N と最新読み取り保証の同値を確認済み)。
関連
- 過半数の同じ発想が合意 Paxos
- 緩めた時の収束は PACELC・結果整合性
- 複製方式の文脈は レプリケーション方式(同期/非同期・リーダー/リーダーレス)