論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
可用性
Availability
セキュリティ

🔖 キーワード索引

#稼働率#CIA#SLA#冗長化#DR#可用性

🔖 キーワード索引 (拡張)

CIA 三要素 MTBF MTTR SLA SLO Error Budget Five 9s SPOF Fail-over Multi-AZ RPO RTO Graceful Degradation Brownout Chaos Engineering DR Plan

💡 30秒で分かる結論

🍰 まずはやさしく

使いたいときに使える性質のことです。

サービスが止まらないようにするために使います。

スマホのアプリがいつでも開く状態のことです。

結論として大切なポイントを読みましょう。

可用性:必要なときに情報にアクセスできる性質

💡 30 秒で分かる結論 (再掲・拡張版)

📍 文脈ボックス

🍰 まずはやさしく

セキュリティを守るための3つの要素の一つです。

情報の扱い方を正しく決めるために使います。

部活の共有ファイルにいつでも触れることです。

この言葉がどんな場面で使われるか読みましょう。

この用語は セキュリティ カテゴリに属します。 関連する別称・略号:(なし)

論文・実務レポートで 可用性 が登場したら、 まず本ページの「30秒で分かる結論」と「直感で掴む」を読めば、 その文脈で何を言っているか把握できます。

📍 文脈ボックス: あなたが今見ているもの (再確認)

本ページの「可用性」は 情報セキュリティ CIA 三要素 のうち A (Availability) を指し、 「許可された人がいつでもデータ・サービスにアクセスできる性質」を意味します。

🛡 追補 — SLA・N nines・フォールトトレランスを SSDSE-B-2026 で考える

可用性 (Availability) は SLA (Service Level Agreement) の中核指標として「N nines」で表現されます。 SSDSE-B-2026 の 47 都道府県データを「行政サービスのアクセス可用性」に見立て、 N nines が実運用にどう効くかを定量化します。

N nines と年間許容ダウンタイム

SLA可用率年間許容停止月間許容停止用途例
2 nines99%3.65 日7.2 時間社内ツール
3 nines99.9%8.77 時間43.8 分業務 SaaS
4 nines99.99%52.6 分4.38 分EC / 決済
5 nines99.999%5.26 分26 秒通信基盤・金融

🐍 追加 Python — SSDSE-B-2026 を「ヘルスチェック ping」に見立て可用率を集計

🎯 このコードでやること:SSDSE-B-2026 の都道府県別人口を「過去 1 ヶ月の月次 ping 成功回数」に正規化し、 各都道府県サービスの可用率と SLA 階級を判定する。 これは fault tolerance の評価でも実際に使われる「成功回数 / 試行回数」型集計の写経例。

📥 入力例 (SSDSE-B-2026 抜粋を ping 試行数として解釈):

都道府県名 人口総数 → ping_試行 = 43200 (30 日 × 1440 分) 北海道 5183687 → ping_成功 = 43197 青森県 1221288 → ping_成功 = 43180 東京都 14047594 → ping_成功 = 43199 ...
 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))

📤 実行例:

都道府県 availability nines 北海道 0.999931 4 青森県 0.999977 4 岩手県 0.999977 4 宮城県 0.999954 4 秋田県 0.999977 4 山形県 0.999977 4 福島県 0.999954 4 全国平均可用率 = 0.999948

💬 結果の読み方 → 47 都道府県平均で 4 nines(99.99%)水準。 人口最大の東京は最も成功数を落とし 4 nines ぎりぎり、 鳥取・島根のような小規模県は 5 nines 寸前。 実運用でも「トラフィックの偏りに応じて nines が劣化する」現象を再現できる。

🌐 フォールトトレランス 3 戦略

💡 SLA で「N nines」を約束するなら、 上記 3 戦略を組み合わせて「単一障害点が存在しない」状態に持ち込むのが鉄則。 SSDSE-B-2026 のように 47 並列のセルが存在する構造は、 そもそも分散システムの教材として極めて優れている。

🖼 補講: 可用性をビジュアルで深掘り

可用性 (Availability) は 稼働時間 / (稼働時間 + 停止時間) という単純な比率で書けるが、 実際の設計現場では「N nines を守るために何の数値を、 どう動かすか」が問われる。 ここでは 3 枚の図と 2 本の Python コードで MTBF/MTTR/N+1 冗長化の効きを可視化する。

📊 図1: N nines と許容停止時間の対応

N nines と年間許容停止時間 (対数軸) 10h 1h 5m 30s 99% 99.9% 99.99% 99.999% 99.9999% 3.65日 8.76h 52.6m 5.26m 31.5s

→ 1 nine 増えるごとに許容停止時間が約 1/10 になる。 4 nines (52 分/年) と 5 nines (5 分/年) の差は 10 倍だが、 必要な冗長化コストは指数関数的に増える。

📊 図2: MTBF/MTTR と availability の関係

時系列: 稼働 (緑) と 故障 (赤) の繰り返し MTBF MTTR MTBF MTBF MTTR Availability = MTBF / (MTBF + MTTR) MTTR を 1/2 に縮められれば、 同じ MTBF でも nines が 1 段上がる

→ MTBF (Mean Time Between Failures) を増やす (故障しにくくする) より、 MTTR (Mean Time To Repair) を短縮する (復旧を早くする) ほうが、 多くの場合コスト効率が良い。 自動フェイルオーバが効くのはここ。

📊 図3: N+1 冗長化による Availability の改善

単一構成 vs N+1 冗長 (各機器 A=0.99) 単一: 1 - (1-A) = 0.99 2 nines 2 並列 (1+1): 1 - (1-A)² = 0.9999 4 nines 3 並列 (2+1): 1 - (1-A)³ ≈ 6 nines → 1 台追加で nines が約 2 段上がる ただし切替時間 (MTTR') が新たな律速 分離された電源・ネットワークが前提

→ N+1 冗長化は「故障の独立性」が成り立つときに最大効果を発揮する。 同一電源・同一スイッチ配下の冗長は相関故障で台無しになる。 物理的・地理的分離が前提。

🔬 数式を言葉で読み解く

並列冗長系の Availability は次の式で計算する:

$$A_\text{parallel} = 1 - \prod_{i=1}^{n} (1 - A_i)$$

直列構成 (全機器が稼働しないと全体が稼働しない) では掛け算になり、 nines は確実に減る:

$$A_\text{series} = \prod_{i=1}^{n} A_i$$

直列 3 段で各 4 nines (0.9999) のシステムは、 全体で 3.99... nines ≈ 0.9997 にしかならない。 「nines はチェーンの中で一番弱いリンクで決まる」。

🐍 Python: N nines と年間許容停止時間の対応表

このコードでやること: N nines (99%, 99.9%, ..., 99.9999%) ごとの年間許容停止時間 (秒・分・時間・日) を一覧で計算する。

📥 入力データ (Python リストとして定義):

nines_list = [0.99, 0.999, 0.9999, 0.99999, 0.999999] year_seconds = 365 * 24 * 60 * 60 # = 31,536,000 秒
 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}")

📤 実行すると次の出力が得られる:

A 年間停止 (s) 分 時間 日
0.990000 315,360 5256.0 87.60 3.650
0.999000 31,536 525.6 8.76 0.365
0.999900 3,154 52.6 0.88 0.037
0.999990 315 5.3 0.09 0.004
0.999999 32 0.5 0.01 0.000

💬 結果の読み方 → 4 nines (99.99%) で年間 52.6 分。 これは「メンテ窓 1 回 (30 分) で半分を使い切る」レベル。 5 nines (99.999%) になると 5.3 分 / 年で、 OS パッチ適用すらできない。 SLA で 4 nines を超える数字を提示するときは、 ローリング更新・カナリアデプロイの仕組みがなければ守れない。

🐍 Python: N+1 冗長化による Availability シミュレーション

このコードでやること: 単一機器の Availability (3 nines) を起点に、 1 台 / 2 台 / 3 台 / 4 台 の並列冗長構成それぞれで「全体 Availability」と「年間停止時間」がどう変わるかを計算する。

📥 入力データ (単機 Availability と冗長段数):

A_single = 0.999 # 単機 3 nines n_redundancy = [1, 2, 3, 4] # 並列台数
 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}")

📤 実行すると次の出力が得られる:

n A_parallel nines 年間停止 (分)
1 0.999000000 3.00 525.60
2 0.999999000 6.00 0.53
3 0.999999999 9.00 0.00
4 1.000000000 12.00 0.00

💬 結果の読み方 → 単機 3 nines を 2 台並列にするだけで全体は 6 nines (年 32 秒) になる。 ただしこれは「故障が完全に独立」の理想値。 現実には共通電源・共通スイッチ・共通バグ (ソフトウェア相関故障) があるため、 6 nines 計算値の構成でも実測は 4-5 nines に留まることが多い。 だからこそ AZ (Availability Zone) を跨いだ配置や Chaos Engineering での検証が要求される。

⚠️ 可用性指標を扱う上での 5 つの落とし穴

📝 理解度チェック (補講)

  1. 単機 Availability 99.9% のサーバを 2 台並列にすると、 全体 Availability は何 % になるか? (回答: 99.9999%)
  2. MTBF=10000 時間、 MTTR=2 時間のとき、 Availability は? (回答: 10000/10002 ≈ 0.9998 = 3.7 nines)
  3. SLA 99.95% を約束した場合、 年間許容停止時間は何時間? (回答: (1-0.9995) × 8760 ≈ 4.38 時間)
  4. 共通電源で冗長化された 2 台は、 独立仮定の何倍の停止リスクを持つか? (回答: 共通電源障害確率が支配的で、 1 台と同等になる場合がある)
  5. 4 nines の SLO を維持するために MTTR を半分にした場合、 何 nines に届きうるか? (回答: MTBF/MTTR 比が 2 倍なので、 ほぼ 4.3 nines までは見込める)

💡 補講のまとめ: 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 API の SLA 文書テンプレ

SSDSE-B-2026 (47 県統計) を社外配信する API の SLA 文書を実例として示します。

条項内容
対象サービスSSDSE-B-2026 全 47 県データ API (GET /api/v1/prefecture/{code})
可用性 SLO月次 99.9% (43.2 分以内の月次停止を許容)
レイテンシ SLOp95 200ms 以内 (東京リージョン)
計画停止月最大 60 分 (土曜 03:00-04:00 のみ、 14 日前予告)
違反時 SLA クレジット99.0-99.9% → 10% 返金、 95.0-99.0% → 25% 返金
適用除外DDoS、 顧客側ネットワーク障害、 不可抗力
測定方法外部 Synthetic Monitor 1 分間隔、 月次レポート公開

🎨 可用性向上 5 つの王道パターン (アーキテクチャ例)

パターン想定到達 SLO代表構成
単一サーバー + 日次バックアップ99%VPS 1 台、 cron で snapshot
2-AZ Active-Passive + LB99.9%EC2 × 2 (異 AZ)、 ALB、 RDS Multi-AZ
3-AZ Auto Scaling + Multi-AZ DB99.95%EC2 ASG (min=3)、 RDS Aurora
マルチリージョン Active-Active99.99%Route53 latency-based + Aurora Global
マルチクラウド + DNS Failover99.999%AWS + GCP + 専用 DNS GSLB

「99.999% のために 2 クラウド契約するか?」は経営判断。 ほとんどの SaaS は 99.9 〜 99.95% が経済合理ライン。

📐 定義・数式

🍰 まずはやさしく

稼働率(動いている時間の割合)のことです。

正確な数字で安定性を測るために使います。

故障してから直すまでの時間を計算します。

計算するための数式について読みましょう。

【稼働率の定義】
$$ A = \frac{\text{MTBF}}{\text{MTBF} + \text{MTTR}} $$

MTBF (平均故障間隔, Mean Time Between Failures) と MTTR (平均復旧時間, Mean Time To Repair) で稼働率 $A$ を表す。 99.9% を維持するには「壊れにくさ」と「直すスピード」の両立が必要。

📐 数式を言葉で読み解く: 可用性の全方程式

可用性 (Availability) を表す中心式は次の 4 つです。 用語コンペ・SLA 設計・SRE 実務でこの 4 つを区別できるかどうかが鍵になります。

① 定常可用性 (Steady-State Availability)

$$A_{\\mathrm{steady}} = \\frac{\\mathrm{MTBF}}{\\mathrm{MTBF} + \\mathrm{MTTR}}$$

🔬 数式を言葉で読み解く:分子の MTBF (Mean Time Between Failures) は「障害から障害までの平均稼働時間」、 分母には MTBF に MTTR (Mean Time To Repair)「平均復旧時間」を加える。 つまり「稼働時間 ÷ (稼働時間+停止時間)」を時間平均した値。

② 瞬時可用性 (Instantaneous Availability)

$$A(t) = \\Pr[\\text{system up at time } t]$$

🔬 数式を言葉で読み解く:時刻 t でシステムが稼働している確率。 起動直後は 1 から始まり、 やがて定常値 \\(A_{\\mathrm{steady}}\\) に近づく。

③ 直列構成の可用性

$$A_{\\mathrm{series}} = \\prod_{i=1}^{n} A_i$$

🔬 数式を言葉で読み解く:直列接続では「全コンポーネントが同時に稼働」が条件。 99.9% を 5 段直列すると \\(0.999^5 \\approx 0.995\\) に低下する。

④ 並列冗長構成の可用性

$$A_{\\mathrm{parallel}} = 1 - \\prod_{i=1}^{n} (1 - A_i)$$

🔬 数式を言葉で読み解く:並列冗長は「全コンポーネントが同時に停止」しないと止まらない。 99.9% を 2 重化すると \\(1 - 0.001^2 = 0.999999\\) (six 9s) に跳ね上がる。

📐 可用性の高度トピック: 部分稼働 (Graceful Degradation) と Brownout

「Up か Down か」の 2 値だけでは現代システムは表現しきれません。 機能の一部のみ停止する Graceful Degradation と、 容量を絞って稼働させる Brownout が現代的可用性の概念。

パターン説明SLA 上の扱い
Full Up全機能稼働100% カウント
Graceful Degradation読込はできるが書込不可、 ML 推論はできるが学習停止機能別重み付け SLA
BrownoutQPS 制限・キャッシュ強制・低解像度返却レイテンシ SLO で計上
Partial Outage機能 A は停止、 機能 B は稼働機能別 SLA で部分カウント
Full Down全機能停止0% カウント

🔬 数式を言葉で読み解く: 機能別重み付き可用性

$$A_{\\mathrm{weighted}} = \\sum_{i=1}^{k} w_i \\cdot A_i, \\quad \\sum_{i=1}^{k} w_i = 1$$

機能 \\(i\\) (例: 検索・購入・推薦) の重要度を \\(w_i\\)、 各機能の可用性を \\(A_i\\) とし、 加重平均で全体可用性を定義。 「全機能 = 等価」ではなく、 「収益直結機能 = 重み大」と扱う現代的アプローチ。

🎯 このコードでやること:SSDSE-B-2026 配信 API の機能 (一覧/詳細/集計/比較) ごとに重み付き可用性を計算。

📥 入力データ (機能別 SLO):

機能名 重み w 実測可用性 A list 0.40 0.9995 detail 0.30 0.9990 aggregate 0.20 0.9970 compare 0.10 0.9950
 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')

📤 実行結果:

name weight availability 0 list 0.40 0.9995 1 detail 0.30 0.9990 2 aggregate 0.20 0.9970 3 compare 0.10 0.9950 重み付き可用性: 0.998400 (99.8400%) 最弱機能可用性: 0.995000 (99.5000%) 差分 (SLA 緩和効果): 0.3400 %pt

💬 結果の読み方:最弱機能 (compare) は 99.5% だが、 重要度が低い (重み 0.10) ので全体 SLA は 99.84%。 「最弱機能 = 全体 SLA」と扱うと過剰投資になる。 機能別重み付けで現実的な SLA を約束できる。

🔬 数式を言葉で読み解く

数式に出てくる記号の意味を 1 つずつ確認しましょう。

MTBF
故障と故障の間隔。 長いほど壊れにくい。
MTTR
故障から復旧までの平均時間。 短いほど復旧が速い。
$A$
稼働率 (Availability)。 通常 99.9% 〜 99.999% で議論。
SLA
Service Level Agreement。 稼働率の契約上の保証。

🔬 数式を言葉で読み解く(500字+ narration)

可用性 (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 スナップショットを保持することで「データ可用性」を高められます。 結局、 可用性は単なる稼働率の話ではなく、 「冗長化 × 監視 × 自動復旧 × 災害対策」の総合芸術です。

📖 4 要素 narration — 可用性を 4 つの視点で再読する

① 直感の narration

ATM が「停止中」と表示された経験はありますか? 緊急時に病院の電子カルテが繋がらないと命に関わります。 可用性は「必要な時に動く」という当たり前を支える概念。 機密性・完全性が満たされていても、 使えなければサービスは存在しないも同然です。

② 数式の narration

$A = \dfrac{\text{MTBF}}{\text{MTBF}+\text{MTTR}}$ は「全時間の中で稼働していた割合」を表します。 MTBF を伸ばす方向 (信頼性向上)、 MTTR を縮める方向 (復旧自動化) の 2 軸で改善できます。 99.99% を目指すなら MTBF/MTTR の比を 10,000 以上にする必要があります。

③ 計算の narration(SSDSE データ可用性)

SSDSE-B-2026 の CSV は統計センターから公開されています。 仮にこのサーバーが MTBF=720h, MTTR=2h なら $A = 720/722 \approx 0.9972$、 つまり年間で約 24 時間程度のダウンが見込まれる計算。 これを補うため、 ローカルキャッシュ・ミラーリング・バックアップを併用するのが教育用ハンズオン教材としての可用性確保策です。

④ Python の narration

監視には requests.get(url, timeout=5) でレスポンス時間を計測、 schedule ライブラリで定期実行。 Prometheus / Grafana への送信は prometheus_client ライブラリ。 SLA 違反検知は単純な閾値ベースで十分機能します。

🔬 数式を言葉で読み解く: Error Budget の計算根拠

$$\\mathrm{ErrorBudget}_{\\mathrm{month}} = T_{\\mathrm{month}} \\times (1 - \\mathrm{SLO})$$

記号一覧:

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 必須

🔬 数式を言葉で読み解く(追補: 可用性係数の SSDSE-B-2026 47 県スコア化)

本節では「可用性 $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 県 × 数値カラム):

SSDSE-2026 都道府県 A1101 A110101 A110102 ... R01000 北海道 5183 2465 2718 ... R02000 青森県 1238 586 652 ... R03000 岩手県 1196 568 628 ... ... ... ... ... ... R47000 沖縄県 1467 742 725 ... (欠測あり: 一部県の最新年で NaN を観測)
 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 東京都 1.0000 神奈川県 1.0000 大阪府 1.0000 愛知県 1.0000 北海道 0.9985 ... 鳥取県 0.9847 高知県 0.9821 全国平均 A = 0.9923 → ほぼすべての県が 99%+ の可用性を達成しているが、 中央値の小さい県ほど欠測が出やすい構造的傾向が見える。

💬 結果の読み方: 全国平均 $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 ≈ MTBFMTTF=平均故障時間 (故障までの稼働時間)MTBF を直接測れない場合、 MTTF + MTTR の合計で近似する

📥 入力データ (SSDSE-B-2026 抜粋・架空 API 稼働ログ)

SSDSE-B-2026 の都道府県人口を「各県の都道府県統計 API の月間稼働ログ」と読み替えて、 可用性計算の入力として使用する。 人口が多い県ほどアクセスが多く、 障害も多発するという仮定を置いた。

都道府県 人口(千人) 月間稼働分 ダウン分 MTBF(分) MTTR(分) 北海道 5183 43200 29 1490 1.5 東京都 14048 43200 125 342 3.2 神奈川県 9237 43200 72 595 2.8 大阪府 8838 43200 68 630 2.5 愛知県 7546 43200 55 780 2.0 鳥取県 549 43200 4 10800 0.8 島根県 665 43200 5 8640 0.9

このコードでやること: 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} 分")

📤 実行すると次の出力が得られる:

pref A nines 0 北海道 0.99899 2.99565 1 東京都 0.99072 2.03340 2 神奈川県 0.99531 2.32894 3 大阪府 0.99605 2.40337 4 愛知県 0.99744 2.59193 5 鳥取県 0.99993 4.13035 6 島根県 0.99990 3.98239 7 県直列 A = 0.978547 → 年間ダウン 11280.0 分 7 県並列 A = 0.9999999992 → 年間ダウン 0.0004 分

💬 結果の読み方: 東京 (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 分) まで上がる。 これが「直列は最弱の鎖が支配し、 並列は最強の鎖を活かす」という原則の実数値検証である。

SLO/SLA 交渉での数式の使い方

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 短縮の方が費用対効果が高い」という運用設計の鉄則が導かれる。

並列冗長の独立性破綻と Brown-out

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 時間のシステムの稼働率を計算する。

STEP 1 MTBF, MTTR を取得
ログから故障間隔と復旧時間を平均化。
STEP 2 稼働率計算
$A = 720/(720+1) = 0.99861$
STEP 3 SLA との比較
「スリーナイン (99.9%)」を満たしているか確認。
STEP 4 改善
MTBF 増・MTTR 減のいずれかで稼働率向上。

🧮 SSDSE-B-2026 を題材に可用性指標を計算

仮想シナリオ:SSDSE-B-2026 を 47 都道府県の医療システム可用性データとして再解釈し、 全国 47 拠点を並列構成と仮定して系全体の可用性を求めます。

📥 入力例(SSDSE-B-2026 全体:564 行 × 112 列 = 47 都道府県 × 2012〜2023 年) 年度 地域コード 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) … 2023 R01000 北海道 5,092,000 1,681,000 24,430 … 2023 R13000 東京都 14,086,000 3,205,000 86,348 … 2023 R47000 沖縄県 1,468,000 350,000 12,549 … …(残り 112 列は住宅・家計・教育・医療など)
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 に近づく
📤 実行例(実測) 全国平均可用性: 0.9972299168975071 最低可用性: 0.997229916897507 系可用性 (47 拠点並列): 1.0
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.0000% (Nines=2.00) 99.9000% (Nines=3.00) 99.9900% (Nines=4.00) 99.9990% (Nines=5.00) 99.0000% -> 年間 5259.6 分停止許容 99.9000% -> 年間 526.0 分停止許容 99.9900% -> 年間 52.6 分停止許容 99.9990% -> 年間 5.3 分停止許容

この計算結果から「99.9% (Three Nines) でも年間 8 時間以上停止」、 「99.999% は年間 5 分」 ── という直感的な対応表が得られます。 経営判断時のリファレンスとして手元に置いておくと便利です。

🧮 SSDSE-B-2026 を扱うシステムの可用性 SLA 設計 (実値計算)

47 都道府県の SSDSE-B-2026 統計データを配信する Web API を題材に、 可用性 SLA を実値で設計します。

SLA 階層可用性年間許容ダウン月間許容ダウン想定構成
99% (two 9s)0.9987.6 h7.20 h単一 VM + 日次バックアップ
99.9% (three 9s)0.9998.76 h43.2 min2-AZ + LB + 自動再起動
99.95%0.99954.38 h21.6 min3-AZ + RDS Multi-AZ + Auto Scaling
99.99% (four 9s)0.999952.6 min4.32 minマルチリージョン + Active-Active
99.999% (five 9s)0.999995.26 min25.9 s通信キャリア・金融基幹級

🎯 このコードでやること:SSDSE-B-2026 の 47 県データを pandas で読み込み、 API として配信する場合の各 SLA 階層を計算する。 MTBF=720h (30日)、 MTTR=1h を仮定。

📥 入力データ (SSDSE-B-2026.csv の先頭 3 行抜粋):

年度 地域コード 都道府県 総人口 2023 R01000 北海道 5,092,000 2023 R02000 青森県 1,184,000 2023 R03000 岩手県 1,163,000 ... (全 47 行)
 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 県 99%: 年間 87.66 h = 5259.6 分 99.9%: 年間 8.77 h = 526.0 分 99.95%: 年間 4.38 h = 263.0 分 99.99%: 年間 0.88 h = 52.6 分 99.999%: 年間 0.09 h = 5.3 分 99.99% 達成に必要な MTTR <= 4.32 分

💬 結果の読み方:47 県の SSDSE-B-2026 を配信する API が「99.99% SLA」を約束するなら、 障害発生から復旧まで 4.32 分以内に戻さねばならない。 これは人手対応では困難 → 自動 fail-over が必須となる。

🧮 SSDSE-B-2026 で「県別ダッシュボード」可用性をモデル化

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)')

📤 実行結果:

全 47 県同時稼働: 0.9541 (95.41%) 47 県以上稼働: 0.954065 (95.4065%) 46 県以上稼働: 0.998951 (99.8951%) 45 県以上稼働: 0.999984 (99.9984%) 42 県以上稼働: 1.000000 (100.0000%) 年間 全 47 県同時稼働時間: 501,800 分 年間 1 県以上停止時間: 24,160 分 (402.7 h)

💬 結果の読み方:各 API 99.9% でも、 47 県分の全 OK は 95.4% に低下。 これが「直列構成の罠」。 SLA を「全県 OK」で書くと達成困難 → 「45 県以上 OK」(= 99.998%) のように緩めるか、 各 API を 99.99% に引き上げる必要がある。

🧮 数式に値を入れて手で計算する: MTBF と MTTR から可用性

合成データで MTBF, MTTR から可用性 A = MTBF/(MTBF+MTTR) を計算する。

Step 1: コンポーネント別

機器MTBF [hr]MTTR [hr]A
サーバ72020.9972
DB120040.9967
NW50010.9980

Step 2: 直列構成全体の A

A_total = 0.9972 × 0.9967 × 0.9980 ≈ 0.9919 = 99.19%

🐍 Python で再現

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}%")

📤 実行結果

各 A: [0.9972 0.9967 0.998 ] 直列 A_total = 0.9919 = 99.19%

💬 手計算 (Step 2) 99.19% と Python 出力が完全一致。

🐍 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')
📤 実行例(実測) A=0.99861, 年間停止時間=12.1h

🐍 psutil + watchdog で実装する可用性監視 (実装フル)

🎯 このコードでやること: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% (時刻) CPU=(実測値)% MEM=(実測値)% UP=True (1 秒おきに 10 回サンプリングした行が並ぶ) ※ 時刻・CPU 使用率・メモリ使用率は実行環境と実行時刻でまったく変わる。 確認すべきは「10 回中 10 回 UP=True → 稼働率 100%」という数え方のほう。

💬 結果の読み方: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))

📤 実行結果:

n A down_min/year 1 0.99000 5259.60 2 0.99990 52.60 3 0.99999 0.53 4 1.00000 0.01 5 1.00000 0.00

💬 結果の読み方:99% サーバーを 2 台並列にすると 99.99% (4 nines)、 3 台で 99.999% (5 nines)。 冗長化のリターンは指数的だが、 4 台目以降は実質的に「障害は他の要因」 (人為ミス・データセンター全停止) が支配的。

障害ログから MTBF / MTTR を実測

🎯 このコードでやること:過去 6 ヶ月の障害ログから MTBF, MTTR を計算し SLA 達成判定。

📥 入力データ (incident_log.csv 抜粋):

incident_id, start_time, end_time INC1, 2025-12-01 03:12, 2025-12-01 03:24 INC2, 2026-01-15 09:30, 2026-01-15 09:42 INC3, 2026-02-20 18:00, 2026-02-20 18:15 INC4, 2026-03-05 11:22, 2026-03-05 11:50 INC5, 2026-04-10 22:00, 2026-04-10 22:08
 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"}')

📤 実行結果:

MTTR = 15.00 分 MTBF = 39376.8 分 (27.3 日) 実測可用性 A = 0.999619 (99.9619%) 99.9% SLA 達成: OK

💬 結果の読み方:MTBF 27 日に対し MTTR 15 分なら可用性 99.96%。 99.9% SLA は余裕、 99.99% は MTTR を 4 分に短縮するか冗長化が必要。

🐍 fail-over シミュレーションと chaos engineering (本番想定)

🎯 このコードでやること: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"}')

📤 実行結果:

平均総 fail-over 時間: 33.7 秒 (0.56 分) p95 fail-over 時間: 45.9 秒 月 1 回想定の実測可用性: 0.999987 (99.9987%) 99.99% SLA 適合: OK

💬 結果の読み方:平均 33 秒 / p95 48 秒で fail-over 完了 → 月 1 回障害なら 99.998% 達成。 しかし障害頻度が月 5 回に増えると 99.99% を割り込むため、 「障害頻度 × MTTR」を 4.32 分/月以下に抑える運用ルールが必須。

🐍 watchdog による外部監視シミュレーション

🎯 このコードでやること: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}%')

📤 実行結果:

count sum availability down_min month 1 43200 43151 0.998866 49 2 43200 43178 0.999491 22 2 ヶ月総合可用性: 99.9178%

💬 結果の読み方:1 月は 99.89% (3 nines 未達)、 2 月は 99.95%。 SLA 99.9% を約束していたなら 1 月分は SLA 違反 → クレジット発行対象。 月次レポートで状況を顧客に透明開示することが信頼の基本。

⚠️ よくある落とし穴

この用語を使うときに陥りがちな失敗パターン。 経験者ほどここに 1 度はハマっています。

❌ 可用性と機密性のトレードオフ
厳格なログイン制御は機密性を上げるが、 認証障害時に可用性が落ちる。
❌ 冗長化したつもりが SPOF
電源・ネットワーク・DB のどこかに単一障害点 (SPOF) が残りやすい。
❌ DR テスト不足
災害復旧手順は定期演習しないと本番で動かない。
❌ 人為ミス起因の停止
DDoS より「設定変更ミス」が多い。 変更管理を厳格に。

⚠️ 可用性設計の 10 大落とし穴

  1. 計画停止を可用性に含めない: 多くの SLA は「計画停止」を除外。 ユーザー視点では「停止」に変わりないのでクレーム要因に。
  2. シングルポイントオブフェイラ: DNS、 認証、 ロードバランサ ── 冗長化したつもりが共通要素で巻き込み停止。
  3. 9 をひとつ増やすコスト過小評価: 99.9 → 99.99% は単純に「2 倍」ではなく、 冗長度・監視・運用人員すべてに指数的なコスト増。
  4. 復旧テスト未実施: バックアップは取っているが「戻せるか」を 1 年以上テストしていない。 災害時に初めて失敗が発覚。
  5. 監視盲点: 死活監視は OK だが、 「データの鮮度」「API レスポンスの正確性」を見ていないと「動いているが嘘の値」が出る。
  6. マルチリージョンの距離過小: 同一クラウドの近接リージョンは同時停止リスクあり。 地理的に十分離す。
  7. カオスエンジニアリング未導入: 実環境で意図的に障害を起こさないと、 想定外の連鎖障害は発見できない。
  8. SLA と SLO の混同: SLA は顧客との契約、 SLO は社内目標。 SLO を SLA より緩く設定すると常時違反する。
  9. 監視アラート疲労: 過剰アラートでオペレータが見なくなる ── 重要警報を見落とす。
  10. セキュリティ対策との衝突: セキュリティ強化 (パッチ・再起動) は可用性を一時的に下げる。 メンテ窓設計が要。

🎓 拡張 deep-dive:可用性を巡る 5 テーマ

テーマ 1:可用性の 9 表記対応表

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 秒緊急通信 / 軍事

テーマ 2:CIA トライアドと可用性

セキュリティの 3 要素:機密性 (Confidentiality) = 必要な人だけが見れる、 完全性 (Integrity) = 改ざんされていない、 可用性 (Availability) = 使える時に使える。 暗号化を強くしすぎて鍵管理が失敗→復号できない、 という事故は機密性が可用性を奪う典型例。 トレードオフの感覚を持つことが重要。

テーマ 3:冗長化方式の比較

方式構成可用性向上コスト
Active-Active全ノード稼働高 (1-(1-A)^n)
Active-Standby主と待機
N+1N 主 + 1 待機中〜高
シャーディング独立分散部分故障許容
マルチリージョン地理冗長災害対応

テーマ 4:SRE と Error Budget

Google SRE 流の Error Budget:「SLO=99.9% なら 0.1% は失敗してよい」と失敗予算を持ち、 予算範囲ではアグレッシブにデプロイ、 予算が尽きたら凍結。 これにより信頼性と速度のトレードオフを定量化できます。

テーマ 5:データ可用性とサプライチェーン

SSDSE のような公開データは「ダウンロードできなくなる」リスクがあります。 IPFS、 Internet Archive、 GitHub LFS、 Zenodo DOI などで多重保存し、 「data provenance」を保証することが学術再現性の前提条件です。

❓ 深掘り FAQ — 可用性

Q. 99.999% (Five Nines) は本当に実現可能?
大手電話通信ネットワーク・主要 IXP・銀行勘定系で実現実績あり。 ただし投資額は 99% の 10 倍以上、 24 時間運用チームが必須。
Q. クラウド SLA は信用できる?
AWS EC2 SLA は 99.99% (リージョン)。 ただし障害時の補償は「料金返金のみ」が多く、 機会損失は補償されない。 自社で別レイヤの可用性設計を持つべき。
Q. データセンターの Tier とは?
Uptime Institute の認証:Tier I (99.671%) ~ Tier IV (99.995%)。 電源・冷却・通信の冗長度で決まる。
Q. DDoS 対策は可用性の話?
はい。 攻撃でサービス停止 → 可用性低下。 Cloudflare、 AWS Shield、 Akamai 等の CDN/WAF が標準的対策。
Q. RPO と RTO の違いは?
RPO (Recovery Point Objective) = どこまでデータ消失を許すか、 RTO (Recovery Time Objective) = どれだけ早く戻すか。 RPO=0 は同期レプリ、 RTO=0 は無停止切替を意味します。

⚠️ 可用性設計で踏む 5 つの落とし穴

  1. DR Plan の欠如:日次バックアップしか取らず、 RPO/RTO を定義していない。 結果、 災害時に「どこまで戻せるか・何時間で復旧するか」を約束できない。 対策:BCP/DR 訓練を四半期 1 回、 リハーサル結果を SLA 文書に明記。
  2. SPOF (Single Point of Failure) の見落とし:DB は冗長化したが、 ロードバランサーが 1 台、 DNS が単一ベンダー、 認証 SaaS が単一接続。 対策:依存図 (dependency graph) を作り、 単一障害点を全て洗い出す。
  3. コスト vs SLO のバランス無視:「99.999% を目指す」と宣言したが予算は 99% 相当。 結果、 達成不可能な約束で顧客信頼を失う。 対策:1 nine 上げるごとのコスト試算 (3-10x) を経営会議で共有。
  4. 可用性測定の主体ミス:自社監視では「内部視点」しか見えない。 顧客側のネットワーク・DNS は把握不能。 対策:外部監視 (Pingdom, Datadog Synthetic) を必ず併用。
  5. Maintenance Window を可用性外と扱う:「計画停止は SLA に含めない」と契約に書いたが、 顧客にとっては停止は停止。 対策:計画停止と非計画停止を区別し、 計画停止も「予告期間 + 月間総停止時間」で透明化。

⚠️ さらなる落とし穴 (続編 + チェックリスト)

  1. SLO と SLI の取り違え:SLO は「目標値」、 SLI は「実測指標」。 SLI を定義せずに SLO だけ決めると、 何を測っても根拠なしの数字遊びになる。 対策:SLI 候補 (リクエスト成功率・レイテンシ p99・スループット) を業務要件と紐付けて定義する。
  2. クラウド SLA を自社 SLA だと誤解:AWS EC2 SLA は 99.99% だが、 自社アプリの SLA は 0.9999 × 0.999 (アプリ層) ≒ 99.89% に下がる。 対策:依存サービス全部の SLA を積で計算する。
  3. 監視死角 (Blind Spot):監視サーバー自体がダウンしたら、 何も検知できない。 対策:監視 of 監視 (dead-man-switch)、 外部 SaaS による監視。
  4. 復旧後の検証不足:「復旧した」と宣言しつつ、 実際は機能 X が壊れたまま。 対策:復旧時の Smoke Test スイート (5 機能以上) を自動実行。
  5. 事後分析 (Postmortem) の形骸化:障害があったのに学習しない。 対策:Blameless Postmortem を全障害で実施し、 改善 Action を 30 日以内にクローズ。

✅ 可用性設計チェックリスト (実務 12 項目)

🗺 概念マップ — 可用性を中心に

この概念は単独で存在するものではなく、 周辺の用語と包含・対比・派生の関係で結ばれています。 中心に置いて、 矢印が伸びる先のページをリンクから辿ってみてください。

🏗 アーキテクチャパターン:高可用性設計の定石

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 + CDNCDN + 自動切替
99.99%Multi-AZ + Auto-scaling + 24時間運用運用人員
99.999%Multi-Region + Active-Active + Anycastインフラ + 専門チーム
99.9999%グローバル冗長 + Custom HW巨額投資 (通信キャリア級)

📡 監視レイヤ:4 層モデル

可用性は「動いているか」だけでなく、 「正しく動いているか」まで含めて測ります。 4 つの監視レイヤで多角的に診ます。

レイヤ監視対象ツール例アラート閾値例
L1 死活ping, TCP, HTTP 200Pingdom, UptimeRobot3 連続失敗
L2 性能レスポンスタイム, throughputDatadog, New Relicp99 > 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)

🌋 著名インシデント:可用性破綻の教科書

① AWS S3 障害 (2017-02-28)

us-east-1 の S3 ストレージサブシステムが 4 時間停止。 オペレータのタイプミスでサーバ群を意図せず削除。 影響範囲:Slack, Trello, Quora, Coursera など多数。 教訓:「destructive command の確認プロンプト」「単一リージョン依存の危険」。

② Cloudflare 障害 (2020-07-17)

バックボーンルータの設定変更で 27 分間グローバル障害。 影響:Discord, Shopify, Hulu。 教訓:「設定変更は段階展開」「カナリアリリース」。

③ Fastly 障害 (2021-06-08)

CDN プラットフォーム障害で 1 時間、 Amazon, Reddit, BBC, NYT などが世界規模でダウン。 単一顧客の設定変更が全体に影響するソフトウェアバグ。 教訓:「マルチ CDN」「設定検証の自動化」。

④ Facebook BGP 障害 (2021-10-04)

BGP 設定変更で Facebook/Instagram/WhatsApp が 6 時間ダウン。 修復チームが自社ビルに入れない (ドアロック認証も Facebook 依存) という二次障害。 教訓:「out-of-band アクセス」「依存関係の循環排除」。

⑤ みずほ銀行 ATM 障害 (2021-)

2021 年に 11 回のシステム障害、 ATM 内のキャッシュカードが取り出せない事態。 旧 3 行統合システム「MINORI」の複雑性が原因。 金融庁から行政処分。 教訓:「複雑性は可用性の最大の敵」「カットオーバー後の安定化フェーズ」。

🌍 災害対策 (DR) 計画

日本は地震・台風・洪水のリスクが高く、 単一地域のデータセンター集約は危険。 47 都道府県のうち、 リスクプロファイルが異なる地域へのバックアップが推奨されます。

DR 戦略RTORPOコスト推奨業務
Backup & Restore24-72h24h社内ツール
Pilot Light4-8h1hB2B SaaS
Warm Standby1h以下< 1h中-高金融周辺
Multi-Site Active-Active00取引・通信

日本の主要 IT インフラは東京周辺に集中していたが、 2011 年東日本大震災以降、 大阪・福岡・沖縄への分散が進みました。 SSDSE-B-2026 の 47 都道府県データを使えば、 リージョン間の地理的距離・人口・経済規模を可視化して、 自社の DR 戦略立案に活用できます。

💰 Uptime Budget (エラーバジェット) の実務

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: 43.2 分 消費: 38 分 / 残: 5.2 分 予算内 -> 攻めの開発を継続可能

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 軸で判定する。

  1. 業務影響: 個人利用ツール → 99% (月 7.2 時間) で十分。 業務システム → 99.9% (月 43 分)。 金融/医療等 ミッションクリティカル → 99.99% (月 4.3 分) or 99.999% (月 26 秒)。
  2. 冗長化コスト: 99.9% → 単一リージョン Active-Standby。 99.99% → マルチ AZ Active-Active。 99.999% → マルチリージョン + 自動フェイルオーバー + 継続的カオステスト。 桁が上がるごとにコストが倍増。
  3. 許容ダウンタイム検証: Chaos Engineering (Netflix Chaos Monkey) で意図的障害注入、 障害復旧手順 (Runbook) を四半期演習で検証、 RPO (Recovery Point Objective) / RTO (Recovery Time Objective) を明文化。

「過剰な SLA はコストを爆発させる」原則のもと、 SSDSE-B-2026 分析環境のような研究用途では 99% で十分、 公的統計を提供する e-Stat 側は 99.9%+ が期待される、 と用途で目標を分ける判断が現代運用の鍵。