🍰 まずはやさしく
使いたいときに使える性質のことです。
サービスが止まらないようにするために使います。
スマホのアプリがいつでも開く状態のことです。
結論として大切なポイントを読みましょう。
可用性:必要なときに情報にアクセスできる性質
🍰 まずはやさしく
セキュリティを守るための3つの要素の一つです。
情報の扱い方を正しく決めるために使います。
部活の共有ファイルにいつでも触れることです。
この言葉がどんな場面で使われるか読みましょう。
この用語は セキュリティ カテゴリに属します。 関連する別称・略号:(なし)。
論文・実務レポートで 可用性 が登場したら、 まず本ページの「30秒で分かる結論」と「直感で掴む」を読めば、 その文脈で何を言っているか把握できます。
本ページの「可用性」は 情報セキュリティ CIA 三要素 のうち A (Availability) を指し、 「許可された人がいつでもデータ・サービスにアクセスできる性質」を意味します。
可用性 (Availability) は SLA (Service Level Agreement) の中核指標として「N nines」で表現されます。 SSDSE-B-2026 の 47 都道府県データを「行政サービスのアクセス可用性」に見立て、 N nines が実運用にどう効くかを定量化します。
| SLA | 可用率 | 年間許容停止 | 月間許容停止 | 用途例 |
|---|---|---|---|---|
| 2 nines | 99% | 3.65 日 | 7.2 時間 | 社内ツール |
| 3 nines | 99.9% | 8.77 時間 | 43.8 分 | 業務 SaaS |
| 4 nines | 99.99% | 52.6 分 | 4.38 分 | EC / 決済 |
| 5 nines | 99.999% | 5.26 分 | 26 秒 | 通信基盤・金融 |
🎯 このコードでやること:SSDSE-B-2026 の都道府県別人口を「過去 1 ヶ月の月次 ping 成功回数」に正規化し、 各都道府県サービスの可用率と SLA 階級を判定する。 これは fault tolerance の評価でも実際に使われる「成功回数 / 試行回数」型集計の写経例。
📥 入力例 (SSDSE-B-2026 抜粋を ping 試行数として解釈):
1 2 3 4 5 6 7 8 9 10 11 12 13 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023][['Prefecture', 'A1101']].rename(columns={'A1101': 'pop'}) # 1 分粒度の月次 ping 試行 43200 回として、 人口規模に応じて成功率が変動する想定 df['ping_attempts'] = 30 * 1440 # 43200 # 人口が大きい都市ほど stress が大きく成功率がわずかに下がる仮想モデル df['ping_success'] = (df['ping_attempts'] - (df['pop'] / 5_000_000 * 3).round()).astype(int) df['availability'] = df['ping_success'] / df['ping_attempts'] df['nines'] = df['availability'].apply(lambda a: 5 if a>=0.99999 else 4 if a>=0.9999 else 3 if a>=0.999 else 2) print(df[['Prefecture', 'availability', 'nines']].head(7).to_string(index=False)) print('全国平均可用率 =', round(df['availability'].mean(), 6)) |
📤 実行例:
💬 結果の読み方 → 47 都道府県平均で 4 nines(99.99%)水準。 人口最大の東京は最も成功数を落とし 4 nines ぎりぎり、 鳥取・島根のような小規模県は 5 nines 寸前。 実運用でも「トラフィックの偏りに応じて nines が劣化する」現象を再現できる。
💡 SLA で「N nines」を約束するなら、 上記 3 戦略を組み合わせて「単一障害点が存在しない」状態に持ち込むのが鉄則。 SSDSE-B-2026 のように 47 並列のセルが存在する構造は、 そもそも分散システムの教材として極めて優れている。
可用性 (Availability) は 稼働時間 / (稼働時間 + 停止時間) という単純な比率で書けるが、 実際の設計現場では「N nines を守るために何の数値を、 どう動かすか」が問われる。 ここでは 3 枚の図と 2 本の Python コードで MTBF/MTTR/N+1 冗長化の効きを可視化する。
→ 1 nine 増えるごとに許容停止時間が約 1/10 になる。 4 nines (52 分/年) と 5 nines (5 分/年) の差は 10 倍だが、 必要な冗長化コストは指数関数的に増える。
→ MTBF (Mean Time Between Failures) を増やす (故障しにくくする) より、 MTTR (Mean Time To Repair) を短縮する (復旧を早くする) ほうが、 多くの場合コスト効率が良い。 自動フェイルオーバが効くのはここ。
→ N+1 冗長化は「故障の独立性」が成り立つときに最大効果を発揮する。 同一電源・同一スイッチ配下の冗長は相関故障で台無しになる。 物理的・地理的分離が前提。
並列冗長系の Availability は次の式で計算する:
直列構成 (全機器が稼働しないと全体が稼働しない) では掛け算になり、 nines は確実に減る:
直列 3 段で各 4 nines (0.9999) のシステムは、 全体で 3.99... nines ≈ 0.9997 にしかならない。 「nines はチェーンの中で一番弱いリンクで決まる」。
このコードでやること: N nines (99%, 99.9%, ..., 99.9999%) ごとの年間許容停止時間 (秒・分・時間・日) を一覧で計算する。
📥 入力データ (Python リストとして定義):
1 2 3 4 5 6 7 8 9 10 11 | # N nines と年間停止時間の対応 year_seconds = 365 * 24 * 60 * 60 nines_list = [0.99, 0.999, 0.9999, 0.99999, 0.999999] print(f"{'A':>10} {'年間停止 (s)':>16} {'分':>10} {'時間':>8} {'日':>8}") for A in nines_list: down_s = (1 - A) * year_seconds down_m = down_s / 60 down_h = down_s / 3600 down_d = down_h / 24 print(f"{A:>10.6f} {down_s:>16,.0f} {down_m:>10.1f} {down_h:>8.2f} {down_d:>8.3f}") |
📤 実行すると次の出力が得られる:
💬 結果の読み方 → 4 nines (99.99%) で年間 52.6 分。 これは「メンテ窓 1 回 (30 分) で半分を使い切る」レベル。 5 nines (99.999%) になると 5.3 分 / 年で、 OS パッチ適用すらできない。 SLA で 4 nines を超える数字を提示するときは、 ローリング更新・カナリアデプロイの仕組みがなければ守れない。
このコードでやること: 単一機器の Availability (3 nines) を起点に、 1 台 / 2 台 / 3 台 / 4 台 の並列冗長構成それぞれで「全体 Availability」と「年間停止時間」がどう変わるかを計算する。
📥 入力データ (単機 Availability と冗長段数):
1 2 3 4 5 6 7 8 9 10 11 | # N+1 冗長化シミュレーション (独立故障仮定) A_single = 0.999 year_seconds = 365 * 24 * 60 * 60 print(f"{'n':>3} {'A_parallel':>14} {'nines':>8} {'年間停止 (分)':>16}") for n in [1, 2, 3, 4]: A_par = 1 - (1 - A_single) ** n import math nines = -math.log10(1 - A_par) if A_par < 1 else float('inf') down_m = (1 - A_par) * year_seconds / 60 print(f"{n:>3} {A_par:>14.9f} {nines:>8.2f} {down_m:>16.2f}") |
📤 実行すると次の出力が得られる:
💬 結果の読み方 → 単機 3 nines を 2 台並列にするだけで全体は 6 nines (年 32 秒) になる。 ただしこれは「故障が完全に独立」の理想値。 現実には共通電源・共通スイッチ・共通バグ (ソフトウェア相関故障) があるため、 6 nines 計算値の構成でも実測は 4-5 nines に留まることが多い。 だからこそ AZ (Availability Zone) を跨いだ配置や Chaos Engineering での検証が要求される。
💡 補講のまとめ: N nines を 1 段上げるコストは指数関数的。 MTBF を伸ばすより MTTR を縮める方が費用対効果が良いケースが多く、 冗長化は「故障の独立性」が成り立つ範囲でしか効かない。 SSDSE-B-2026 のように 47 並列の独立データソースを抱える構造は、 高可用性システムの教科書的事例として極めて優れている。
🍰 まずはやさしく
電車の運休率のようなイメージです。
どれくらい安定しているかを知るために使います。
家のWi-Fiが急に切れない状態のことです。
直感的に理解するための例を読みましょう。
ATM に行ったら「メンテナンス中」だと困る。 ネットバンクが DDoS でアクセス不能でも困る。 これらが 可用性 (Availability) が損なわれた状態。 情報セキュリティの三大要素は Confidentiality (機密)・Integrity (完全)・Availability (可用) で、 鍵の管理だけでなく「使いたいときに使える」も同じくらい重要。
可用性は抽象的に感じられがちですが、 「電車・郵便・水道」のような日常インフラの安定性に置き換えるとイメージしやすくなります。
| レベル | 数値 | 日常での体感 | 代表サービス |
|---|---|---|---|
| 90% (one 9) | 月 73 h 停止 | 家庭用 Wi-Fi、 古いプリンタ | 家庭サーバー |
| 99% (two 9s) | 月 7.2 h 停止 | 地方ローカル鉄道 | 社内ツール |
| 99.9% (three 9s) | 月 43 分停止 | 山手線(雪日除く) | 一般 SaaS |
| 99.99% (four 9s) | 月 4.3 分停止 | 新幹線運行管理 | B2B 基幹 SaaS |
| 99.999% (five 9s) | 月 26 秒停止 | 国際電話交換機 | 通信キャリア |
数字が 1 桁増えるごとに、 達成のためのコストは 3〜10 倍に跳ね上がる ── これが可用性設計の核心。
SSDSE-B-2026 (47 県統計) を社外配信する API の SLA 文書を実例として示します。
| 条項 | 内容 |
|---|---|
| 対象サービス | SSDSE-B-2026 全 47 県データ API (GET /api/v1/prefecture/{code}) |
| 可用性 SLO | 月次 99.9% (43.2 分以内の月次停止を許容) |
| レイテンシ SLO | p95 200ms 以内 (東京リージョン) |
| 計画停止 | 月最大 60 分 (土曜 03:00-04:00 のみ、 14 日前予告) |
| 違反時 SLA クレジット | 99.0-99.9% → 10% 返金、 95.0-99.0% → 25% 返金 |
| 適用除外 | DDoS、 顧客側ネットワーク障害、 不可抗力 |
| 測定方法 | 外部 Synthetic Monitor 1 分間隔、 月次レポート公開 |
| パターン | 想定到達 SLO | 代表構成 |
|---|---|---|
| 単一サーバー + 日次バックアップ | 99% | VPS 1 台、 cron で snapshot |
| 2-AZ Active-Passive + LB | 99.9% | EC2 × 2 (異 AZ)、 ALB、 RDS Multi-AZ |
| 3-AZ Auto Scaling + Multi-AZ DB | 99.95% | EC2 ASG (min=3)、 RDS Aurora |
| マルチリージョン Active-Active | 99.99% | Route53 latency-based + Aurora Global |
| マルチクラウド + DNS Failover | 99.999% | AWS + GCP + 専用 DNS GSLB |
「99.999% のために 2 クラウド契約するか?」は経営判断。 ほとんどの SaaS は 99.9 〜 99.95% が経済合理ライン。
🍰 まずはやさしく
稼働率(動いている時間の割合)のことです。
正確な数字で安定性を測るために使います。
故障してから直すまでの時間を計算します。
計算するための数式について読みましょう。
MTBF (平均故障間隔, Mean Time Between Failures) と MTTR (平均復旧時間, Mean Time To Repair) で稼働率 $A$ を表す。 99.9% を維持するには「壊れにくさ」と「直すスピード」の両立が必要。
可用性 (Availability) を表す中心式は次の 4 つです。 用語コンペ・SLA 設計・SRE 実務でこの 4 つを区別できるかどうかが鍵になります。
🔬 数式を言葉で読み解く:分子の MTBF (Mean Time Between Failures) は「障害から障害までの平均稼働時間」、 分母には MTBF に MTTR (Mean Time To Repair)「平均復旧時間」を加える。 つまり「稼働時間 ÷ (稼働時間+停止時間)」を時間平均した値。
🔬 数式を言葉で読み解く:時刻 t でシステムが稼働している確率。 起動直後は 1 から始まり、 やがて定常値 \\(A_{\\mathrm{steady}}\\) に近づく。
🔬 数式を言葉で読み解く:直列接続では「全コンポーネントが同時に稼働」が条件。 99.9% を 5 段直列すると \\(0.999^5 \\approx 0.995\\) に低下する。
🔬 数式を言葉で読み解く:並列冗長は「全コンポーネントが同時に停止」しないと止まらない。 99.9% を 2 重化すると \\(1 - 0.001^2 = 0.999999\\) (six 9s) に跳ね上がる。
「Up か Down か」の 2 値だけでは現代システムは表現しきれません。 機能の一部のみ停止する Graceful Degradation と、 容量を絞って稼働させる Brownout が現代的可用性の概念。
| パターン | 説明 | SLA 上の扱い |
|---|---|---|
| Full Up | 全機能稼働 | 100% カウント |
| Graceful Degradation | 読込はできるが書込不可、 ML 推論はできるが学習停止 | 機能別重み付け SLA |
| Brownout | QPS 制限・キャッシュ強制・低解像度返却 | レイテンシ SLO で計上 |
| Partial Outage | 機能 A は停止、 機能 B は稼働 | 機能別 SLA で部分カウント |
| Full Down | 全機能停止 | 0% カウント |
機能 \\(i\\) (例: 検索・購入・推薦) の重要度を \\(w_i\\)、 各機能の可用性を \\(A_i\\) とし、 加重平均で全体可用性を定義。 「全機能 = 等価」ではなく、 「収益直結機能 = 重み大」と扱う現代的アプローチ。
🎯 このコードでやること:SSDSE-B-2026 配信 API の機能 (一覧/詳細/集計/比較) ごとに重み付き可用性を計算。
📥 入力データ (機能別 SLO):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import pandas as pd functions = pd.DataFrame([ {'name': 'list', 'weight': 0.40, 'availability': 0.9995}, {'name': 'detail', 'weight': 0.30, 'availability': 0.9990}, {'name': 'aggregate', 'weight': 0.20, 'availability': 0.9970}, {'name': 'compare', 'weight': 0.10, 'availability': 0.9950}, ]) assert abs(functions['weight'].sum() - 1.0) < 1e-9 A_w = (functions['weight'] * functions['availability']).sum() A_min = functions['availability'].min() print(functions) print(f'\\n重み付き可用性: {A_w:.6f} ({A_w*100:.4f}%)') print(f'最弱機能可用性: {A_min:.6f} ({A_min*100:.4f}%)') print(f'差分 (SLA 緩和効果): {(A_w - A_min)*100:.4f} %pt') |
📤 実行結果:
💬 結果の読み方:最弱機能 (compare) は 99.5% だが、 重要度が低い (重み 0.10) ので全体 SLA は 99.84%。 「最弱機能 = 全体 SLA」と扱うと過剰投資になる。 機能別重み付けで現実的な SLA を約束できる。
数式に出てくる記号の意味を 1 つずつ確認しましょう。
可用性 (Availability) は、 システムが「使えるべき時に使える」割合を時間で表す指標で、 古典的な数式は $A = \dfrac{\text{MTBF}}{\text{MTBF} + \text{MTTR}}$ です。 ここで MTBF (Mean Time Between Failures) は故障間の平均稼働時間、 MTTR (Mean Time To Repair) は故障から復旧までの平均時間。 たとえば MTBF = 720 時間 (30 日)、 MTTR = 1 時間なら $A = 720/(720+1) \approx 0.9986$ で、 これは 99.86% の可用性に相当します。 業界では「9 の数」で表現する慣例があり、 99.9% (Three Nines)、 99.99% (Four Nines)、 99.999% (Five Nines / 銀行・通信レベル) と上がるごとに年間許容停止時間が 1/10 に減ります。 99.999% は年 5 分強、 99% は年 87.6 時間 ── 設計コストは 9 が 1 つ増えるたびに指数的に膨らむため、 SLA (Service Level Agreement) では「何 9 を目指すか」が経営判断になります。 セキュリティの観点から見ると、 可用性は CIA トライアド (機密性 Confidentiality、 完全性 Integrity、 可用性 Availability) の 1 角で、 DDoS 攻撃、 ランサムウェア、 物理的災害、 電源障害、 設定ミス、 ソフトウェアバグなど多様な脅威にさらされます。 確率的には「並列冗長」が可用性を引き上げます ── 単体可用性 $A$ の機器を $n$ 個並列に並べると、 システム可用性は $1 - (1-A)^n$ となり、 99% を 2 機並列にすれば 99.99% に。 反面、 直列構成 (相互依存) では $A^n$ に落ち、 弱い構成要素が全体を律します。 SSDSE-B-2026 のようなオープンデータの可用性は、 統計センターの公開サーバー稼働率に依存しますが、 ユーザー側でも GitHub Mirror、 Internet Archive スナップショットを保持することで「データ可用性」を高められます。 結局、 可用性は単なる稼働率の話ではなく、 「冗長化 × 監視 × 自動復旧 × 災害対策」の総合芸術です。
ATM が「停止中」と表示された経験はありますか? 緊急時に病院の電子カルテが繋がらないと命に関わります。 可用性は「必要な時に動く」という当たり前を支える概念。 機密性・完全性が満たされていても、 使えなければサービスは存在しないも同然です。
$A = \dfrac{\text{MTBF}}{\text{MTBF}+\text{MTTR}}$ は「全時間の中で稼働していた割合」を表します。 MTBF を伸ばす方向 (信頼性向上)、 MTTR を縮める方向 (復旧自動化) の 2 軸で改善できます。 99.99% を目指すなら MTBF/MTTR の比を 10,000 以上にする必要があります。
SSDSE-B-2026 の CSV は統計センターから公開されています。 仮にこのサーバーが MTBF=720h, MTTR=2h なら $A = 720/722 \approx 0.9972$、 つまり年間で約 24 時間程度のダウンが見込まれる計算。 これを補うため、 ローカルキャッシュ・ミラーリング・バックアップを併用するのが教育用ハンズオン教材としての可用性確保策です。
監視には requests.get(url, timeout=5) でレスポンス時間を計測、 schedule ライブラリで定期実行。 Prometheus / Grafana への送信は prometheus_client ライブラリ。 SLA 違反検知は単純な閾値ベースで十分機能します。
記号一覧:
SLO 99.9% なら月次 43.2 分の予算が「攻めの開発」と「事故対応」の両方に使える。 これが Error Budget Policy の数学的根拠。
| SLO | 月次 Budget | 運用方針 |
|---|---|---|
| 99.5% | 216 分 (3.6 h) | 攻めの開発を最大化 |
| 99.9% | 43.2 分 | 標準 SaaS 水準 |
| 99.95% | 21.6 分 | B2B 重要システム |
| 99.99% | 4.32 分 | 即時自動 fail-over 必須 |
本節では「可用性 $A = \mathrm{MTBF}/(\mathrm{MTBF}+\mathrm{MTTR})$」を SSDSE-B-2026 の 47 都道府県データソースに当てはめ、 各県のデータ更新頻度・欠測復旧時間から「県別可用性スコア」を導出する手順を、 記号→意味→数値の三段階で読み解く。 $\mathrm{MTBF}$ は平均故障間隔(県データが連続して出続けた期間)、 $\mathrm{MTTR}$ は平均復旧時間(欠測→次の値が出るまでの日数)と読み替える。 つまり「県の指標が信頼できる期間 ÷ 全観測期間」が、 そのままその県の SSDSE 可用性係数になる。
記号の対応表を作ると次のようになる: MTBF = 連続正常観測日数の平均、 MTTR = 欠測検知から代替値補完までの平均日数、 A = 0 から 1 の無次元値、 1-A = 不可用率(ダウンタイム比)、 SLO = ステークホルダー合意の最低保証 $A$。 SSDSE-B-2026 を月次更新と仮定すると、 1 ヶ月欠測すれば MTTR = 30 日、 過去 5 年欠測なしなら MTBF = 1,825 日、 $A = 1825/(1825+30) \approx 0.9838$(98.38%、 約 1.8 nines)となる。 これを 47 県すべてに対して計算すれば、 県ランキング表が描ける。
このコードでやること: SSDSE-B-2026 の 47 県 × 複数年データから、 各県の擬似欠測パターン(最新年が NaN になる頻度)を集計し、 県別可用性係数 $A_i = \mathrm{MTBF}_i/(\mathrm{MTBF}_i+\mathrm{MTTR}_i)$ を計算する。 真の欠測ログが存在しない場合は、 各列の欠測率を不可用率 $1-A$ に見立てる近似版で代用する。
📥 入力データ (SSDSE-B-2026 抜粋・47 県 × 数値カラム):
1 2 3 4 5 6 7 8 9 10 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932') num_df = df.select_dtypes(include='number') miss_rate_by_pref = num_df.isna().mean(axis=1) A_by_pref = 1.0 - miss_rate_by_pref pref_names = df['Prefecture'] if 'Prefecture' in df.columns else df.iloc[:, 1] result = pd.DataFrame({'Prefecture': pref_names, '可用性A': A_by_pref.round(4)}) print(result.sort_values('可用性A', ascending=False).head(10).to_string(index=False)) print('全国平均 A =', round(A_by_pref.mean(), 4)) |
📤 実行すると次の出力が得られる(イメージ値、 SSDSE-B-2026 の構造に依存):
💬 結果の読み方: 全国平均 $A \approx 0.9923$ は約 2 nines(年間 67 時間ダウンタイム相当)。 4 nines を目指すには、 中小県のデータ補完体制(代替指標・線形補間・前年値リサイクル)を組み込んで $1-A$ を 100 倍小さくする必要がある。 つまり 1 県あたり「年に数行の補完」がベースライン。 SSDSE データソースに対する SLO 文書を書く際の出発点として、 この近似 $A$ は十分実用的である。
補足: 実欠測がほとんど無い場合、 上記近似 $A$ は 1.0 に貼り付いてしまう。 そのときは「最新年の更新遅延(出版から N ヶ月)」を MTTR として使い、 $A = T/(T+\mathrm{delay})$ で代用する。 これにより「データの鮮度」を可用性に取り込める。 SSDSE-B-2026 の公開タイミングが年 1 回 (T=365 日) で、 観測年から公開まで遅延 90 日なら $A = 365/(365+90) \approx 0.802$、 これは「データ鮮度の可用性」として SLO 設計に直結する数値となる。
補講: 可用性 $A$ の定義は単純だが、 「どのイベントを故障とみなすか」「どの状態を復旧とみなすか」の境界次第で値が大きく変わる点に注意。 SSDSE-B のような公的統計においては「欠測」「遅延公開」「分類変更による不整合」の 3 つすべてが事実上の故障に該当しうる。 用途別に MTBF/MTTR の定義を 1 ページ文書として固定するのが運用上の鉄則であり、 これを決めないまま $A$ を比較すると同じ県の数値が利用者ごとに違ってくる。 可用性指標は「定義の明文化」とセットでしか意味を持たない、 という設計者向けの教訓を残しておく。
これまで本ページでは可用性 A = MTBF / (MTBF + MTTR) という定常解、 直列構成 A_serial = ∏ A_i、 並列構成 A_parallel = 1 - ∏ (1 - A_i) の 3 種類の数式を扱ってきた。 ここでは、 これらの数式を「実際の運用現場で何を意味するのか」という観点から再度ことばで読み解き、 47 都道府県のオープンデータ API を例に踏み込んで分析する。 数式そのものは難しくないが、 SLO/SLA を交渉する場面、 障害対応の優先度を決める場面、 冗長化投資の意思決定をする場面では、 同じ数式が異なる重みを持つ。 とくに「A = 0.999 と A = 0.9999 では年間ダウンタイムが 9 倍違う」という事実は、 ベンダーとの契約交渉の現場では決定的に重要になる。 以下では SSDSE-B-2026 (47 都道府県・2020 年実数値) を実際に使い、 これらの指標を都道府県別 API 稼働率という具体例で計算する。
| 数式 | 記号の意味 | 運用現場での解釈 |
|---|---|---|
A = MTBF/(MTBF+MTTR) | MTBF=平均故障間隔、 MTTR=平均復旧時間 | 「壊れない時間」と「壊れた後に直す時間」の比。 直す時間を半分にすれば、 可用性は同じだけ向上する |
U = 1 - A | 不可用性 | 年間ダウンタイム = U × 525,600 分。 4 nines (A=0.9999) なら年 52.56 分、 5 nines なら年 5.26 分 |
A_serial = ∏ A_i | 部品 i の可用性 A_i の積 | 直列では「最弱の鎖が全体を決める」。 A=0.99 が 5 つ並べば全体 0.951 まで落ちる |
A_parallel = 1 - ∏ (1-A_i) | 不可用性の積を 1 から引く | 並列冗長は「全部が同時に死ぬ確率」を計算する。 ただし独立故障の仮定が崩れる (共通電源など) と一気に劣化する |
MTTF + MTTR ≈ MTBF | MTTF=平均故障時間 (故障までの稼働時間) | MTBF を直接測れない場合、 MTTF + MTTR の合計で近似する |
SSDSE-B-2026 の都道府県人口を「各県の都道府県統計 API の月間稼働ログ」と読み替えて、 可用性計算の入力として使用する。 人口が多い県ほどアクセスが多く、 障害も多発するという仮定を置いた。
このコードでやること: SSDSE-B-2026 の都道府県人口に基づく架空 API ログから、 各県の可用性 A = MTBF/(MTBF+MTTR) を計算し、 47 県 API を「直列で全て使う場合」と「並列冗長で使う場合」の総合可用性を比較する。 さらに東京 1 県 vs 47 県平均で 1 nines 差がどう生まれるかを可視化する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import pandas as pd from functools import reduce import math # SSDSE-B-2026 の都道府県人口に基づく架空 API 稼働ログ (7 県抜粋) df = pd.DataFrame({ "pref": ["北海道", "東京都", "神奈川県", "大阪府", "愛知県", "鳥取県", "島根県"], "MTBF": [1490, 342, 595, 630, 780, 10800, 8640], "MTTR": [1.5, 3.2, 2.8, 2.5, 2.0, 0.8, 0.9], }) df["A"] = df["MTBF"] / (df["MTBF"] + df["MTTR"]) df["nines"] = df["A"].apply(lambda a: -math.log10(1 - a)) print(df[["pref", "A", "nines"]].round(5)) # 7 県 API を全て直列で使う (どれか 1 つでも落ちたら全体が落ちる) A_serial = reduce(lambda x, y: x * y, df["A"]) # 7 県 API を並列で使う (全部同時に落ちたら全体が落ちる) A_parallel = 1 - reduce(lambda x, y: x * y, 1 - df["A"]) print(f"7 県直列 A = {A_serial:.6f} → 年間ダウン {(1-A_serial)*525600:.1f} 分") print(f"7 県並列 A = {A_parallel:.10f} → 年間ダウン {(1-A_parallel)*525600:.4f} 分") |
📤 実行すると次の出力が得られる:
💬 結果の読み方: 東京 (A=0.99072 ≈ 2 nines) は人口集中による高負荷で MTBF が短く、 結果として鳥取 (A=0.99993 ≈ 4 nines) に対して 1000 倍以上の年間ダウン時間を持つ。 全 7 県を直列で使う構成 (例: 全県の API を順次叩いて集計するバッチ) では、 個別の可用性が高くても積で 0.9785 まで落ち、 年間ダウンは 11,280 分 (= 188 時間) に達する。 一方で全 7 県を並列冗長で使う構成 (例: どれか 1 県の API から取れれば OK) なら 10 nines 級 (年間 0.0004 分) まで上がる。 これが「直列は最弱の鎖が支配し、 並列は最強の鎖を活かす」という原則の実数値検証である。
A = MTBF/(MTBF+MTTR) という数式は、 ベンダーとの契約交渉で次のように使われる。 まずベンダー側が「99.9% 保証 (3 nines)」を提示してきたとする。 これは年間 525.6 分 (= 8.76 時間) のダウンを許容する契約だ。 ところが顧客側の業務要件が「年間ダウン 60 分以内」なら 4 nines (99.99%) が必要になる。 この場合、 ベンダーに MTTR の短縮を要求するのが定石である。 たとえば現状 MTBF=10000h、 MTTR=10h なら A=0.999001 (3 nines)、 これを 4 nines にするには MTTR を 1.0h まで短縮すれば A=0.999900 となる。 つまり MTBF を変えずに復旧体制を 24/7 化するだけで 1 nines 上がる。 一方、 MTBF を倍にして 20000h にしても MTTR=10h のままなら A=0.999500 で 3 nines 半までしか到達しない。 ここから「MTTR 短縮の方が費用対効果が高い」という運用設計の鉄則が導かれる。
A_parallel = 1 - ∏(1-A_i) は「各構成要素の故障が独立に起こる」という強い仮定の上で成り立つ。 現実の運用では、 共通電源・共通ネットワーク・共通リージョン・共通ライブラリ更新など「共倒れポイント (single point of failure)」が必ず存在し、 これが残る限り並列冗長の効果は理論値より大幅に劣化する。 また Brown-out (部分機能停止) を含めて「完全な ON/OFF ではなくレスポンス時間 50% 劣化」のような中間状態を考慮すると、 単純な A の積和では捉えられない複合可用性 (composite availability) の議論が必要になる。 SSDSE-B-2026 の 47 都道府県データは独立性の高い分散データソースなので、 並列冗長の理論値に近い挙動が期待できるが、 同じ統計庁から配信される性質上、 統計庁側の障害が共通故障モードとして残ることに注意が必要である。
可用性 (Availability) は信頼性 (Reliability) と回復性 (Recoverability) の積算として理解できる。 信頼性 R(t) は「時刻 t まで故障しない確率」で、 指数分布を仮定すると R(t) = exp(-t/MTBF) と書ける。 一方、 回復性は MTTR の小ささそのもの。 ディペンダビリティ (Dependability) は「可用性 + 信頼性 + 安全性 + 保全性 + 機密性 + 完全性」の総合概念で、 ISO/IEC 25010 の品質モデルでも独立の品質特性として位置づけられている。 SLO の文書化においては、 これらを混同せず別個に数値目標を持つのが鉄則である。 例えば「Availability 99.95%、 MTBF 720 時間、 MTTR 30 分、 RPO 5 分、 RTO 60 分」のように、 連続稼働 (Availability)・故障頻度 (MTBF)・復旧速度 (MTTR)・データ損失許容量 (RPO)・サービス停止許容時間 (RTO) を別個に契約に明示する。 これらを 1 つの「99.9%」だけで表現しようとすると、 障害発生時の責任所在が不明確になり、 訴訟リスクが上昇する。 さらに、 chaos engineering (意図的に障害を注入してシステム挙動を観察する手法、 Netflix 由来) では、 これらの指標を実環境で能動的に劣化させて測定するため、 数式上の理論値と実測値が一致するかの検証が可能になる。
可用性 A = MTBF/(MTBF+MTTR) は単なる比率ではなく「壊れる時間 vs 直る時間」の交渉ツールである。 直列は最弱が支配し、 並列は独立性が前提。 N nines を 1 段上げるには MTBF を 10 倍にするか MTTR を 1/10 にするかの 2 択で、 多くの場合は後者の方が安価。 SSDSE-B-2026 の 47 都道府県データを使った数値検証では、 7 県直列 A=0.9785 (年間 188 時間ダウン) vs 7 県並列 A=0.9999999992 (年間 0.0004 分ダウン) という劇的な差が確認できた。 また、 可用性は信頼性 R(t)・回復性・ディペンダビリティといった上位概念とセットで扱うべきであり、 RPO/RTO とも別個に SLO 文書に明記すること。 これにより障害時の責任所在が明確化され、 chaos engineering での実測検証が可能になる。
MTBF = 720 時間 (1 ヶ月)、 MTTR = 1 時間のシステムの稼働率を計算する。
仮想シナリオ:SSDSE-B-2026 を 47 都道府県の医療システム可用性データとして再解釈し、 全国 47 拠点を並列構成と仮定して系全体の可用性を求めます。
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd, numpy as np
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=[1], encoding='cp932')
# 仮想:人口総数を医療システム稼働ホスト数に見立て、 各拠点 MTBF=720h、 MTTR=2h
df['MTBF'] = 720
df['MTTR'] = 2
df['Availability'] = df['MTBF'] / (df['MTBF'] + df['MTTR'])
print('全国平均可用性:', df['Availability'].mean())
print('最低可用性:', df['Availability'].min())
# 並列冗長: 47 拠点すべて並列の場合の系可用性
p_fail_each = 1 - df['Availability'].iloc[0]
system_avail = 1 - p_fail_each ** 47
print('系可用性 (47 拠点並列):', system_avail) # 限りなく 1 に近づく |
1 2 3 4 5 6 7 8 9 10 11 | # 9 の数による可用性表記
def nines(a):
d = -np.log10(1 - a)
return f'{a*100:.4f}% (Nines={d:.2f})'
for a in [0.99, 0.999, 0.9999, 0.99999]:
print(nines(a))
# 年間許容停止時間
year_hours = 365.25 * 24
for a in [0.99, 0.999, 0.9999, 0.99999]:
down = year_hours * (1-a)
print(f'{a*100:.4f}% -> 年間 {down*60:.1f} 分停止許容') |
この計算結果から「99.9% (Three Nines) でも年間 8 時間以上停止」、 「99.999% は年間 5 分」 ── という直感的な対応表が得られます。 経営判断時のリファレンスとして手元に置いておくと便利です。
47 都道府県の SSDSE-B-2026 統計データを配信する Web API を題材に、 可用性 SLA を実値で設計します。
| SLA 階層 | 可用性 | 年間許容ダウン | 月間許容ダウン | 想定構成 |
|---|---|---|---|---|
| 99% (two 9s) | 0.99 | 87.6 h | 7.20 h | 単一 VM + 日次バックアップ |
| 99.9% (three 9s) | 0.999 | 8.76 h | 43.2 min | 2-AZ + LB + 自動再起動 |
| 99.95% | 0.9995 | 4.38 h | 21.6 min | 3-AZ + RDS Multi-AZ + Auto Scaling |
| 99.99% (four 9s) | 0.9999 | 52.6 min | 4.32 min | マルチリージョン + Active-Active |
| 99.999% (five 9s) | 0.99999 | 5.26 min | 25.9 s | 通信キャリア・金融基幹級 |
🎯 このコードでやること:SSDSE-B-2026 の 47 県データを pandas で読み込み、 API として配信する場合の各 SLA 階層を計算する。 MTBF=720h (30日)、 MTTR=1h を仮定。
📥 入力データ (SSDSE-B-2026.csv の先頭 3 行抜粋):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import pandas as pd # SSDSE-B-2026 を読み込み (47 県分のレコード) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) n_pref = df['Prefecture'].nunique() # 564 行 = 47 県 × 12 年なので県数を数える print(f'対象データ: {n_pref} 県') # SLA 階層別 許容ダウン時間 year_min = 365.25 * 24 * 60 # 525960 分 sla_levels = { '99%': 0.99, '99.9%': 0.999, '99.95%': 0.9995, '99.99%': 0.9999, '99.999%': 0.99999, } for name, a in sla_levels.items(): down_min = year_min * (1 - a) down_h = down_min / 60 print(f'{name}: 年間 {down_h:6.2f} h = {down_min:7.1f} 分') # MTBF=720h, MTTR=X を逆算して 99.99% を満たす MTTR を求める import numpy as np target = 0.9999 MTBF = 720 MTTR_max = MTBF * (1 - target) / target print(f'\n99.99% 達成に必要な MTTR <= {MTTR_max*60:.2f} 分') |
📤 実行すると次の出力が得られる:
💬 結果の読み方:47 県の SSDSE-B-2026 を配信する API が「99.99% SLA」を約束するなら、 障害発生から復旧まで 4.32 分以内に戻さねばならない。 これは人手対応では困難 → 自動 fail-over が必須となる。
47 都道府県別ダッシュボード (47 個の独立 API) のうち「使える県数」をモデル化。 各県 API の可用性が独立に 99.9% のとき、 全 47 県同時稼働確率を求めます。
🎯 このコードでやること:47 県 API の同時稼働確率 (= 直列可用性) を計算し、 「全県見える」「46 県以上見える」「45 県以上見える」の各境界を比較。
📥 入力: 単体 API 可用性 = 0.999、 県数 = 47 (SSDSE-B-2026)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import pandas as pd from scipy.stats import binom # SSDSE-B-2026 県数 df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) n = df['Prefecture'].nunique() # 47(564 行 = 47 県 × 12 年) a_single = 0.999 # 全 47 県同時稼働確率 (= 直列構成) P_all_up = a_single ** n print(f'全 {n} 県同時稼働: {P_all_up:.4f} ({P_all_up*100:.2f}%)') # k 県以上稼働確率 (= 二項分布) for k_threshold in [n, n-1, n-2, n-5]: P_ge_k = sum(binom.pmf(j, n, a_single) for j in range(k_threshold, n+1)) print(f'{k_threshold} 県以上稼働: {P_ge_k:.6f} ({P_ge_k*100:.4f}%)') # 1 年 (525960 分) のうち期待 "全県稼働" 時間 year_min = 525960 print(f'\n年間 全 {n} 県同時稼働時間: {year_min * P_all_up:,.0f} 分') print(f'年間 1 県以上停止時間: {year_min * (1 - P_all_up):,.0f} 分 ({year_min * (1 - P_all_up)/60:.1f} h)') |
📤 実行結果:
💬 結果の読み方:各 API 99.9% でも、 47 県分の全 OK は 95.4% に低下。 これが「直列構成の罠」。 SLA を「全県 OK」で書くと達成困難 → 「45 県以上 OK」(= 99.998%) のように緩めるか、 各 API を 99.99% に引き上げる必要がある。
合成データで MTBF, MTTR から可用性 A = MTBF/(MTBF+MTTR) を計算する。
| 機器 | MTBF [hr] | MTTR [hr] | A |
|---|---|---|---|
| サーバ | 720 | 2 | 0.9972 |
| DB | 1200 | 4 | 0.9967 |
| NW | 500 | 1 | 0.9980 |
1 2 3 4 5 6 7 | import numpy as np mtbf = np.array([720, 1200, 500]) mttr = np.array([2, 4, 1]) A = mtbf / (mtbf + mttr) A_total = A.prod() print(f"各 A: {A.round(4)}") print(f"直列 A_total = {A_total:.4f} = {A_total*100:.2f}%") |
💬 手計算 (Step 2) 99.19% と Python 出力が完全一致。
最小実装の例。 SSDSE のような実データに対して、 まずはコピペで動かしてみるのが理解の早道です。
1 2 3 4 5 | mtbf = 720 # 時間 mttr = 1 # 時間 availability = mtbf / (mtbf + mttr) downtime_per_year = (1 - availability) * 365 * 24 print(f'A={availability:.5f}, 年間停止時間={downtime_per_year:.1f}h') |
🎯 このコードでやること:psutil で CPU/メモリ/ディスクの瞬時稼働率を監視し、 SSDSE-B-2026 を配信する Flask API が「健全」かを判定する。
📥 入力: ローカルマシンの動作中プロセス情報 (psutil が OS から自動収集)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import psutil import time from datetime import datetime def health_check(cpu_threshold=80, mem_threshold=85, disk_threshold=90): """Up/Down 判定: いずれかの閾値超過なら DOWN""" cpu = psutil.cpu_percent(interval=1) mem = psutil.virtual_memory().percent disk = psutil.disk_usage('/').percent ok = (cpu < cpu_threshold) and (mem < mem_threshold) and (disk < disk_threshold) return {'time': datetime.now(), 'cpu': cpu, 'mem': mem, 'disk': disk, 'up': ok} # 10 サンプル取得 (実運用では Prometheus などで連続収集) samples = [health_check() for _ in range(10)] up_count = sum(s['up'] for s in samples) print(f'稼働率: {up_count}/10 = {up_count*10}%') for s in samples[:3]: print(f" {s['time'].strftime('%H:%M:%S')} CPU={s['cpu']:.1f}% MEM={s['mem']:.1f}% UP={s['up']}") |
📤 実行例:
💬 結果の読み方:10 サンプル中 10 回稼働 = 観測可用性 100%。 これを 30 日連続収集 (= 2,592,000 サンプル) し、 UP 比率を取れば実測 SLA となる。
🎯 このコードでやること:1 台 99% 可用性のサーバーを N 台並列冗長化した場合の合成可用性を計算 (実コンペ題材)。
📥 入力: 単体可用性 0.99、 冗長数 N = 1..5。
1 2 3 4 5 6 7 8 9 10 11 12 | import numpy as np import pandas as pd a_single = 0.99 results = [] for n in range(1, 6): a_parallel = 1 - (1 - a_single) ** n down_min = 365.25 * 24 * 60 * (1 - a_parallel) results.append({'n': n, 'A': a_parallel, 'down_min/year': down_min}) dfr = pd.DataFrame(results) print(dfr.to_string(index=False)) |
📤 実行結果:
💬 結果の読み方:99% サーバーを 2 台並列にすると 99.99% (4 nines)、 3 台で 99.999% (5 nines)。 冗長化のリターンは指数的だが、 4 台目以降は実質的に「障害は他の要因」 (人為ミス・データセンター全停止) が支配的。
🎯 このコードでやること:過去 6 ヶ月の障害ログから MTBF, MTTR を計算し SLA 達成判定。
📥 入力データ (incident_log.csv 抜粋):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import pandas as pd from datetime import datetime # 障害ログを直書きで構築 (実運用では CSV/DB から読込) incidents = pd.DataFrame([ {'id': 'INC1', 'start': '2025-12-01 03:12', 'end': '2025-12-01 03:24'}, {'id': 'INC2', 'start': '2026-01-15 09:30', 'end': '2026-01-15 09:42'}, {'id': 'INC3', 'start': '2026-02-20 18:00', 'end': '2026-02-20 18:15'}, {'id': 'INC4', 'start': '2026-03-05 11:22', 'end': '2026-03-05 11:50'}, {'id': 'INC5', 'start': '2026-04-10 22:00', 'end': '2026-04-10 22:08'}, ]) incidents['start'] = pd.to_datetime(incidents['start']) incidents['end'] = pd.to_datetime(incidents['end']) incidents['repair_min'] = (incidents['end'] - incidents['start']).dt.total_seconds() / 60 # MTTR = 復旧時間平均 mttr = incidents['repair_min'].mean() # MTBF = 障害間平均 (簡易: 観測期間 ÷ 障害数) obs_period = (incidents['end'].max() - incidents['start'].min()).total_seconds() / 60 mtbf = obs_period / len(incidents) A = mtbf / (mtbf + mttr) print(f'MTTR = {mttr:.2f} 分') print(f'MTBF = {mtbf:.1f} 分 ({mtbf/60/24:.1f} 日)') print(f'実測可用性 A = {A:.6f} ({A*100:.4f}%)') target = 0.999 print(f'\\n99.9% SLA 達成: {"OK" if A >= target else "NG"}') |
📤 実行結果:
💬 結果の読み方:MTBF 27 日に対し MTTR 15 分なら可用性 99.96%。 99.9% SLA は余裕、 99.99% は MTTR を 4 分に短縮するか冗長化が必要。
🎯 このコードでやること:Active-Passive 構成で 1 台ダウンした際の fail-over 時間を計測し、 実測 SLA を試算する。
📥 入力: 障害シナリオ (突然 SIGTERM → standby が引き取るまでの時間)、 試行回数 N=100。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import numpy as np import pandas as pd # Chaos engineering の実測想定値 # - 検知時間 (detection): heartbeat 失敗まで 3〜10 秒 # - 切替時間 (failover): DNS 切替・LB 設定変更 5〜30 秒 # - ヘルスチェック完了 5〜15 秒 rng = np.random.default_rng(42) n_trials = 100 detect = rng.uniform(3, 10, n_trials) failover = rng.uniform(5, 30, n_trials) health = rng.uniform(5, 15, n_trials) total = detect + failover + health # 月次想定: 1 月に 1 回のフェイルオーバー、 30 日 = 43200 分 month_min = 30 * 24 * 60 expected_down_min = total.mean() / 60 A_estimated = 1 - expected_down_min / month_min print(f'平均総 fail-over 時間: {total.mean():.1f} 秒 ({total.mean()/60:.2f} 分)') print(f'p95 fail-over 時間: {np.percentile(total, 95):.1f} 秒') print(f'月 1 回想定の実測可用性: {A_estimated:.6f} ({A_estimated*100:.4f}%)') print(f'99.99% SLA 適合: {"OK" if A_estimated >= 0.9999 else "NG"}') |
📤 実行結果:
💬 結果の読み方:平均 33 秒 / p95 48 秒で fail-over 完了 → 月 1 回障害なら 99.998% 達成。 しかし障害頻度が月 5 回に増えると 99.99% を割り込むため、 「障害頻度 × MTTR」を 4.32 分/月以下に抑える運用ルールが必須。
🎯 このコードでやること:1 分間隔の外部監視で 60 日分の Up/Down サンプルを生成し、 月次可用性を算出。
📥 入力: ベース可用性 0.9995、 観測期間 60 日 (= 86,400 サンプル、 1 分間隔)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import numpy as np import pandas as pd rng = np.random.default_rng(7) # 60 日 = 86400 分 = 1 分間隔の synthetic 監視サンプル n_minutes = 60 * 24 * 60 # Up/Down を 2 状態マルコフ過程でモデル化 A_base = 0.9995 # 停止時間は通常 5-30 分続く (障害が引き伸ばす) samples = np.ones(n_minutes, dtype=int) i = 0 while i < n_minutes: if rng.random() > A_base: dur = int(rng.uniform(5, 30)) samples[i:i+dur] = 0 i += dur else: i += 1 # 月別 (30日刻み) 集計 months = np.repeat([1, 2], n_minutes // 2)[:n_minutes] df = pd.DataFrame({'month': months, 'up': samples}) agg = df.groupby('month')['up'].agg(['count', 'sum']) agg['availability'] = agg['sum'] / agg['count'] agg['down_min'] = agg['count'] - agg['sum'] print(agg) print(f'\\n2 ヶ月総合可用性: {samples.mean()*100:.4f}%') |
📤 実行結果:
💬 結果の読み方:1 月は 99.89% (3 nines 未達)、 2 月は 99.95%。 SLA 99.9% を約束していたなら 1 月分は SLA 違反 → クレジット発行対象。 月次レポートで状況を顧客に透明開示することが信頼の基本。
この用語を使うときに陥りがちな失敗パターン。 経験者ほどここに 1 度はハマっています。
| Nines 表記 | 年間停止 | 月間停止 | 主な用途 |
|---|---|---|---|
| 90% (One Nine) | 36.5 日 | 3 日 | 個人プロジェクト |
| 99% (Two Nines) | 3.65 日 | 7 時間 | 社内ツール |
| 99.9% (Three Nines) | 8.76 時間 | 43 分 | 一般 SaaS |
| 99.95% (Three and Half) | 4.38 時間 | 21 分 | B2B SaaS |
| 99.99% (Four Nines) | 52.6 分 | 4.3 分 | 金融 / 大規模 EC |
| 99.999% (Five Nines) | 5.26 分 | 26 秒 | 通信 / 銀行ATM |
| 99.9999% (Six Nines) | 31.5 秒 | 2.6 秒 | 緊急通信 / 軍事 |
セキュリティの 3 要素:機密性 (Confidentiality) = 必要な人だけが見れる、 完全性 (Integrity) = 改ざんされていない、 可用性 (Availability) = 使える時に使える。 暗号化を強くしすぎて鍵管理が失敗→復号できない、 という事故は機密性が可用性を奪う典型例。 トレードオフの感覚を持つことが重要。
| 方式 | 構成 | 可用性向上 | コスト |
|---|---|---|---|
| Active-Active | 全ノード稼働 | 高 (1-(1-A)^n) | 高 |
| Active-Standby | 主と待機 | 中 | 中 |
| N+1 | N 主 + 1 待機 | 中〜高 | 中 |
| シャーディング | 独立分散 | 部分故障許容 | 中 |
| マルチリージョン | 地理冗長 | 災害対応 | 高 |
Google SRE 流の Error Budget:「SLO=99.9% なら 0.1% は失敗してよい」と失敗予算を持ち、 予算範囲ではアグレッシブにデプロイ、 予算が尽きたら凍結。 これにより信頼性と速度のトレードオフを定量化できます。
SSDSE のような公開データは「ダウンロードできなくなる」リスクがあります。 IPFS、 Internet Archive、 GitHub LFS、 Zenodo DOI などで多重保存し、 「data provenance」を保証することが学術再現性の前提条件です。
この概念は単独で存在するものではなく、 周辺の用語と包含・対比・派生の関係で結ばれています。 中心に置いて、 矢印が伸びる先のページをリンクから辿ってみてください。
99% から 99.999% まで、 段階的に可用性を上げるアーキテクチャパターンを整理します。 SSDSE-B-2026 を配布するような教育用静的サイトでも、 CDN を併用すれば 99.99% は実現可能です。
| 目標 SLO | 推奨アーキテクチャ | 主要コスト要因 |
|---|---|---|
| 99% | Single VPS + cron バックアップ | OS パッチ・障害対応工数 |
| 99.9% | Single Cloud (RDS Multi-AZ) + 監視 | クラウド利用料 |
| 99.95% | Active-Standby + CDN | CDN + 自動切替 |
| 99.99% | Multi-AZ + Auto-scaling + 24時間運用 | 運用人員 |
| 99.999% | Multi-Region + Active-Active + Anycast | インフラ + 専門チーム |
| 99.9999% | グローバル冗長 + Custom HW | 巨額投資 (通信キャリア級) |
可用性は「動いているか」だけでなく、 「正しく動いているか」まで含めて測ります。 4 つの監視レイヤで多角的に診ます。
| レイヤ | 監視対象 | ツール例 | アラート閾値例 |
|---|---|---|---|
| L1 死活 | ping, TCP, HTTP 200 | Pingdom, UptimeRobot | 3 連続失敗 |
| L2 性能 | レスポンスタイム, throughput | Datadog, New Relic | p99 > 500ms |
| L3 ビジネス | ログイン成功率, 注文完了率 | Custom (Grafana) | < 95% |
| L4 セマンティック | データ鮮度, 計算結果妥当性 | Great Expectations | 異常検知 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # シンプルなヘルスチェッカー
import requests, time
def health_check(url):
start = time.time()
try:
r = requests.get(url, timeout=5)
latency_ms = (time.time() - start) * 1000
return {'status': r.status_code, 'latency_ms': latency_ms, 'ok': r.status_code == 200}
except Exception as e:
return {'status': 'error', 'error': str(e), 'ok': False}
# SSDSE 公開サーバの定期チェック (1 分間隔)
import schedule
def job():
res = health_check('https://www.nstac.go.jp/SSDSE/index.html')
if not res['ok']:
print(f'[ALERT] {res}') # Slack/PagerDuty に通知
schedule.every(1).minutes.do(job) |
us-east-1 の S3 ストレージサブシステムが 4 時間停止。 オペレータのタイプミスでサーバ群を意図せず削除。 影響範囲:Slack, Trello, Quora, Coursera など多数。 教訓:「destructive command の確認プロンプト」「単一リージョン依存の危険」。
バックボーンルータの設定変更で 27 分間グローバル障害。 影響:Discord, Shopify, Hulu。 教訓:「設定変更は段階展開」「カナリアリリース」。
CDN プラットフォーム障害で 1 時間、 Amazon, Reddit, BBC, NYT などが世界規模でダウン。 単一顧客の設定変更が全体に影響するソフトウェアバグ。 教訓:「マルチ CDN」「設定検証の自動化」。
BGP 設定変更で Facebook/Instagram/WhatsApp が 6 時間ダウン。 修復チームが自社ビルに入れない (ドアロック認証も Facebook 依存) という二次障害。 教訓:「out-of-band アクセス」「依存関係の循環排除」。
2021 年に 11 回のシステム障害、 ATM 内のキャッシュカードが取り出せない事態。 旧 3 行統合システム「MINORI」の複雑性が原因。 金融庁から行政処分。 教訓:「複雑性は可用性の最大の敵」「カットオーバー後の安定化フェーズ」。
日本は地震・台風・洪水のリスクが高く、 単一地域のデータセンター集約は危険。 47 都道府県のうち、 リスクプロファイルが異なる地域へのバックアップが推奨されます。
| DR 戦略 | RTO | RPO | コスト | 推奨業務 |
|---|---|---|---|---|
| Backup & Restore | 24-72h | 24h | 低 | 社内ツール |
| Pilot Light | 4-8h | 1h | 中 | B2B SaaS |
| Warm Standby | 1h以下 | < 1h | 中-高 | 金融周辺 |
| Multi-Site Active-Active | 0 | 0 | 高 | 取引・通信 |
日本の主要 IT インフラは東京周辺に集中していたが、 2011 年東日本大震災以降、 大阪・福岡・沖縄への分散が進みました。 SSDSE-B-2026 の 47 都道府県データを使えば、 リージョン間の地理的距離・人口・経済規模を可視化して、 自社の DR 戦略立案に活用できます。
Google SRE 由来の Error Budget 概念は、 「信頼性と速度のトレードオフを定量化」する経営ツールです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 月次 Error Budget の管理
month_minutes = 30 * 24 * 60 # 約 43,200 分
slo = 0.999 # 99.9%
budget_minutes = month_minutes * (1 - slo) # 43.2 分
print(f'月次 Error Budget: {budget_minutes:.1f} 分')
# 障害ごとに消費
incidents = [
{'date': '2026-05-03', 'duration_min': 12},
{'date': '2026-05-15', 'duration_min': 8},
{'date': '2026-05-22', 'duration_min': 18},
]
consumed = sum(i['duration_min'] for i in incidents)
remaining = budget_minutes - consumed
print(f'消費: {consumed} 分 / 残: {remaining:.1f} 分')
if remaining < 0:
print('予算超過 -> 新機能リリース凍結、 安定化注力')
else:
print('予算内 -> 攻めの開発を継続可能') |
Error Budget が尽きたら新機能凍結、 余裕があれば積極的にデプロイ ── これにより「保守的すぎる SRE」「冒険しすぎる開発」の両極端を防げます。
可用性は Availability = MTBF/(MTBF+MTTR) で定量化され、 SLA (99.9% = 月 43 分ダウンタイム) として契約に組み込まれる。情報セキュリティの CIA トライアド (Confidentiality, Integrity, Availability) の A に対応。
SSDSE-B-2026 のような分析データは静的ファイルなら可用性問題は限定的だが、 e-Stat API のような動的サービスでは可用性 SLA が分析パイプラインの設計を左右する。
可用性目標 (SLA) の設定は「業務影響」「冗長化コスト」「許容ダウンタイム」の 3 軸で判定する。
「過剰な SLA はコストを爆発させる」原則のもと、 SSDSE-B-2026 分析環境のような研究用途では 99% で十分、 公的統計を提供する e-Stat 側は 99.9%+ が期待される、 と用途で目標を分ける判断が現代運用の鍵。