「サーバーが落ちたら、サービスが全部止まってしまう…」
「システムダウンによる損失を最小限に抑えたい!」
現代のビジネスでは、システムの停止は大きな損失につながります。そこで重要になるのがフェイルオーバーという技術です。
フェイルオーバーは、障害が発生した時に自動的に予備のシステムへ切り替える仕組み。この技術により、ユーザーはシステムの障害をほとんど意識することなく、サービスを継続して利用できるんです。
この記事では、フェイルオーバーの基礎から実践的な実装方法まで、初心者の方にも分かりやすく解説していきます!
フェイルオーバーとは?基本を理解しよう
一言で説明すると
フェイルオーバーとは、メインシステムに障害が発生した際、自動的に予備システムに切り替えてサービスを継続する仕組みです。
日本語では「障害時自動切替」や「自動待機系切替」と呼ばれることもあります。
身近な例で理解しよう
野球のピッチャー交代をイメージ:
先発ピッチャー(メインシステム):
- 試合開始から投げ続ける
- 体調が悪くなる(障害発生)
救援ピッチャー(予備システム):
- ブルペンで準備して待機
- 先発が降板したら、すぐにマウンドへ
- 試合を続行(サービス継続)
フェイルオーバーも、この交代劇と同じ仕組みなんです。
もう一つの例:消防署の待機体制:
- 第1出動隊が出動中(メインが稼働中)
- 別の火災が発生(障害発生)
- 第2出動隊がすぐに出動(フェイルオーバー)
- 常に誰かが対応できる体制(高可用性)
フェイルオーバーの仕組み
基本的な構成
通常時:
クライアント → メインサーバー(稼働中)
予備サーバー(待機中)
障害発生時:
クライアント → メインサーバー(停止)
↓ 自動切替
予備サーバー(稼働開始)
詳細な処理フロー
ステップ1:常時監視
監視システムが、メインサーバーの状態を常に確認しています。
監視内容:
- サーバーの応答時間
- CPUやメモリの使用率
- ネットワーク接続
- アプリケーションの動作状況
ステップ2:障害検知
メインサーバーから応答がない、または異常な状態を検知します。
検知方法:
- ハートビート(定期的な生存確認信号)が途絶える
- ヘルスチェックに失敗
- 応答時間が閾値を超える
ステップ3:切替判断
本当に切り替えるべきか判断します。
判断基準:
- 複数回の確認(誤検知を防ぐ)
- タイムアウト時間の設定
- 予備システムの準備状況
ステップ4:フェイルオーバー実行
予備システムを起動し、トラフィックを切り替えます。
実行内容:
- 予備システムの起動(既に起動していることも)
- IPアドレスの切替
- DNSの更新
- ロードバランサーの設定変更
ステップ5:サービス継続
予備システムが新しいメインとして動作を開始します。
フェイルオーバーの種類
アクティブ/スタンバイ構成
最も一般的な構成です。
特徴:
- メインシステムが稼働中
- 予備システムは待機状態
- 障害時に予備が起動
メリット:
- シンプルで分かりやすい
- コストが比較的安い
- 設定が容易
デメリット:
- 予備システムが遊んでいる(リソースの無駄)
- 切替に時間がかかることがある
図解:
通常時:
メインサーバー [稼働中] ← クライアント
予備サーバー [待機中]
障害時:
メインサーバー [停止]
予備サーバー [稼働中] ← クライアント
アクティブ/アクティブ構成
両方のシステムが常に稼働している構成です。
特徴:
- 全てのサーバーが同時に稼働
- 負荷分散も同時に実現
- 1台が落ちても残りで継続
メリット:
- リソースの無駄がない
- 負荷分散による性能向上
- 切替が高速
デメリット:
- 構成が複雑
- データ同期が必要
- コストが高い
図解:
通常時:
サーバー1 [稼働中] ← クライアント
サーバー2 [稼働中] ← クライアント
障害時:
サーバー1 [停止]
サーバー2 [稼働中] ← クライアント(全てのトラフィック)
ホットスタンバイ
予備システムが常に起動している状態です。
特徴:
- 予備システムも起動済み
- データは常に同期
- 瞬時に切替可能
切替時間:
数秒~数十秒
コールドスタンバイ
予備システムが停止している状態です。
特徴:
- 予備システムは電源オフ
- 障害時に起動開始
- 低コスト
切替時間:
数分~数十分
ウォームスタンバイ
ホットとコールドの中間です。
特徴:
- 予備システムは起動済み
- データ同期は定期的
- バランスの良い構成
切替時間:
数十秒~数分
フェイルオーバーの実装例
データベースのフェイルオーバー
MySQL レプリケーション
マスター・スレーブ構成:
マスターDB(書き込み・読み込み)
↓ レプリケーション
スレーブDB(読み込みのみ)
障害時:
スレーブをマスターに昇格させます。
設定例(簡略版):
-- マスター側
CHANGE MASTER TO MASTER_HOST='slave-server';
-- スレーブ側
CHANGE MASTER TO MASTER_HOST='master-server';
START SLAVE;
PostgreSQL Streaming Replication
# プライマリサーバーの設定
# postgresql.conf
wal_level = replica
max_wal_senders = 3
# スタンバイサーバーの設定
# standby.signal(ファイルを作成)
primary_conninfo = 'host=primary-server port=5432'
自動フェイルオーバーツール:
- Patroni
- repmgr
- pgpool-II
Webサーバーのフェイルオーバー
Nginx + Keepalived
KeepalivedでVIP(仮想IPアドレス)を管理します。
keepalived.conf(マスター):
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
virtual_ipaddress {
192.168.1.100
}
}
keepalived.conf(バックアップ):
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
virtual_ipaddress {
192.168.1.100
}
}
マスターが落ちると、バックアップが自動的にVIPを引き継ぎます。
ロードバランサーでのフェイルオーバー
HAProxy の設定
backend web_servers
balance roundrobin
option httpchk GET /health
server web1 192.168.1.10:80 check
server web2 192.168.1.11:80 check backup
server web3 192.168.1.12:80 check backup
動作:
- web1が正常なら、全てweb1へ
- web1が落ちたら、web2とweb3で負荷分散
クラウド環境でのフェイルオーバー
AWS での実装
RDS Multi-AZ
AWSのRDS(Relational Database Service)では、Multi-AZ機能で自動フェイルオーバーが可能です。
特徴:
- マスターとスタンバイを異なるAZ(アベイラビリティゾーン)に配置
- 同期レプリケーション
- 自動フェイルオーバー(1~2分)
設定:
# AWS CLIでの設定
aws rds create-db-instance \
--db-instance-identifier mydb \
--multi-az \
--db-instance-class db.t3.medium
ELB(Elastic Load Balancer)
複数のEC2インスタンス間で自動的にフェイルオーバーします。
ヘルスチェック設定:
{
"HealthCheckPath": "/health",
"HealthCheckIntervalSeconds": 30,
"HealthCheckTimeoutSeconds": 5,
"HealthyThresholdCount": 2,
"UnhealthyThresholdCount": 2
}
Azure での実装
Azure SQL Database
自動フェイルオーバーグループ機能があります。
設定:
# フェイルオーバーグループの作成
New-AzSqlDatabaseFailoverGroup `
-ResourceGroupName "myResourceGroup" `
-ServerName "primary-server" `
-PartnerServerName "secondary-server" `
-FailoverGroupName "myFailoverGroup"
Azure Traffic Manager
DNSベースのフェイルオーバーを提供します。
エンドポイント設定:
{
"type": "Microsoft.Network/trafficManagerProfiles",
"properties": {
"trafficRoutingMethod": "Priority",
"endpoints": [
{
"name": "primary",
"type": "Microsoft.Network/trafficManagerProfiles/azureEndpoints",
"priority": 1
},
{
"name": "secondary",
"priority": 2
}
]
}
}
GCP での実装
Cloud SQL
高可用性構成でフェイルオーバーが可能です。
# gcloudコマンドでのHA有効化
gcloud sql instances create myinstance \
--availability-type=REGIONAL \
--region=us-central1
フェイルオーバーのメリット
1. ダウンタイムの最小化
サービスの停止時間を劇的に減らせます。
例:
- フェイルオーバーなし:数時間のダウンタイム
- フェイルオーバーあり:数秒~数分の切替時間
2. ビジネス継続性(BCP)
災害や障害時でも、事業を継続できます。
重要な指標:
RTO(Recovery Time Objective):
目標復旧時間。どれだけ早く復旧するか。
RPO(Recovery Point Objective):
目標復旧時点。どこまでデータを復元するか。
フェイルオーバーにより、RTOとRPOを大幅に改善できます。
3. 顧客満足度の向上
ユーザーはサービスの中断をほとんど意識しません。
効果:
- 離脱率の低下
- 信頼性の向上
- ブランドイメージの維持
4. 計画メンテナンスの容易化
メンテナンス時も、フェイルオーバーを利用できます。
手順:
- 予備システムに切替
- メインシステムをメンテナンス
- 完了後にフェイルバック
ダウンタイムなしでメンテナンス可能です。
フェイルオーバーのデメリット
1. コストの増加
予備システムの分だけ、コストが上がります。
必要なコスト:
- 追加のハードウェア
- ソフトウェアライセンス
- 運用管理の人件費
- データセンターの費用
2. 複雑性の増大
システムが複雑になり、管理が難しくなります。
課題:
- 設定ミスのリスク
- トラブルシューティングの難易度
- ドキュメント管理の負担
3. データ同期の問題
完全なデータ同期は難しい場合があります。
同期の課題:
- ネットワーク遅延
- 書き込み競合
- 同期遅延(レプリケーションラグ)
4. スプリットブレイン
ネットワーク分断により、両方のシステムが同時にマスターになる問題です。
発生条件:
- ネットワーク障害
- ハートビートの失敗
対策:
- クォーラム(過半数)の確認
- フェンシング(強制停止)
- STONITH(Shoot The Other Node In The Head)
フェイルオーバーとフェイルバック
フェイルバックとは
障害が復旧した後、元のシステムに戻す操作です。
流れ:
1. 通常運用(メイン稼働)
2. 障害発生
3. フェイルオーバー(予備に切替)
4. メイン復旧
5. フェイルバック(メインに戻す)
フェイルバックの種類
自動フェイルバック:
- メインが復旧したら自動的に戻る
- 管理が楽
- 不安定な復旧だと再障害のリスク
手動フェイルバック:
- 管理者が判断して戻す
- 慎重な運用が可能
- 手間がかかる
フェイルバックの注意点
データの整合性確認:
フェイルオーバー中に更新されたデータを、元のシステムに反映する必要があります。
タイミングの選択:
業務影響の少ない時間帯に実施しましょう。
十分なテスト:
本当に元のシステムが正常か、入念に確認します。
ヘルスチェックの重要性
フェイルオーバーの精度は、ヘルスチェックの品質で決まります。
ヘルスチェックの種類
ICMP Ping:
ping -c 3 192.168.1.10
最もシンプルですが、サーバーが生きているだけで、アプリが正常かは分かりません。
TCP接続チェック:
nc -zv 192.168.1.10 80
ポートが開いているか確認します。
HTTP/HTTPSチェック:
curl -f http://192.168.1.10/health
アプリケーションレベルでの正常性を確認できます。
アプリケーション固有チェック:
# データベース接続確認
mysql -h 192.168.1.10 -e "SELECT 1"
実際の機能が動作するか確認します。
ヘルスチェックの設計ポイント
適切な間隔:
- 短すぎる:負荷が増える
- 長すぎる:障害検知が遅れる
- 推奨:10~30秒
タイムアウト設定:
- ネットワーク遅延を考慮
- 誤検知を防ぐ
リトライ回数:
失敗 → 再確認 → 失敗 → 再確認 → 失敗 → フェイルオーバー
複数回確認してから切り替えると安全です。
実践的な設計パターン
パターン1:Webアプリケーションの高可用性
クライアント
↓
ロードバランサー(冗長化)
↓
Webサーバー x 3(アクティブ/アクティブ)
↓
DBサーバー(マスター/スレーブ)
ポイント:
- ロードバランサー自体も冗長化
- Webサーバーは複数台でアクティブ
- DBはレプリケーションでスタンバイ
パターン2:地理的冗長構成
東京データセンター(プライマリ)
↓ 同期
大阪データセンター(セカンダリ)
メリット:
- 災害対策(DR)
- 地震などの広域災害にも対応
課題:
- 拠点間の通信遅延
- コストが高い
パターン3:マルチクラウド構成
AWS(メイン)
↓ DNS切替
Azure(バックアップ)
メリット:
- クラウド障害への対応
- ベンダーロックインの回避
よくある質問
Q1. フェイルオーバーは完全に自動化できる?
多くの場合、自動化できます。
ただし、スプリットブレインなどの複雑な状況では、人間の判断が必要になることもあります。
Q2. フェイルオーバー中にデータは失われる?
構成によります。
同期レプリケーションなら、ほぼデータロスなし。非同期レプリケーションでは、数秒~数分のデータが失われる可能性があります。
Q3. 予備システムの性能は同等である必要がある?
理想的には同等ですが、必須ではありません。
ピーク時の負荷に耐えられる性能があれば、一時的には性能が低くても問題ない場合もあります。
Q4. フェイルオーバーのテストはどのくらいの頻度で?
最低でも年2回、できれば四半期に1回が推奨されます。
本当に動作するか、定期的な確認が重要です。
Q5. クラウドなら自動的にフェイルオーバーされる?
設定次第です。
AWSのMulti-AZ RDSなど、自動フェイルオーバー機能を持つサービスもありますが、適切な設定が必要です。
まとめ:フェイルオーバーで高可用性を実現しよう
フェイルオーバーについて、基礎から実践まで解説してきました。
重要ポイントのおさらい:
- 障害時の自動切替が基本
メインから予備へ、シームレスに移行 - アクティブ/スタンバイが一般的
シンプルで分かりやすい構成 - ヘルスチェックが成功の鍵
適切な監視で確実な障害検知 - データ同期の設計が重要
RPOとRTOを考慮した構成 - 定期的なテストが必須
本当に動作するか確認を怠らない
フェイルオーバーは、現代のシステムにおいて必須の技術です。ビジネスの継続性を守り、ユーザーに安定したサービスを提供するために、ぜひ導入を検討してくださいね!
コメント