0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS高可用設計】RDSフェイルオーバーを20秒未満に短縮する最適解:Aurora MySQL × レプリカ × RDS Proxy

0
Posted at

📌 はじめに

ミッションクリティカルなデータベース基盤において、「ダウンタイムをいかに極小化するか」は可用性設計の最重要課題です。

従来の Amazon RDS for MySQL(Multi-AZ) では、フェイルオーバー時に 30〜60 秒以上のダウンタイムが発生し、厳格な SLA を満たせないケースがあります。今回は、このフェイルオーバー時間を 20秒未満(< 20s) に圧縮するための標準設計パターン**「Amazon Aurora MySQL + リードレプリカ + Amazon RDS Proxy」**の組み合わせについて整理します。

1. 業務シナリオと従来のボトルネック分析

現行の構成と課題

  • 現行基盤: Amazon RDS for MySQL(Multi-AZ 構成)。
  • 課題: 障害テストを実施したところ、フェイルオーバーに伴うアプリケーションの中断時間が 約 40 秒 発生した。

従来の RDS Multi-AZ が遅い根本原因

従来の RDS Multi-AZ は、ブロックレベルの同期物理レプリケーション(EBS ボリュームのミラーリング)を採用しています。主ノード障害時には以下のステップを順次通過する必要があります。

  1. 主インスタンスの障害検知
  2. スタンバイインスタンスのマスター昇格処理(未コミットトランザクションのロールフォワード/バック)
  3. Route 53 CNAME レコードの切り替え(DNS レコード更新)
  4. クライアント側の DNS キャッシュ失効待ち & コネクションプールの再接続

この一連のオーバーヘッドにより、どんなにチューニングしても通常 30〜60 秒以上(場合によっては 120 秒)の中断が発生します。

業務改善ゴール

  • 障害発生時のフェイルオーバーに伴う中断・復旧時間を 20 秒未満(RTO < 20s) に抑え込むこと。

2. アーキテクチャトポロジー(超高速フェイルオーバー構成)

[ アプリケーション接続プール ]
        │
        │ クライアント側の持続的コネクション (DNS再解決の遅延を完全排除)
        ▼
┌────────────────────────────────────────────────────────┐
│ Amazon RDS Proxy                                       │
│  - フロントエンド接続をプールし、セッション切断を防止   │
│  - Aurora クラスターの状態をリアルタイム感知し、        │
│    プロキシレイヤーで新マスターへミリ秒級ルーティング   │
│  - 全体のフェイルオーバー時間を最大 66% 短縮          │
└──────────────────────────┬─────────────────────────────┘
                           │ 内部切り替え(秒級)
                           ▼
┌────────────────────────────────────────────────────────┐
│ Amazon Aurora MySQL クラスター                         │
│                                                        │
│   ┌────────────────────────┐   秒級で昇格   ┌────────────────────────┐
│   │ ライター (Writer)      │ ◄─────────── │ Aurora レプリカ (Reader)│
│   │ 障害発生               │              │ 新しいライターへ自動昇格│
│   └───────────┬────────────┘              └───────────┬────────────┘
│               │                                       │
│               ▼                                       ▼
│   ┌────────────────────────────────────────────────────────┐
│   │ Aurora 共有分散ストレージ (3 AZ × 6 プレースメント)     │
│   │ (ストレージの再同期・再生処理が不要、即時マウント可能) │
└────────────────────────────────────────────────────────┘

3. なぜこの3要素なのか?

目標である「20秒未満の復旧」を達成するには、ストレージ層・インスタンス層・ネットワーク/クライアント層 のボトルネックを同時に解消する必要があります。

① インフラ底座の近代化:Amazon Aurora MySQL への移行

  • コンピュートとストレージの完全分離:
  • 従来の RDS ではストレージがノードに直結していましたが、Aurora では 3 つのアベイラビリティゾーン(AZ)に 6 つのコピーを保持する共有分散仮想ストレージを採用しています。
  • 障害発生時にストレージブロックの同期やクラッシュリカバリ(REDOログの大量再生)を待つ必要がないため、切り替え時間を劇的に短縮できます。

② ホットスタンバイの常駐:別 AZ への Aurora レプリカ配置

  • メモリ常駐型の即時昇格:
  • Aurora の Multi-AZ 構成は、別 AZ に Aurora リードレプリカ(Reader) を配置することで機能します。
  • ライター(Writer)障害時、稼働中の Aurora レプリカが即座に新しいライターへ昇格します。ストレージ層を共有しているため、昇格処理自体は通常 10〜15 秒程度 で完了します。

③ クライアント側の DNS 待機時間をゼロ化:Amazon RDS Proxy の導入

  • 最大のボトルネックは「クライアントの DNS キャッシュ」:

  • データベース本体が 10 秒で昇格しても、アプリケーション側の JVM や OS が保持する DNS キャッシュ、あるいはコネクションプールの切断・再接続の再試行によって、実質的なダウンタイムが 30〜40 秒以上に引き延ばされてしまいます。

  • RDS Proxy による透過的ルーティング:

  • アプリケーションは RDS Proxy のエンドポイントとのみ持続的接続(長接続)を維持します。

  • RDS Proxy は Aurora クラスター内部のトポロジー変更イベントをネイティブに検知するため、DNS の伝播を待つことなく、プロキシレイヤーで通信トラフィックを昇格した新ライターへ数秒以内に自動ルーティングします。

  • これにより、フェイルオーバーに伴う中断時間を 最大 66% 削減 し、全体の中断時間を 数秒〜十数秒(確実に 20 秒以下) に収めることが可能になります。

4. Terraform による構成コード例 (Aurora + RDS Proxy)

# 1. Aurora MySQL クラスター定義 (Multi-AZ)
resource "aws_rds_cluster" "aurora_cluster" {
  cluster_identifier      = "aurora-ha-cluster"
  engine                  = "aurora-mysql"
  engine_version          = "8.0.mysql_aurora.3.05.2"
  database_name           = "appdb"
  master_username         = "admin"
  master_password         = "SecurePassw0rd123!"
  backup_retention_period = 7
  preferred_backup_window = "02:00-03:00"
  skip_final_snapshot     = true
}

# 2. Writer インスタンス (AZ-a)
resource "aws_rds_cluster_instance" "writer_instance" {
  identifier         = "aurora-instance-writer"
  cluster_identifier = aws_rds_cluster.aurora_cluster.id
  instance_class     = "db.r6g.xlarge"
  engine             = aws_rds_cluster.aurora_cluster.engine
  engine_version     = aws_rds_cluster.aurora_cluster.engine_version
  availability_zone  = "ap-northeast-1a"
}

# 3. Reader レプリカ (AZ-c / 高可用性フェイルオーバー先)
resource "aws_rds_cluster_instance" "reader_instance" {
  identifier         = "aurora-instance-reader"
  cluster_identifier = aws_rds_cluster.aurora_cluster.id
  instance_class     = "db.r6g.xlarge"
  engine             = aws_rds_cluster.aurora_cluster.engine
  engine_version     = aws_rds_cluster.aurora_cluster.engine_version
  availability_zone  = "ap-northeast-1c"
  promotion_tier     = 0 # 優先的にマスターへ昇格させる設定
}

# 4. Amazon RDS Proxy 定義
resource "aws_db_proxy" "aurora_proxy" {
  name                   = "aurora-ha-proxy"
  debug_logging          = false
  engine_family          = "MYSQL"
  idle_client_timeout    = 1800
  require_tls            = true
  role_arn               = aws_iam_role.proxy_iam_role.arn
  vpc_subnet_ids         = [aws_subnet.private_a.id, aws_subnet.private_c.id]
  vpc_security_group_ids = [aws_security_group.proxy_sg.id]

  auth {
    auth_scheme = "SECRETS"
    iam_auth    = "DISABLED"
    secret_arn  = aws_secretsmanager_secret.db_secret.arn
  }
}

resource "aws_db_proxy_default_target_group" "proxy_target_group" {
  db_proxy_name = aws_db_proxy.aurora_proxy.name

  connection_pool_config {
    max_connections_percent      = 90
    max_idle_connections_percent = 50
  }
}

resource "aws_db_proxy_target" "proxy_target" {
  db_proxy_name         = aws_db_proxy.aurora_proxy.name
  target_group_name     = aws_db_proxy_default_target_group.proxy_target_group.name
  db_cluster_identifier = aws_rds_cluster.aurora_cluster.id
}

5. 設計比較まとめ

検討軸 従来の RDS for MySQL (Multi-AZ) 最適化後:Aurora MySQL + RDS Proxy
ストレージ構造 EBS ボリューム単位の物理ミラー同期 3 AZ 分散共有ストレージ(クラッシュリカバリ不要)
フェイルオーバー時間 30〜60 秒以上(DNS 切替待ちが発生) 20 秒未満(数秒〜15 秒程度)
クライアント影響 コネクション切断 + DNS キャッシュ再取得 プロキシが接続を維持し、背後で透過的に新ライターへ接続
スタンバイ機の活用 完全待機系(読取クエリも不可、リソース遊休) 通常時はリードレプリカとして参照負荷分散に活用可能

6. まとめ

  1. Aurora への切り替え: ストレージの同期遅延とログ再生オーバーヘッドを排除し、データベース層の昇格速度を最大化する。
  2. Aurora レプリカの常駐: 別 AZ に昇格優先度(Promotion Tier)を設定したレプリカを配置し、15 秒以内のインスタンス昇格を担保する。
  3. RDS Proxy の介在: クライアント側の DNS キャッシュ遅延を完全に無効化し、切り替え時間を最大 66% 短縮して「20 秒未満」の復旧 SLA を確実に達成する。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?