· ディザスタリカバリと高可用性 · 4 min read
Google Cloud でのマルチリージョン展開:高可用性の確保
Google Cloud でのマルチリージョン展開の設計パターンと実装方法について詳しく解説します

マルチリージョン展開の重要性
大規模なシステムの可用性とレジリエンスを確保するためには、単一リージョンでの運用だけでは不十分です。マルチリージョン展開は以下の利点を提供します:
- 地理的な冗長性の確保
- 災害時の事業継続性
- ユーザーへの低レイテンシーアクセス
- リージョン障害への対応
アーキテクチャ設計のパターン
1. アクティブ-アクティブ構成
両リージョンで同時にサービスを提供する構成:
# マルチリージョンロードバランサの設定例
apiVersion: compute.v1
kind: BackendService
metadata:
name: multi-region-backend
spec:
loadBalancingScheme: EXTERNAL
healthChecks:
- {healthCheck: projects/PROJECT_ID/global/healthChecks/http-health-check}
backends:
- group: projects/PROJECT_ID/regions/asia-northeast1/instanceGroups/group-1
balancingMode: RATE
maxRate: 100
- group: projects/PROJECT_ID/regions/asia-northeast2/instanceGroups/group-2
balancingMode: RATE
maxRate: 100
2. アクティブ-パッシブ構成
プライマリリージョンを主体とし、フェイルオーバー時に切り替える構成:
from google.cloud import compute_v1
def switch_traffic(project_id: str, region: str, backend_service: str):
client = compute_v1.BackendServicesClient()
# バックエンドサービスの更新
backend = client.get(project=project_id, backend_service=backend_service)
for backend in backend.backends:
if backend.group.endswith(region):
backend.capacity_scaler = 1.0
else:
backend.capacity_scaler = 0.0
client.update(
project=project_id,
backend_service=backend_service,
backend_service_resource=backend
)
データレプリケーション戦略
1. Cloud Spanner によるグローバルデータベース
-- マルチリージョン構成の例
CREATE INSTANCE multi-region-instance
CONFIG = "nam-eur-asia1"
DISPLAY_NAME = "Multi-Region Instance"
PROCESSING_UNITS = 2000;
-- レプリケーション設定
ALTER DATABASE my_database
SET OPTIONS (
vpc_network = "projects/PROJECT_ID/global/networks/my-network",
num_nodes = 3,
replica_locations = ["asia-northeast1", "asia-northeast2"]
);
2. Cloud Storage のマルチリージョン構成
# マルチリージョンバケットの作成
gsutil mb -l asia \
-b on \
gs://my-multi-region-bucket
# オブジェクトのライフサイクル管理
cat > lifecycle.json << EOF
{
"lifecycle": {
"rule": [
{
"action": {"type": "SetStorageClass", "storageClass": "NEARLINE"},
"condition": {"age": 30}
}
]
}
}
EOF
gsutil lifecycle set lifecycle.json gs://my-multi-region-bucket
トラフィック管理とルーティング
Cloud Load Balancing の設定
# グローバルロードバランサの設定
apiVersion: compute.v1
kind: URLMap
metadata:
name: global-lb
spec:
defaultService: global/backendServices/multi-region-backend
hostRules:
- hosts:
- "*"
pathMatcher: main
pathMatchers:
- name: main
defaultService: global/backendServices/multi-region-backend
Cloud CDN の活用
# Cloud CDN の設定
apiVersion: compute.v1
kind: BackendService
metadata:
name: cdn-enabled-backend
spec:
enableCDN: true
cdnPolicy:
cacheMode: CACHE_ALL_STATIC
defaultTtl: 3600s
clientTtl: 3600s
maxTtl: 86400s
監視とフェイルオーバー
Cloud Monitoring によるヘルスチェック
# ヘルスチェックの設定
apiVersion: monitoring.v1
kind: UptimeCheckConfig
metadata:
name: multi-region-health
spec:
displayName: "Multi-Region Health Check"
period: 300s
timeout: 10s
httpCheck:
path: "/health"
port: 443
monitoredResource:
type: "uptime_url"
labels:
project_id: "PROJECT_ID"
host: "example.com"
自動フェイルオーバーの実装
from google.cloud import monitoring_v3
def check_region_health(project_id: str, region: str):
client = monitoring_v3.UptimeCheckServiceClient()
# メトリクスの確認
results = client.list_uptime_check_configs(
request={"parent": f"projects/{project_id}"}
)
for result in results:
if result.display_name == f"{region}-health":
return result.status == monitoring_v3.UptimeCheckConfig.Status.UP
return False
ディザスタリカバリ計画
リージョンフェイルオーバーの手順
- プライマリリージョンの状態確認
- セカンダリリージョンの準備状態確認
- トラフィックの段階的な移行
- DNS 設定の更新
- アプリケーション層の設定更新
def execute_failover_plan(project_id: str, source_region: str, target_region: str):
# 1. ヘルスチェック
if not check_region_health(project_id, source_region):
# 2. ターゲットリージョンの準備
prepare_target_region(project_id, target_region)
# 3. トラフィックの移行
switch_traffic(project_id, target_region)
# 4. DNS の更新
update_dns_records(project_id, target_region)
# 5. アプリケーション設定の更新
update_app_config(project_id, target_region)
コスト最適化
マルチリージョン展開には適切なコスト管理が必要です:
- リージョン間のネットワーク転送コストの最適化
- リソースの適切なサイジング
- 自動スケーリングの活用
- 予約インスタンスの検討
おすすめの書籍
マルチリージョン展開の詳細な設計と実装について、以下の書籍が参考になります:
参考リンク
Share: