操作して学ぶ

クォーラム N/R/W 可視化

Dynamo 系の分散データストアは、各キーを N 台に複製し、書き込みは W 台、読み取りは R 台の応答が揃った時点で成功とみなします。 このとき R + W > N を満たすと、 読み集合と書き込み集合は必ず1台以上重なり、最新値を取りこぼしません。 下の3つのつまみを動かし、実際に読み書きして「古い値が返る境界」を確かめてください。

R + W = 2 + 2 = 4 > N = 3

強整合 — 読み集合と書き込み集合は必ず1台以上重なるので、古い値は返らない

書き込み同士の重なり(W > N/2): あり書き込みの耐障害性: 1読み取りの耐障害性: 1

レプリカ(クリックで停止・復帰)

生存 3 / 3 最新版 v0

書き込みが届いた読み取りが問い合わせた両方=重なり(ここが最新値を運ぶ)

読み取り成功

0

古い値を読んだ

0

古い値の割合

0.0%

操作の失敗

0

試してほしい3つの操作

  1. 「最速・結果整合」(N=3, R=1, W=1)で「書き込み→読み取りを50回」を押す。R+W=2 は N=3 を超えないため、読んだ1台が書いた1台と食い違い、約3分の2の確率で古い値が返ります。統計が実際にその割合へ寄っていきます。
  2. 「バランス型」(N=3, R=2, W=2)で同じことをする。R+W=4 > 3 なので、何度繰り返しても「古い値を読んだ」は 0 のままです。さらにノードを1台クリックして停止させても 0 のままで、 代わりに W や R に届かなくなった時点で操作そのものが失敗します。整合性が壊れるのではなく可用性が失われる、というのがクォーラムの性質です。
  3. W=1 で1回だけ書いてから、読み修復を有効にして何度も読む。最初は1台しか最新版を持っていませんが、読み取りのたびに遅れたノードが最新版へ揃えられ、やがて全台が収束します。

なぜ重なりが保証されるのか

鳩の巣原理そのものです。書き込み集合と読み取り集合はどちらも同じ N 台の部分集合で、大きさの合計が N を超えるなら、 両者が互いに素であることは不可能です。この論法はどのノードが生きているかに一切依存しません。 だからノードを落としても古い値は返らず、返らない代わりに定足数に届かなくなった操作が失敗します。

なお、この可視化は厳密なクォーラムのみを扱っています。 実際の Dynamo 系は可用性のために担当 N 台の外へ書く sloppy quorum を使うことがあり、その場合は R+W>N でも重なりが破れます。 並行更新をベクタークロックで検出する話、読み修復・反エントロピー・ヒンテッドハンドオフの守備範囲の違い、 そして sloppy quorum の罠は、下の解説記事で扱っています。