SYSTEM RELIABILITY / AVAILABILITY
システム稼働率を図で理解する|直列・並列・冗長化からSLOまで
サーバーを2台にしたら、どれほど止まりにくくなるのでしょうか。身近なWebアプリから出発し、装置のつながり・確率・障害対策を一つずつ理解します。
01|予約アプリが突然開けなくなったら
Next.jsで作成した予約フォームにアクセスすると、普段は数秒で画面が表示されます。しかしある日、Webサーバーの障害で応答しなくなりました。データベースのPostgresが正常でも、アプリの受付部分が動かなければ予約できません。反対にWebサーバーが正常でも、必須のDBが止まると予約処理は完了しない場合があります。
利用者のブラウザ
Next.js / APIサーバー
画面・予約要求を処理します
Postgres / Supabase
予約情報を読み書きします
これは「上から下まで必要な部品がそろって初めて成功する」構成です。信頼性の観点では直列システムと呼びます。Supabaseの実際の内部構成や保証値を示すものではなく、理解するための抽象モデルです。
02|稼働率とは何を表す数字ですか
稼働率(Availability、アベイラビリティ)は、対象のサービスが利用可能だった時間の割合です。24時間のうち22時間動いていれば、稼働率は22÷24≒91.67%です。停止時間を引いてから割るだけなので、まずは時計のイメージで考えます。
24時間のうち、停止していた時間を数えます
稼働率 A = 稼働時間 / (稼働時間 + 停止時間)
停止率 q = 1 - A
例: 22 / 24 = 0.9167 = 91.67%03|故障率と稼働率は同じではありません
ここで「故障する頻度」と「サービスが使える時間」を区別します。故障が頻繁でも数秒で自動復旧できる仕組みと、めったに壊れないものの復旧に3日かかる仕組みでは、ユーザーが感じる停止時間が異なります。
| 指標 | 日本語での意味 | 重要な問い |
|---|---|---|
| Availability(稼働率) | 利用可能な時間の割合 | どれほどの時間、使えますか。 |
| Reliability(信頼度) | 一定期間、故障せず動作する確率 | 途中で壊れずに走り続けますか。 |
| MTBF | Mean Time Between Failures:平均故障間隔 | 修理可能な装置は平均どの程度稼働してから次の故障に至りますか。 |
| MTTR | Mean Time To Repair/Restore:平均修復・復旧時間 | 障害から平均どの程度で復旧しますか。 |
故障と修復を繰り返す装置の単純な定常モデルでは A = MTBF ÷ (MTBF + MTTR) です。ただし故障・修復の定義や観測条件が変わると、公式の適用範囲も変わります。
04|直列構成:どれか1つ止まると全体が止まります
WebサーバーとDBの両方が必須なら、2つとも稼働している必要があります。Webが90%、DBが90%の確率で利用可能で、故障が互いに独立しているとすると、両方稼働する確率は0.9×0.9=0.81、つまり81%です。
Web
90%
DB
90%
成功
81%
直列2台: A = R1 × R2
同じ稼働率Rのn台直列: A = R^n
R = 0.9 → 2台直列は0.8105|並列構成:生き残ったサーバーが受け付けます
Webサーバーが2台あり、一方が故障してももう一方が利用者の要求を受けられる場合、両方が故障しない限りサービスは利用可能です。90%の装置なら1台の停止確率は10%。2台同時に停止する確率が0.1×0.1=0.01なので、全体の稼働率は1−0.01=99%です。
A:並列 — 片方だけでもサービス継続
リクエストの入口
上から下へ接続すると考えます
X1
X2
左右は並列です。どちらかの経路が動けば通過できます。
サービス提供
入口から出口まで動く経路が1本以上必要です
並列2台: A = 1 - (1 - R1)(1 - R2)
同じRの2台: A = 1 - (1 - R)^2
R = 0.9 → 0.99 = 99%06|構成A:Webサーバー2台の並列
同じ装置Xが2台あり、いずれか1台が正常なら動作できる構成をAとします。単体の稼働率をRとすると、A = 1−(1−R)² です。
A:並列 — 片方だけでもサービス継続
リクエストの入口
上から下へ接続すると考えます
X1
X2
左右は並列です。どちらかの経路が動けば通過できます。
サービス提供
入口から出口まで動く経路が1本以上必要です
07|構成B:並列でも共通部品が止まれば全停止です
2台のWebサーバーを並列にしても、その先に必須の単一の認証装置やDBがあるなら、最後の装置が止まると利用できません。並列部分の稼働率に共通装置のRを掛けます。B = R[1−(1−R)²] です。
B:並列の後ろに共通装置が直列
リクエストの入口
上から下へ接続すると考えます
X1
X2
左右は並列です。どちらかの経路が動けば通過できます。
X3:共通装置
ここが止まると両経路が止まります
サービス提供
入口から出口まで動く経路が1本以上必要です
ロードバランサーが1台だけの場合も、同様の単一障害点(SPOF:Single Point of Failure、単一障害点)になり得ます。ここでは装置3台の独立故障を仮定します。
08|構成C:直列の経路を丸ごと2組に複製します
Web+DBを1つの必須経路と考え、それを2セット並列化したイメージです。各経路は2台直列なので稼働率R²。経路が両方停止する確率を引けば C = 1−(1−R²)² です。
C:2台直列の経路が2本並列
リクエストの入口
上から下へ接続すると考えます
X1
X2
X3
X4
左右は並列です。どちらかの経路が動けば通過できます。
サービス提供
入口から出口まで動く経路が1本以上必要です
データがどちらの経路でも正しく利用できることや、経路の切替えが成立することを前提にしています。現実のDBレプリケーションや整合性維持は、単純な数式以上に設計が必要です。
09|数字で比較:A・C・Bの順になる理由
例としてR=0.9を代入してみます。A=0.99、B=0.9×0.99=0.891、C=1−(1−0.81)²=0.9639となり、A>C>Bです。
装置の稼働率が90%のとき
| 構成 | 計算 | 結果 |
|---|---|---|
| A | 1−(1−0.9)² | 99% |
| B | 0.9×[1−(1−0.9)²] | 89.1% |
| C | 1−(1−0.9²)² | 96.39% |
ただし、R=0.9という一例だけでは「0<R<1のすべてで同じ順位」とは証明できません。次の節で式によって確かめます。
10|どの稼働率でも順位が変わらない証明
まずAとBの差は、B=R×Aであり0<R<1ですからA>Bです。またR²<Rなので、直列2台の1経路は単体装置より停止しやすくなります。したがって2経路を並列化しても、A>Cです。
残るCとBは、式を展開すると比較できます。
B = R[1-(1-R)^2]
= 2R^2 - R^3
C = 1-(1-R^2)^2
= 2R^2 - R^4
C - B = R^3 - R^4 = R^3(1-R) > 0つまり0<R<1なら必ず A>C>B です。R=1などの端点では等しくなる場合があるため、範囲条件にも意味があります。
11|独立故障が崩れると数字はどうなりますか
直列・並列の積を使う計算では、故障が独立であることを仮定しています。しかし、2台のWebサーバーが同じラックの電源や同じリージョン、同じ設定ファイルを共有していれば、同時停止が起こり得ます。単純な並列式はそうした共通原因故障を織り込んでいません。
共通の電源・ネットワーク・設定
Web A
Web B
Web AとBが2台でも、上の共通部分が停止すると両方使えません。独立した故障とは限りません。
12|ホットスタンバイ・コールドスタンバイと負荷分散
| 方式 | 普段の状態 | 障害時の注意 |
|---|---|---|
| アクティブ・アクティブ | 複数台が同時に要求を処理します。 | 負荷容量、セッション、データ整合性を確認します。 |
| ホットスタンバイ | 待機機も動作し、比較的素早く切り替えられる状態です。 | 切替時間と状態同期を設計します。 |
| ウォームスタンバイ | 一部稼働・準備状態の予備機です。 | 昇格や準備に時間がかかることがあります。 |
| コールドスタンバイ | 予備機が停止または未起動の状態です。 | 起動・復元のため中断時間が長くなり得ます。 |
冗長化しても、無停止切替えや実行途中のトランザクション継続が自動的に保証されるわけではありません。そこには共有セッション、冪等性、DBレプリケーションなど別の仕組みが必要です。
13|MTBF・MTTRを使って稼働率を求めます
平均故障間隔MTBFが1,000時間で、平均修復時間MTTRが10時間とします。故障と修復を繰り返す定常モデルでは、稼働率は1,000÷(1,000+10)≒99.0099%です。故障を減らすだけでなく、検知と復旧を早めることも稼働率を高めます。
A = MTBF / (MTBF + MTTR)
例: 1000 / (1000 + 10) ≒ 0.990099
MTTRが1時間なら 1000 / 1001 ≒ 0.99900114|稼働率99.9%の停止時間を実感します
99.9%は高い数字に見えますが、30日間では約43.2分の停止時間に相当します。99.99%なら約4.32分です。サービスの目標として使う場合は、対象時間や計測方法を一緒に示します。
| 稼働率 | 30日間の停止時間換算 |
|---|---|
| 99% | 7.2時間 |
| 99.9% | 43.2分 |
| 99.99% | 4.32分 |
| 99.999% | 約25.92秒 |
15|SLA・SLO・SLIは何が違いますか
SLI(Service Level Indicator)は実測する指標です。例えば「予約APIのリクエスト成功率」を指します。SLO(Service Level Objective)はその目標水準で、例えば「30日間の成功率99.9%以上」です。SLA(Service Level Agreement)はサービス品質に関する合意・契約で、達成できない場合の条件を含むことがあります。
| 略語・読み方 | 正式名称 | 使い道 |
|---|---|---|
| SLI(エスエルアイ) | Service Level Indicator | 測定する指標 |
| SLO(エスエルオー) | Service Level Objective | 達成すべき目標 |
| SLA(エスエルエー) | Service Level Agreement | 利用者と提供者の合意 |
| SPOF(スポフ) | Single Point of Failure | 単一障害点 |
16|RTOとRPO:復旧の『時間』と『データ』を分けます
RTO(Recovery Time Objective、目標復旧時間)は、障害後どのくらいの時間で復旧するかという目標です。一方RPO(Recovery Point Objective、目標復旧時点)は、どこまで古い時点のデータへ戻ることを許容するかという目標です。30分で再起動できても、前日のバックアップしかなければ直近の予約を失うかもしれません。
RTO:復旧まで
停止した時刻 → サービスが戻るまで
RPO:戻るデータの時点
障害時刻 → 復旧可能なデータ時点まで
17|Supabaseを使う設計ではどこを見るべきですか
Supabaseを用いたアプリでも、利用者から見るとブラウザ・フロントエンド配信・API・認証・データベース・ストレージなど複数のサービスが組み合わさっています。予約の成功条件によって必須の経路が変わるため、どの要素が止まると機能が使えないかをノード図に整理します。
利用者 / Next.js画面
予約を処理するAPI
認証(必要なら)
必要な操作で認証情報を検証
Postgres
予約の保存と整合性
予約確定レスポンス
18|操作ラボ:装置を落として確かめます
稼働率を変えたときのA・B・Cの数値を比較し、各装置をクリックして故障させてください。並列の片方だけが壊れたときと、直列の共通装置が壊れたときの違いが見えるようになっています。
操作ラボ|システムの故障と稼働率
装置ごとの稼働率を変えると理論上の全体稼働率が変わります。「故障させる」は特定時点の動作確認であり、長期稼働率の計算とは別です。
1位:構成A
99.000%
2台並列
2位:構成C
96.390%
2台直列を2組並列
3位:構成B
89.100%
2台並列+1台直列
構成Aの故障シミュレーション
システム全体:サービス提供可能
A:1台でも生存。B:X1かX2が生存、かつX3が生存。C:X1とX2の両方、またはX3とX4の両方が生存。
予想停止時間(独立故障モデル)
約432.0分 / 30日
期待値 = 期間(分)× (1 − 全体稼働率)です。実際の停止時間の予測ではなく、各装置の独立性と一定の稼働率を仮定した単純モデルです。
復旧時間を変えるとどうなりますか
例:1装置がMTBF 10,000分、MTTR 60分の場合、定常稼働率は 99.404% です。
こちらは上の稼働率スライダーとは独立した参考計算です。
19|設計に使うチェックポイント
| 確認項目 | 確認する理由 |
|---|---|
| ユーザーの成功条件 | 見かけのHTTP応答だけでなく、予約確定などの業務機能を監視するためです。 |
| 共通障害点 | 2台あっても同じ電源・DNS・DBが止まれば全停止する場合があるためです。 |
| 独立性の検証 | 理論式が前提とする独立故障が現実に近いか評価するためです。 |
| 復旧時間・復旧時点 | RTO・RPOを機能とデータの両面で守るためです。 |
| 再送・冪等性 | 通信断や切替後の二重登録を防ぐためです。 |
| 監視と訓練 | 故障を早期検知し、復旧手順を確認するためです。 |
20|まとめ:部品ではなく『経路』で考えます
稼働率の計算では、すべて必要な装置を直列、いずれかで代替できる経路を並列として捉えます。直列は掛け算、並列は「すべて停止する確率を1から引く」のが基本です。共通障害点や復旧時間、状態同期などを考慮すると、机上の数値を現実の設計へつなげられます。
まず利用者の操作がどの経路を通るかを描き、次に単一障害点を探し、最後に稼働率と復旧能力を設計する。この順番なら、新しいサービス構成でも応用できます。
参考資料
- Site Reliability Engineering — Service Level Objectives — Google
- Site Reliability Engineering — Embracing Risk — Google
- AWS Well-Architected Framework — Reliability Pillar — Amazon Web Services
- Reliability Engineering — NIST Engineering Statistics Handbook