Skip to content

分散システムの課題

はじめに

1台のマシンでは足りなくなったとき、本当の問題が始まります。 分散システムは現代インターネットの基盤です。WeChatのメッセージからTaobaoの注文まで、裏側では何百、何千台ものマシンが連携して動いています。しかし、「分散」はただのランチではありません。単一マシンのシステムでは考えられなかった一連の課題をもたらします。

この記事で何を学べるのか?

この章を読み終えると、以下のことが身につきます:

  • 核心定理:CAP定理とシステム設計への影響を理解する
  • 一貫性モデル:強一貫性、結果整合性、因果一貫性を区別する
  • 8つの課題:分散システムが直面する中核的な難題を把握する
  • 合意アルゴリズム:Paxos、Raftなどの分散合意の基本思想を理解する
  • 実践パターン:2PC、Saga、CRDTなどの一般的なソリューションに習熟する
内容核心概念
第1章なぜ分散が必要なのかスケーラビリティ、可用性、地理的分散
第2章CAP定理一貫性、可用性、分断耐性
第3章一貫性モデル強一貫、結果整合、因果一貫
第4章8つの課題ネットワーク、時計、分断、スプリットブレインなど
第5章合意アルゴリズムPaxos、Raft、ZAB
第6章分散トランザクション2PC、Saga、TCC

0. 全景図:なぜ分散システムが必要なのか?

単一マシンのシステムはシンプルで信頼性がありますが、3つの越えられないボトルネックがあります:

ボトルネック説明分散による解決策
性能の上限単一マシンのCPU、メモリ、ディスクには物理的な限界がある水平スケーリング:より多くのマシンを追加して負荷を分散
単一障害点1台のマシンが落ちるとサービス全体が停止する冗長レプリカ:複数マシンが互いにバックアップ
地理的遅延ユーザーは世界中にいるが、単一マシンは1カ所にしか置けない複数拠点展開:ユーザーの近くでサービスを提供

分散の代償

分散システムは上記の問題を解決しますが、新たな複雑さをもたらします。ネットワークの信頼性、時計の同期、部分的な障害、データの一貫性……これらがこの記事で議論する「課題」です。

Peter Deutschの分散コンピューティング8つの誤謬は、以下の仮定が分散環境ではすべて間違っていることを教えてくれます:

  1. ネットワークは信頼できる
  2. レイテンシはゼロである
  3. 帯域幅は無限である
  4. ネットワークは安全である
  5. トポロジーは変化しない
  6. 管理者は1人しかいない
  7. 転送コストはゼロである
  8. ネットワークは同質である

1. CAP定理:分散システムの「不可能な三角形」

2000年、Eric BrewerはCAP推測(後に定理として証明)を提起しました。分散システムは以下の3つの属性のうち、同時に満たせるのは最大2つまでです。

属性意味わかりやすい説明
Consistency(一貫性)すべてのノードが同じ時点で同じデータを見るどのATMで残高を照会しても結果は同じ
Availability(可用性)すべてのリクエストがエラーでない応答を受け取るシステムは常に応答し、「サービス利用不可」とは言わない
Partition tolerance(分断耐性)ネットワーク分断時もシステムが稼働し続ける一部のケーブルが切断されてもシステムは動く
CAP Theorem Interactive Demo
Select two properties to inspect the corresponding system type
C
Consistency
All nodes see the same data
A
Availability
Every request receives a response
P
Partition tolerance
The system keeps running during network partitions
CA system (gives up partition tolerance)
When there is no network partition, the system can provide both consistency and availability. In distributed environments, partitions are unavoidable, so pure CA systems are rare in practice.
Typical systems: Single-node MySQL, PostgreSQL in single-node mode
Sacrifices: Partition tolerance (P): unavailable during network failures

なぜ2つしか選べないのか?

分散環境では、ネットワーク分断(P)は避けられません。光ファイバーが掘り起こされ、スイッチが故障し、データセンターのネットワークが切断されます。したがってPは必須選択であり、実際の選択はCとAの間のトレードオフになります:

  • CPを選択:分断時に不確実なリクエストを拒否し、データの正確性を保証 → 金融、在庫に適している
  • APを選択:分断時もサービスを継続するが、データが一時的に不整合になる可能性 → ソーシャル、コンテンツに適している

CAPは白黒はっきりではない

現実のシステムは単純な「CPかAPか」ではありません。多くのシステムは異なる操作で異なる選択をします。例えば、同じデータベースでも、読み取り操作はAP(古いデータの読み取りを許可)、書き込み操作はCP(多数確認を要求)といった具合です。


2. 一貫性モデル:データ同期の「厳格さ」

一貫性はスイッチ(あるかないか)ではなく、スペクトルです。異なる一貫性モデルは「正確性」と「パフォーマンス」の間で異なるトレードオフを行います。

Consistency Model Comparison
Click to compare behavior across consistency models
Strong consistency
Eventual consistency
Causal consistency
Strong consistency
After a write succeeds, every node immediately returns the newest value, giving an experience like a single-machine database.
T1
Node A
v1
Node B
v1
Node C
v1
Initial state: all nodes are consistent
T2
Node A
v2 write
Node B
syncing...
Node C
syncing...
The client writes v2 and waits for every node to confirm
T3
Node A
v2
Node B
v2
Node C
v2
Only after all nodes confirm does the write succeed; any node reads v2
Trade-off: Higher latency because all nodes must confirm, and lower availability because node failures may block progress.

一貫性モデルの比較

モデル保証レイテンシ適用シナリオ
強一貫性読み取るのは必ず最新の書き込み値高い(同期の待機が必要)銀行振込、在庫引当
結果整合性最終的にすべてのレプリカが一致するが、途中で古い値が読まれる可能性低い(書き込み直後に返却)ソーシャルフィード、DNS
因果一貫性因果関係のある操作の順序は保証される中程度コメント返信、共同編集
線形化可能性すべての操作が単一マシン上で順次実行されたように見える最高分散ロック、リーダー選出
セッション一貫性同一セッション内で自分の書き込みを読み取れることを保証低〜中ユーザーの個人データ

「自分の書き込みを読む」一貫性

最も一般的な実用的ニーズは、ユーザーが自分のデータを変更した後、すぐに更新を確認できることです(ただし他のユーザーは少し後で確認できます)。これは「Read Your Own Writes」一貫性と呼ばれ、結果整合性の実用的な拡張です。


3. 8つの課題:分散システムの「地雷原」

分散システムの複雑さは単一の問題から来るのではなく、複数の問題が絡み合っています。以下は最も中核的な8つの課題です。

Eight Challenges in Distributed Systems
Click each challenge to inspect details and mitigation strategies
🔌
Unreliable network
Clock drift
✂️
Network partition
🔄
Data consistency
💥
Partial failure
🧠
Split brain
📋
Event ordering
🔐
Distributed transaction
🔌 Unreliable network
Nodes communicate over networks that may drop packets, delay messages, or disconnect at any time. This is the fundamental challenge of distributed systems: never assume the network is reliable.
Scenario: Service A calls service B and receives no response after 3 seconds. Did B miss the request, or did B process it and lose the response? A cannot tell.
Mitigation strategies:
  • Timeouts and retries with idempotency
  • Heartbeat checks to detect connection health
  • Circuit breakers to pause calls after repeated failures

課題間の関連

この8つの課題は独立しているのではなく、相互に関連しています:

  • ネットワークの信頼性の欠如ネットワーク分断を引き起こす → CAPのトレードオフを触发する
  • 時計の非同期イベント順序付けの困難を引き起こす → データ一貫性に影響する
  • 部分的障害スプリットブレインを引き起こす可能性 → 合意アルゴリズムで解決が必要
  • データ一貫性分散トランザクションが必要 → しかしトランザクション自体もネットワークの信頼性の欠如の影響を受ける

銀の弾丸はない

分散システムに「完璧な」ソリューションはありません。「適切な」トレードオフがあるだけです。これらの課題の本質を理解してこそ、システム設計時に正しい取捨選択ができます。


4. 合意アルゴリズム:複数マシンで「合意に達する」方法

合意アルゴリズムは分散システムの中核です。解決する問題は、複数のノードがどのようにしてある値について合意に達するかです。一部のノードが故障したりネットワーク遅延があったりしても合意が必要です。

4.1 Paxos

Leslie Lamportが1990年に提起した、厳密に正しさが証明された最初の合意アルゴリズムです。

役割職責
Proposer提案(値)を提出する
Acceptor投票で提案の受諾または拒否を行う
Learner最終的に選定された値を学習する

2段階のプロセス

  1. Prepare段階:Proposerが提案番号を送信し、Acceptorはそれより小さい番号の提案を受け付けないことを約束する
  2. Accept段階:Proposerが具体的な値を送信し、多数のAcceptorが受諾すれば提案は可決される

Paxosの問題

Paxosは正しいものの、理解と実装が非常に困難であることで有名です。Lamport自身の論文がギリシャ議会の比喩を使った結果、かえって多くの人を混乱させました。

4.2 Raft:理解可能性のために生まれた

2014年にDiego OngaroがRaftを提案しました。「理解しやすいPaxos」を作ることが目標です。合意問題を3つのサブ問題に分解します:

サブ問題説明
リーダー選出クラスタから1つのリーダーを選出し、すべての書き込みはリーダーを経由する
ログ複製リーダーが操作ログをすべてのフォロワーに複製する
安全性既にコミットされたログが上書きされないことを保証する

Raftのコアプロセス

  1. クラスタ起動時、すべてのノードはFollower
  2. Followerがリーダーのハートビートをタイムアウトまで受信できない場合、Candidateに移行して選出を開始する
  3. 多数票を獲得したCandidateが新しいLeaderになる
  4. Leaderがクライアントのリクエストを受け付け、多数のノードにログを複製してからコミットする

4.3 合意アルゴリズムの比較

アルゴリズム提案年理解のしやすさ利用システム
Paxos1990困難Google Chubby
Raft2014容易etcd、Consul、TiKV
ZAB2011中程度ZooKeeper
EPaxos2013困難主に学術研究

5. 分散トランザクション:ノードをまたぐ「全部か無か」

単一マシンのデータベーストランザクションは、ローカルのロックとログでACIDを実現します。しかし、1つの業務操作が複数のサービス/データベースにまたがる場合、原子性をどう保証するのでしょうか?

5.1 2相コミット(2PC)

最も古典的な分散トランザクションプロトコルで、2つの段階に分かれています:

段階コーディネータの動作参加者の動作
Prepareすべての参加者に「コミットできるか?」と尋ねる操作を実行するがコミットせず、Yes/Noで回答
Commit全員がYesならCommitを送信正式にコミット。Noがあれば全員ロールバック

2PCの問題点

  • ブロッキング:Prepare後、コーディネータが落ちると参加者は待ち続ける
  • 単一障害点:コーディネータが単一障害点であり、落ちるとトランザクション全体が止まる
  • パフォーマンス低下:複数回のネットワーク往復が必要で、ロックの保持時間が長い

5.2 Sagaパターン

Sagaは大きなトランザクションを複数のローカルトランザクションに分割し、各ローカルトランザクションには対応する補償操作があります。あるステップが失敗した場合、逆順で補償を実行します。

ECサイト注文のSagaの例

ステップ正方向の操作補償操作
T1注文を作成(支払待ち)注文をキャンセル
T2在庫を引当在庫を復元
T3残高を引当残高を返金
T4注文を確定(支払済み)

もしT3(残高の引当)が失敗した場合:C2(在庫の復元)→ C1(注文のキャンセル)を実行します。

2つのオーケストレーション方式

  • コレオグラフィ方式(Choreography):各サービスがイベントをリッスンし、次のステップを自律的に決定する。シンプルだが全体の状態追跡が困難
  • オーケストレーション方式(Orchestration):中央コーディネータがフローを制御する。明確だがコーディネータが単一障害点になる

5.3 TCC(Try-Confirm-Cancel)

TCCは2PCのビジネス層実装で、各操作を3つの段階に分けます:

段階説明例(在庫の引き当て)
Tryリソースを予約するが、実際には実行しない10個の在庫を凍結(利用可能在庫 -10、凍結在庫 +10)
Confirm実行を確認し、予約リソースを消費する凍結在庫 -10(実際の引き当て)
Cancel予約をキャンセルし、リソースを解放する凍結在庫 -10、利用可能在庫 +10(復元)

5.4 3つの手法の比較

手法一貫性パフォーマンス複雑さ適用シナリオ
2PC強一貫低い中程度データベースレベルのクロスデータベーストランザクション
Saga結果整合高い高い長時間の業務プロセス(注文、物流)
TCC結果整合中程度最高資金関連の高信頼性シナリオ

実際の選択のアドバイス

  • 単一データベースのトランザクションで済むなら分散トランザクションは使わない
  • ほとんどの業務シナリオではSaga + メッセージキューで十分
  • TCCは一貫性の要求が極めて高い金融シナリオに適しているが、開発コストも高い
  • 2PCはデータベースミドルウェア(ShardingSphereなど)による自動処理に適している

まとめ

分散システムは現代インターネットのインフラですが、その複雑さは単一マシンのシステムを遥かに超えます。これらの課題を理解するのは「解決」するためではなく(多くは根本的に解決不可能です)、システム設計時に正しいトレードオフを行うためです。

本章の主要なポイントを振り返りましょう:

  1. CAP定理:ネットワーク分断は避けられず、実際の選択は一貫性と可用性の間のトレードオフ
  2. 一貫性モデル:強一貫から結果整合まではスペクトルであり、業務要件に応じて選択する
  3. 8つの課題:ネットワークの信頼性の欠如、時計の非同期、ネットワーク分断、スプリットブレインなどが相互に関連
  4. 合意アルゴリズム:Raftが現在最も実用的な合意アルゴリズムであり、etcd/Consulはこれに基づいている
  5. 分散トランザクション:Sagaはほとんどのシナリオに適し、TCCは金融シナリオに適し、2PCはデータベース層に適している

関連資料