Dev Study
← 研修トップ

分散システムの土台

2台目を置いた瞬間に何が始まるのか。状態の置き場が問題になり、複製には遅れが出て、相手が落ちたのか遅いだけなのか判定できなくなります。リトライは層が変わると意味が変わり、順序は与えられておらず、決めるには過半数が要る。CAPが「3つから2つ」ではないことも含めて、一次ソースと実測から積み上げます。

  1. 1
    2台目を置くと何が始まるか — 1台+1台は2台ではない
    1台で動かしている間、故障は「全部動く」か「全部止まる」かのどちらかでした。部品が運命を共にしているからです。
    約 9 分
  2. 2
    状態はどこかに置くしかない — 共有ストアは何を引き受けるのか
    割れてしまう状態を1か所にまとめると、台をまたいで引き継げるようになります。ただしそれは問題を消したのではなく、「どこが落ちたら誰が止まるか」の形を変えただけです。
    約 9 分
  3. 3
    複製には遅れがある — 書いた直後に読めないことがある
    同じデータを2台に持たせると、単一障害点は減りますが、代わりに「2台の中身がいつ揃うか」という問題が始まります。
    約 9 分
  4. 4
    「落ちている」とは言えない — タイムアウトは証拠ではなく推測
    タイムアウトが示すのは「決めた時間内に返事が来なかった」ことだけです。相手が落ちているのか、生きていて遅いだけなのか、経路でパケットが消えているのかは区別できません。
    約 9 分
  5. 5
    見えるのは遅れた信号だけ — 他ノードの状態は直接には測れない
    他ノードの「いまの状態」を直接見る手段はありません。届くのは、相手が過去に送り出した信号と、それが来ないという事実だけです。
    約 9 分
  6. 6
    リトライは意味を変える — 同じ再送でも、層が違えば結果が違う
    TCP の再送が安全なのは「もう一度送る」からではありません。送るデータが一意なシーケンス番号に結び付いていて、受信側が「これは前に見た番号だ」と判別できるからです。
    約 9 分
  7. 7
    冪等は性質ではなく約束 — 規定と、実務が足した鍵
    RFC 9110 が定める「冪等」は、同じ要求を複数回送ってもサーバ上の意図された効果が1回ぶんと同じになる、というメソッドの性質です。応答まで同じという意味ではありません。
    約 9 分
  8. 8
    順序は与えられていない — 壁時計と、因果だけが分かる関係
    複数の機械にまたがると、「どちらが先に起きたか」を教える共通の時計はありません。壁時計は比較できる形ですが合っておらず、単調時計は合っていますが原点が機械ごとなので比較に意味がありません。
    約 9 分
  9. 9
    過半数が決める — 分断しても割れないための最小の道具
    更新に「過半数の同意」を課すと、分断されても両側が同時に書き進むことはなくなります。2つの過半数は必ず重なるからです。
    約 9 分
  10. 10
    合意には往復が要る — 必ず1往復、ただし全員は待たない
    複数台で同じ値を決めるには、リーダーが過半数へ問い合わせて返事を待つ1往復が必ず乗ります。ただし待つのは過半数までで、遅い少数派は待ちません。
    約 9 分
  11. 11
    CAP は3つから2つではない — 定理が二択にしているのはどれか
    Gilbert & Lynch 2002 の Theorem 1 が同時に満たせないとしているのは Availability と Atomic consistency の2つで、分断耐性はそこに並ばず、定理が成り立つ世界の設定の側に置かれています。
    約 9 分
  12. 12
    2相コミットは止まる — 準備済みのまま残る約束
    2相コミットは、参加者が「はい」と答えた時点で決着まで資源を握り続けます。調整役が消えると握りっぱなしになり、同じ行に触った人は待ち続けます。
    約 9 分
  13. 13
    壊れる前提で組む — 決めておくのは「壊れたとき何が起きるか」
    この期で見てきたものは「壊れないようにする工夫」ではなく、壊れたとき何が起きるかを先に決める仕掛けでした。
    約 9 分