Mímisbrunnr知恵の泉

← 分散システム 一覧

🎓 レベル:発展 | 重要度:A(必須)

📎 前提:合意問題とFLP不可能性 | 関連:Raftクォーラム(R+W>N)

要点(BLUF)

問題設定 ── 故障の中で1つに決める

合意問題とFLP不可能性 の合意を、クラッシュ故障下で安全に実装したい。鍵は「どの2つの過半数も必ず1つ以上のノードを共有する」という事実(クォーラム(R+W>N) の重なり)。この共有ノードが「記憶の橋渡し」をして、別々の提案が別々の値を確定するのを防ぎます。

アルゴリズム ── Prepare と Accept

sequenceDiagram
    participant PR as Proposer
    participant A1 as Acceptor1
    participant A2 as Acceptor2
    participant A3 as Acceptor3
    Note over PR,A3: フェーズ1: Prepare(n)
    PR->>A1: prepare(n)
    PR->>A2: prepare(n)
    A1-->>PR: promise(n, 既受理値あれば返す)
    A2-->>PR: promise(n, 既受理値あれば返す)
    Note over PR,A3: フェーズ2: Accept(n, v)
    PR->>A1: accept(n, v)
    PR->>A2: accept(n, v)
    A1-->>PR: accepted(n, v)
    A2-->>PR: accepted(n, v)
    Note over PR,A3: 過半数がacceptedなら v が確定

正しさの観点 ── なぜ矛盾しないか

安全性の核心は2つの規則の合わせ技:

  1. 過半数の重なり:値 v が確定した=過半数が v を受理した。別の提案 n’ も過半数に触れる以上、v を受理したノードに必ず当たる
  2. 値の引き継ぎ:そのノードは promise で v を報告するので、後続のProposerは自分の値でなく v を選ばざるを得ない
任意の2つのクォーラム Q1,Q2:Q1Q2\text{任意の2つのクォーラム } Q_1, Q_2: \quad Q_1 \cap Q_2 \neq \varnothing

この重なりが「一度確定した値は、以後どの提案も上書きできない」を保証します。提案番号 n の単調性が「どの値を引き継ぐか」を一意に決め、二重確定を防ぎます。活性は——競合するProposerが番号を上げ合うと永遠にAcceptに到達しないライブロックがありうる(FLPの現れ)。リーダーを1人に絞る(Multi-Paxos/Raft)ことで回避します。

他手法との比較 ── Paxos vs Raft

観点PaxosRaft(Raft
設計目標最小限・一般性理解しやすさ
リーダー任意(Multi-Paxosで実質固定)明示的に1人選出
ログ複製別途Multi-Paxosで構築プロトコルに統合
評判正しいが難解実装しやすい

PaxosとRaftは本質的に同じ安全性原理(過半数の重なり)。違いは説明と実装のしやすさで、現場の新規実装はRaftが多数派です。

なぜ難しいか(直観)

Paxosの難しさは「なぜこれで正しいのか」が見えにくい点。prepare→acceptの各ステップは単純だが、「既受理値を最大番号で引き継ぐ」規則が安全性の全荷重を担っており、ここを飛ばすと途端に二重確定が起きる。Lamportの論文が寓話(議会)で書かれたことも難解さの一因で、その反動がRaftの「理解しやすさ」設計です。

⚠️ よくある誤解・落とし穴

対応ラボ

なし(概念回)。同じ安全性原理(過半数投票でリーダーを一意化)は Raft のラボで実証します。重なり条件は クォーラム(R+W>N) のラボへ。

関連

第5章 合意 目次