Mímisbrunnr知恵の泉

← 分散システム 一覧

🎓 レベル:基礎 | 重要度:A(必須)

📎 前提:なし(ここが入口) | 関連:障害モデル(クラッシュ・オミッション・ビザンチン)CAP定理

要点(BLUF)

問題設定 ── なぜ1台で済まさないのか

1台のサーバには上限があります。性能(CPU・メモリ・I/O)、可用性(壊れたら全停止)、地理(遠いユーザは遅い)。これを超えるために台数を増やすと、3つの利得と引き換えに難しさを買うことになります。

動機得られるもの代償(このサイトの主題)
スケール台数でスループット・容量を伸ばす協調・整合のコスト
可用性1台死んでもサービス継続故障検出・切替の正しさ
地理分散ユーザの近くで応答遅延と一貫性のトレードオフ

仕組み ── 「1つに見せる」ための層

分散システムは、バラバラのノードの上にミドルウェアを挟み、命名・通信・一貫性・故障処理を肩代わりして「1つのシステム」に見せます。

flowchart TB
    U["利用者(1つのシステムに見える)"] --> M["分散ミドルウェア(命名・通信・一貫性・故障処理)"]
    M --> N1["ノードA(独立に故障する)"]
    M --> N2["ノードB(独立に故障する)"]
    M --> N3["ノードC(独立に故障する)"]
    N1 -.->|"遅延・喪失あり"| N2
    N2 -.->|"遅延・喪失あり"| N3

要するに何か:上の層が「透過性」(透過性とスケーラビリティ)で複雑さを隠し、下では各ノードが勝手に落ちうる。この「隠す」と「勝手に落ちる」の緊張が、分散の難しさそのものです。

仕組み ── 難しさの正体:部分故障

単一マシンのプログラムは「動くか、全部止まるか」のどちらか。分散では第3の状態があります。Bへ送ったリクエストの返事が来ないとき、起きうるのは次のどれかで、送り手には区別がつきません

sequenceDiagram
    participant A as ノードA
    participant B as ノードB
    A->>B: リクエスト
    Note over A,B: 返事が来ない…原因は4通り
    Note right of B: (1) Bが処理前にクラッシュ
    Note right of B: (2) Bは処理したが応答が喪失
    Note right of B: (3) Bは生きてるが遅いだけ
    Note left of A: (4) 要求自体が届かず喪失

「処理されたのか、されなかったのか」が分からない。これが冪等性配送保証(at-most-once・at-least-once・exactly-once))や合意合意問題とFLP不可能性)がいる根本理由です。

正しさの観点 ── 安全性と活性

分散アルゴリズムの正しさは、必ず2つに分けて語ります。本サイトでは全アルゴリズムでこの2軸を明示します。

部分故障と非同期性のせいで、両方を同時に完全保証することは一般に不可能合意問題とFLP不可能性 のFLP)。どちらをどこまで諦めるか、の設計学が分散システムです。

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

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

対応ラボ

なし(概念回)。以降の章で論理時計・合意・クォーラムを最小シミュで実証します。

関連

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