· ディザスタリカバリと高可用性  · 4 min read

Google Cloud でのマルチリージョン展開:高可用性の確保

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

ディザスタリカバリ計画

リージョンフェイルオーバーの手順

  1. プライマリリージョンの状態確認
  2. セカンダリリージョンの準備状態確認
  3. トラフィックの段階的な移行
  4. DNS 設定の更新
  5. アプリケーション層の設定更新
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)

コスト最適化

マルチリージョン展開には適切なコスト管理が必要です:

  1. リージョン間のネットワーク転送コストの最適化
  2. リソースの適切なサイジング
  3. 自動スケーリングの活用
  4. 予約インスタンスの検討

おすすめの書籍

マルチリージョン展開の詳細な設計と実装について、以下の書籍が参考になります:

参考リンク

Back to Blog

Related Posts