Mímisbrunnr知恵の泉

← 分散システム 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:分散システムとは・なぜ難しいか | 関連:分散コンピューティングの誤謬(8つの誤謬)合意問題とFLP不可能性

要点(BLUF)

問題設定 ── 「壊れ方」を決めないと正しさを語れない

「このアルゴリズムは正しい」は無意味で、「この故障の仮定の下で正しい」が正しい言い方。たとえばPaxos/Raft(PaxosRaft)はクラッシュ故障は耐えるが、嘘をつくノード(ビザンチン)は想定しません。だから最初に「相手はどう壊れるか」を固定します。

モデル ── 故障の型と強さの階層

弱い仮定(=より多くの壊れ方を許す)ほど、対処は難しくなります。

故障モデルノードの振る舞い包含
クラッシュ(停止)正しく動くか、止まって二度と動かない電源断・プロセス kill最も強い仮定(最も御しやすい)
オミッションメッセージを送り/受け損ねる(が嘘はつかない)バッファ溢れ・取りこぼしクラッシュを内包
タイミング正しいが時間制約を破る(遅すぎる)GC停止・過負荷同期系のみ問題化
ビザンチン(任意)何でもする:嘘・矛盾・結託バグ・侵害・悪意すべてを内包(最弱の仮定)
flowchart LR
    C["クラッシュ"] --> O["オミッション"]
    O --> T["タイミング"]
    T --> B["ビザンチン(任意故障)"]

要するに何か:右に行くほど「敵が強い」。クラッシュは「死んだら黙る正直者」、ビザンチンは「生きたまま矛盾を吐く嘘つき」。

派生の論点 ── フェイルストップと、同期/非同期

正しさの観点 ── 何台あれば耐えられるか

故障 f 台に耐える条件は、必要な「重なり(過半数)」から導けます。

クラッシュ耐性(f 台が黙っても、生存ノードの過半数で進む):

N2f+1N \ge 2f + 1

ビザンチン耐性(f 台が嘘をついても、正直ノードが多数を確保し矛盾を打ち消す):

N3f+1N \ge 3f + 1

直観:ビザンチンでは「黙る」だけでなく「矛盾した嘘を別々のノードに言う」ので、正直派が嘘つきの2倍超いないと真偽を分離できない。だからクォーラム(クォーラム(R+W>N))でも、ビザンチン版は重なりをさらに厚く取ります。

なぜ分散だと難しいか(直観)

単一マシンでは「壊れたら全部止まる(フェイルストップ的)」と思ってよい。分散では一部だけ・嘘も含めて壊れるので、まず敵の強さを宣言しないと議論が始まりません。強い仮定(クラッシュ)で設計を単純化し、本当に必要な所(ブロックチェーン・耐障害金融)だけビザンチンに上げる、が定石です。

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

対応ラボ

なし(概念回)。N≧2f+1 の「過半数の重なり」は クォーラム(R+W>N) のラボで定量的に確認します。

関連

第1章 分散システムの基礎 目次