CAP定理とは?画像多めで解説!
この記事でわかること
・CAP定理とは何か
・C:一貫性、A:可用性、P:分断耐性の意味
・AとPの違い
・CP型とAP型の違い
・CAP定理でよくある誤解
CAP定理とは?

CAP定理は、分散システムでよく出てくる考え方だよ。
簡単に言うと、
分散システムでは、C・A・Pの3つを同時に完璧には満たせない
という考え方。

C・A・Pって何?

それぞれ、こういう意味だよ。
| 文字 | 意味 | 日本語のイメージ |
|---|---|---|
| C | Consistency | 一貫性 |
| A | Availability | 可用性 |
| P | Partition Tolerance | 分断耐性 |

このままだとちょっとわからないなぁ。

ひとつずつ見ていこうね。
まず分散システムって何?

そもそも分散システムって何?

分散システムは、複数のコンピュータが協力して1つのサービスを動かす仕組みだよ。


1台のコンピュータだけじゃないってこと?

そう。
たとえば、ネットショップやSNSみたいな大きなサービスは、1台だけで動かすと大変だよね。

アクセスが多すぎて落ちそう。

だから、複数のサーバーで役割を分けたり、同じデータを複数の場所に持ったりする。
サーバーA
サーバーB
サーバーC
↓
みんなで1つのサービスを動かす

なるほど。
みんなで支えているサービスなんだね。
CAP定理の3つの要素
C:Consistency(一貫性)


それじゃあ一つ一つ見ていこうか。まずCの一貫性だね。
一貫性は、簡単に言うと、
どのサーバーを見ても同じ最新データが見えることだよ。

どのサーバーでも同じ内容?

そう。
たとえば、銀行口座の残高で考えると分かりやすい。

あぁ、銀行の口座残高が、時間や場所で変わるのはまずいね。

たとえば残高が10,000円あって、5,000円引き出したら、残高は5,000円になるよね。
更新前:10,000円
更新後:5,000円
一貫性が高いシステムでは、どのサーバーに問い合わせても、ちゃんと5,000円と表示される。

片方のサーバーでは10,000円、別のサーバーでは5,000円だったら困るもんね。

そう。それを防ぐのが一貫性。
A:Availability(可用性)


次はAの可用性?

可用性は、簡単に言うと、
いつでもちゃんと応答してくれることだよ。

サービスが止まらないってこと?

近いね。
ユーザーがリクエストしたときに、
「今は無理です」
ではなく、何らかの返事を返せる状態。

ネットショップなら、ページが開けるとか、注文できるとか?

そう。
可用性が高いシステムは、多少トラブルがあってもサービスを続けようとする。
P:Partition Tolerance(分断耐性)


最後のP、分断耐性って何?

分断耐性は、
分断耐性は、サーバー同士の通信が切れる可能性を前提にして、その状態でもシステムとして破綻しないように設計する考え方だよ。

通信が切れる?

たとえば、東京のサーバーと大阪のサーバーがあるとする。
東京サーバー ←通信→ 大阪サーバー
でも、ネットワーク障害で一時的に通信できなくなることがある。
東京サーバー ×通信不可× 大阪サーバー
この状態が ネットワーク分断。

サーバー自体は生きてるけど、サーバー同士が話せない状態か。

そう。
このときにもシステムをどう動かすか、という話がCAP定理で重要になる。
AとPの違い

ちょっと
A:Availability(可用性)と
P:Partition Tolerance(分断耐性)の
違いがわからないかも。
どっちも「止まらない」みたいに見える。

混乱しやすいところだね。
ざっくり言うと、こう違うよ。

| 項目 | 意味 |
|---|---|
| A:可用性 | ユーザーの要求にちゃんと返事をすること |
| P:分断耐性 | サーバー同士の通信が切れても耐えること |

うーん。
「返事する」と「通信が切れても耐える」か。

Aは「ユーザーに返事できるか」の話。
Pは「サーバー同士の通信が切れる前提で考えているか」の話。
だから、AとPはどちらも障害に関係するけど、見ている場所が違うよ。
CAP定理のポイント

3つの意味はなんとなく分かった。
それで、CAP定理はどういうものなの?

CAP定理は、
ネットワーク分断が起きたとき、C(一貫性)とA(可用性)の両方を完全には守れない
という話だよ。


3つ全部じゃなくて、分断が起きたときの話なんだ。

そう。ここが大事。
P、つまり分断耐性は、分散システムでは現実的に避けられない。
ネットワークはいつか切れる可能性があるからね。

じゃあ、分断が起きたら、CとAのどっちを優先するか選ぶってこと?

そうそう。それでいいよ。
東京サーバーと大阪サーバーで考える

例で考えよう。
東京サーバーと大阪サーバーがあって、同じ在庫データを持っているとする。
東京サーバー:在庫 1個
大阪サーバー:在庫 1個
ここでネットワーク障害が起きて、東京と大阪が通信できなくなった。
東京サーバー ×通信不可× 大阪サーバー


お互いに最新情報を確認できない状態だね。

そう。
この状態で、東京にも大阪にも注文が来たらどうする?
Cを優先する場合:一貫性重視

一貫性を重視するなら、
データが正しいと確認できるまで、一部の処理を止める
という判断になる。

注文を受けないってこと?

そう。
東京と大阪が通信できず、在庫が本当にあるか確認できないなら、
「今は注文を受け付けられません」
とする。


サービスは不便だけど、在庫数の矛盾は防げるね。

そう。
これが Cを優先してAを犠牲にする 考え方。
Aを優先する場合:可用性重視

可用性を重視するなら、
多少データがズレる可能性があっても、リクエストには応答する
という判断になる。

注文を受けるってこと?

そう。
東京サーバーも大阪サーバーも、それぞれ自分が持っている情報をもとに注文を受ける。
東京サーバー:注文OK
大阪サーバー:注文OK


でも在庫が1個しかないのに、2件注文を受けちゃうかもしれない。

その通り。
サービスは止まりにくいけど、あとでデータのズレを直す必要がある。

これがAを優先してCを犠牲にするってことか。
CAP定理の本質

つまりCAP定理って、3つのうち2つしか選べないってやつ?

よくそう説明されるね。
ただ、もう少し正確に言うと、
ネットワーク分断が起きたとき、一貫性と可用性のどちらを優先するか選ぶ必要がある
という考え方。


Pは選ぶというより、分散システムでは前提になりやすいんだね。

そう。
現実の分散システムでは、ネットワーク分断の可能性を無視しにくい。
だから多くの場合、Pを前提にして、C寄りにするかA寄りにするかを考える。
CP型とAP型

CAP定理でCPとかAPって聞いたけど、あれは何?

優先するものの組み合わせだよ。

| 種類 | 優先するもの | イメージ |
|---|---|---|
| CP | 一貫性 + 分断耐性 | 正しさを優先。怪しいときは止める |
| AP | 可用性 + 分断耐性 | 止まらないことを優先。あとで整える |

CPは正確さ重視、APは止まらないこと重視って感じ?

そうそう、いい感じ。
CP型のイメージ

CP型は、データの正しさを重視する。
たとえば、
銀行の残高
在庫数が厳密なシステム
予約管理
みたいに、データのズレが大きな問題になる場合は、Cを重視したい。


残高がズレたら大問題だもんね。

そう。
だから、通信が怪しいときは処理を止めてでも、正しさを守る。
AP型のイメージ

AP型は、サービスを止めないことを重視する。
たとえば、
SNSのタイムライン
いいね数
アクセスログ
おすすめ表示
みたいに、少し古い情報が見えても致命的ではない場合。


いいね数が一瞬ズレても、まあ困らないね。

そう。
その場合は、多少ズレても表示を続けて、あとでデータを合わせる方が向いている。
分散システムでCA型を考えにくい理由


CとAを選んで、Pを捨てるCA型はないの?

理論上は出てくるけど、分散システムではあまり現実的ではない。

なんで?

ネットワーク分断が起きない前提になってしまうから。
でも現実のネットワークでは、通信障害は起こり得る。


じゃあ分散システムでは、Pを無視しにくいんだ。


そう。
だから実務では、分断が起きたときにCP寄りにするかAP寄りにするかを考えることが多い。

日常の例で考える

もう少し日常に近いもので例えることはできる?
あんまり現実感がなくて・・・。

じゃあ、友達グループでイベントの出欠管理をする例で考えよう。
状況

AグループとBグループで、同じイベントの出欠リストを管理しているとする。
Aグループのリスト
Bグループのリスト
でも、スマホの通信障害で、AグループとBグループが連絡を取り合えなくなった。


お互いの最新情報が分からないね。
Cを優先する場合

C、一貫性を優先するなら、
連絡が復旧するまで、出欠の変更受付を止める

不便だけど、リストがズレるのは防げる。

Aを優先する場合

A、可用性を優先するなら、
各グループで出欠変更を受け付け続ける
あとで情報を合わせる

便利だけど、あとで「人数が合わない!」ってなるかも。

そう。
これがCAP定理の感覚に近い。

CAP定理で大事な考え方

CAP定理って、結局どう使うの?

システム設計で、何を優先するかを考えるときに使う。

何を優先するか?

たとえば、
多少止まっても、データの正しさを守りたいのか
多少ズレても、サービスを止めたくないのか
を決める。

システムによって正解が違うんだね。

そう。
銀行とSNSでは、優先すべきものが違う。
よくある誤解
誤解1:常に3つのうち2つしか選べない

CAP定理って、いつでも3つのうち2つしか選べないってこと?

厳密には、ネットワーク分断が起きたときの話。
通常時はCもAも満たしているように見えるシステムもある。

障害が起きたときに、どっちを守るかが問題なんだね。

誤解2:CかAを完全に捨てる

CPなら可用性を完全に捨てる、APなら一貫性を完全に捨てるってこと?

それも少し違う。
実際には「どちら寄りに設計するか」という話。
完全に0か100かではないよ。

バランスの問題でもあるんだ。

そう。
たとえばAP寄りでも、あとからデータを整える仕組みを持つことが多い。

CAP定理の覚え方

こう覚えるといいよ。
C:Consistency
→ どこで見ても同じデータ
A:Availability
→ いつでも返事が返ってくる
P:Partition Tolerance
→ 通信が切れても耐える

日本語で覚えるなら?

これでいい。
C:正しさ
A:止まらなさ
P:通信切れへの強さ
試験で迷ったときの判断ポイント

試験とかで気にするといいポイントを紹介するね。

| キーワード | 関係する要素 |
|---|---|
| 常に最新データ、矛盾しない | C:一貫性 |
| 必ず応答する、サービス継続 | A:可用性 |
| ネットワーク分断、通信障害 | P:分断耐性 |
| 障害時に処理を止める | CP寄り |
| 障害時も処理を続ける | AP寄り |

「止めて正しさを守る」ならCP。
「ズレても動かす」ならAPって感じだね。
まとめ

CAP定理とは、分散システムで、
一貫性・可用性・分断耐性の3つを、ネットワーク分断時に同時に完全には満たせない
という考え方。

| 要素 | 意味 | 簡単なイメージ |
|---|---|---|
| C:一貫性 | どこで見ても同じデータ | 正しさ |
| A:可用性 | いつでも応答する | 止まらなさ |
| P:分断耐性 | 通信が切れても耐える | 通信切れへの強さ |

つまり、通信が切れたときに、
「正しさを守るために止める」のか、
「ズレても動かし続ける」のかを選ぶってことだね。

そうそう。
初心者向けに一言でまとめるなら、
CAP定理は、分散システムで「正しさ」と「止まらなさ」のどちらを優先するか考えるためのルール
だね。

