AWS RDS VISUALIZER

AWS RDS マルチAZ構成

リレーショナルデータベースの構築・運用を自動化するマネージドサービス

シナリオ
アプリケーションがRDSエンドポイント経由でPrimary DBに接続し、Standby DBに同期レプリケーションが行われる通常フロー
ステップ1 / 4
ステップ
アプリケーション起動
RDS マルチAZインスタンスが稼働中です。MultiAZ: true が設定されており、Primary(AZ-a)と Standby(AZ-b)の2つのインスタンスが自動的に構成されています。
ARCHITECTURE DIAGRAM
アプリがエンドポイント経由でプライマリDBに接続し、スタンバイDBに同期レプリケーションされる流れを見ていこう
STEP 1
CODE VIEW
── RDS マルチAZ インスタンス確認 ──
 
$ aws rds describe-db-instances \
--db-instance-identifier mydb-instance
 
{
"DBInstanceIdentifier": "mydb-instance",
"DBInstanceClass": "db.r6g.large",
"Engine": "mysql",
"DBInstanceStatus": "available",
"MultiAZ": true,
"AvailabilityZone": "ap-northeast-1a",
"SecondaryAvailabilityZone": "ap-northeast-1b"
}
 
→ アプリケーションが起動し、DB接続を開始します...
完了
ステップ / アクティブ
障害 / エラー
AWS Cloud 境界
AZ 境界
未到達
解説

📌
マルチAZ配置とは

AZ-a (ap-northeast-1a)AZ-c (ap-northeast-1c)Primary DB読み書き可10.0.1.100Standby DBフェイルオーバー専用10.0.2.200同期レプリケーションSLA 99.95% | RPO = 0

マルチAZ(Multi-AZ)は、RDS が自動的に別の Availability Zone にスタンバイインスタンスを作成し、プライマリと同期してデータを複製する高可用性の仕組みです。プライマリへの書き込みはスタンバイにも同時にコミットされるため、フェイルオーバー時のデータ損失はゼロ(RPO = 0)です。

SLA 99.95% の可用性を提供し、AZ 障害・インスタンス障害・メンテナンス時に自動フェイルオーバーが行われます。アプリケーション側の変更は不要で、RDS エンドポイント(CNAME)が自動的に新プライマリを指すように更新されます。

マルチAZは可用性(HA)のための機能であり、読み取りスケーリングには別途 Read Replica を使用します。スタンバイインスタンスはフェイルオーバー専用で、通常時は直接アクセスできません。

// マルチAZ 有効で DB インスタンスを作成
$ aws rds create-db-instance \
--db-instance-identifier mydb-instance \
--db-instance-class db.r6g.large \
--engine mysql \
--multi-az

💡
マルチAZの特徴と注意点

シングルAZPrimary DBSingle AZ only障害 → 長時間ダウン手動復旧が必要マルチAZPrimary障害発生Standby→ 新Primary自動昇格自動フェイルオーバー60〜120秒 / RPO = 0手動介入不要 / 接続文字列変更なし
自動フェイルオーバー

Primary に障害が発生すると、60〜120秒で Standby が新 Primary に自動昇格します。手動介入は不要で、エンドポイント(CNAME)が自動更新されるためアプリケーションの接続文字列を変更する必要はありません。

同期レプリケーション(RPO = 0)

書き込みは Primary と Standby の両方にコミットされた後に完了します。これにより、フェイルオーバー時のデータ損失がゼロ(RPO = 0)になります。ただし、非同期レプリケーション(Read Replica)と比較すると書き込みレイテンシが若干増加します。

コスト

Standby インスタンスは Primary と同じスペックで作成されるため、インスタンス料金が約2倍になります。ただし、ストレージは共有されないため EBS 料金も別途発生します。本番環境ではコストより可用性を優先すべきです。

メンテナンス時の挙動

OS パッチやエンジンアップグレード時は、まずStandby にパッチを適用→ フェイルオーバー → 旧 Primary(現 Standby)にパッチ適用の順で行われます。これによりダウンタイムはフェイルオーバーの60〜120秒のみに抑えられます。

注意: Standby は読み取りトラフィックには使用できません。読み取り負荷の分散にはリードレプリカを使ってください。マルチAZの Standby はあくまでフェイルオーバー専用です。また、マルチAZは同一リージョン内の異なるAZに配置されるため、リージョン全体の障害には対応できません。

🔄
同期レプリケーションの仕組み

クライアント① WriteINSERTPrimary DB② wal 書き込み同期転送Standby DB③ ACK 返却④ 両方コミット完了⑤ 応答RPO = 0データ損失ゼロ

マルチAZでは同期レプリケーション(Synchronous Replication)が使われます。クライアントが書き込みを送ると、プライマリはスタンバイに WAL(トランザクションログ)を転送し、スタンバイからの ACK を受け取った後にコミット完了をクライアントに返します。

この「両方コミット完了してから応答」という仕組みにより、フェイルオーバー時のデータ損失がゼロ(RPO = 0)になります。ただし、スタンバイの ACK を待つ分だけ書き込みレイテンシがわずかに増加します。非同期レプリケーション(Read Replica)との最大の違いは、この応答タイミングにあります。

同期レプリケーション(マルチAZ)

コミットは Primary と Standby の両方に書き込まれてから完了。データ損失ゼロ。Standby への読み取りアクセスは不可。可用性が目的。

非同期レプリケーション(Read Replica)

Primary のコミット完了後に非同期でレプリカに反映。わずかなレプリケーションラグあり。レプリカへの読み取りアクセスが可能読み取りスケーリングが目的。

フェイルオーバーの流れ

time障害発生t=0s障害検知~10sCNAME 切替~30sStandby 昇格~60s復旧完了60〜120sダウンタイム(通常 60〜120秒)復旧後: 新スタンバイを別AZに自動プロビジョニング(バックグラウンド)RPO = 0 | RTO ≈ 60〜120s | 手動介入不要

マルチAZのフェイルオーバーは完全自動で行われ、手動介入は不要です。全体の所要時間(RTO)は通常60〜120秒で、同期レプリケーションによりデータ損失はゼロ(RPO = 0)です。

1. トリガー条件

以下のいずれかが発生すると、RDS が自動的にフェイルオーバーを開始します:

AZ 障害 — AZ 全体が利用不能になった場合
インスタンス障害 — Primary のハードウェア障害やOS障害
ネットワーク到達不能 — Primary への通信が途絶した場合
ストレージ障害 — Primary の EBS ボリュームに障害が発生
メンテナンス — OS パッチ適用、インスタンスタイプ変更、エンジンアップグレード
手動実行aws rds reboot-db-instance --force-failover
2. 障害検知

RDS の内部ヘルスチェック機構が Primary の異常を検知します。検知は数秒以内に行われ、検知後すぐに DNS 切替プロセスが開始されます。CloudWatch の RDSEventNotification でフェイルオーバーイベントが通知されます。

3. DNS 切替(CNAME 更新)

RDS エンドポイントは DNS の CNAME レコードで実装されています。フェイルオーバー時は、CNAME が指す先の IP アドレスが旧 Primary から Standby(新 Primary)に自動更新されます。DNS TTL は短く設定されているため(通常5秒)、クライアントは素早く新しい IP を解決できます。この仕組みにより、アプリケーションの接続文字列を変更する必要がありません

4. Standby 昇格

Standby DB が新しい Primary に昇格します。昇格プロセスでは、最後のトランザクションログの適用 → リカバリ処理 → 読み書き可能モードへの切り替えが行われます。同期レプリケーションにより Standby は常に最新データを持っているため、データ損失はゼロ(RPO = 0)です。

5. フェイルオーバー後の復旧

フェイルオーバー完了後、RDS は自動的に新しい Standby インスタンスを別の AZ に構築します。この間は一時的に冗長性が低下しますが、構築完了後に再びマルチAZの可用性が確保されます。手動操作は不要です。

アプリケーション側の推奨対応: フェイルオーバー中の60〜120秒間は接続エラーが発生します。アプリケーションでは自動リトライロジックDNS キャッシュの短いTTL設定(JVM の場合 networkaddress.cache.ttl=5)を実装してください。

🔗
RDS エンドポイント

アプリ接続文字列固定RDS エンドポイントCNAME レコードTTL: 5秒通常時 →FO後 →Primary10.0.1.100 (AZ-a)Standby10.0.2.200 (AZ-c)エンドポイント名変更なしIPのみ切替フェイルオーバー時: CNAME が指す IP が自動更新(アプリ側変更不要)

RDS では用途に応じた複数のエンドポイントが提供されます。接続先を正しく使い分けることが、可用性とパフォーマンスの両立に重要です。RDS エンドポイントはCNAME レコードで実装されており、フェイルオーバー時は CNAME が指す IP アドレスのみが変わります。アプリケーションの接続文字列はそのままで構いません。

クラスターエンドポイント(書き込み用)

常に現在の Primary DB を指す CNAME レコードです。フェイルオーバー時に自動的に新 Primary に切り替わるため、アプリケーションの接続文字列を変更する必要がありません。書き込み・読み取りの両方に使えます。

mydb.xxxx.ap-northeast-1.rds.amazonaws.com

CNAME レコードの動き(通常時)

; 通常運用時の DNS レコード
mydb.xxxx.ap-northeast-1.rds.amazonaws.com.
CNAME → ec2-10-0-1-100.ap-northeast-1.compute.amazonaws.com.
; Primary DB (AZ-a) の IP: 10.0.1.100
; フェイルオーバー後の DNS レコード
mydb.xxxx.ap-northeast-1.rds.amazonaws.com.
CNAME → ec2-10-0-2-200.ap-northeast-1.compute.amazonaws.com.
; 新 Primary DB (旧 Standby, AZ-b) の IP: 10.0.2.200
; エンドポイント名は同じ。CNAME の指す先だけが変わる
; TTL: 5秒 → クライアントは素早く新 IP を解決
リーダーエンドポイント(読み取り用)

リードレプリカへの読み取りクエリをロードバランシングするエンドポイントです。複数のリードレプリカがある場合、接続が自動的に分散されます。Aurora クラスターでは標準提供されますが、通常の RDS では各レプリカに個別エンドポイントが割り当てられます。

mydb-ro.xxxx.ap-northeast-1.rds.amazonaws.com
インスタンスエンドポイント(個別接続用)

特定のインスタンスに直接接続するエンドポイントです。Primary・Standby・各リードレプリカそれぞれに固有のエンドポイントがあります。トラブルシューティングや特定レプリカへの接続に使いますが、通常のアプリケーションではクラスターエンドポイントを使うべきです。

mydb-instance-1.xxxx.ap-northeast-1.rds.amazonaws.com
ベストプラクティス: アプリケーションからは常にクラスターエンドポイントを使用してください。インスタンスエンドポイントを直接指定すると、フェイルオーバー時に手動で接続先を変更する必要が生じます。

📝
AWS 認定試験(SAA)レベルの問題

Q1.マルチAZ構成の RDS インスタンスでフェイルオーバーが発生した場合、アプリケーションの接続文字列を変更する必要がありますか?
A.はい、新しいIPアドレスに変更が必要
B.いいえ、RDSエンドポイントのCNAMEが自動的に切り替わる
C.はい、Route 53で手動切り替えが必要
D.いいえ、ELBが自動で振り分ける
Q2.マルチAZ構成でスタンバイインスタンスに読み取りクエリを送ることは可能ですか?
A.可能。スタンバイはリードレプリカとしても機能する
B.不可能。スタンバイはフェイルオーバー専用で読み取りには使えない
C.CloudWatchの設定で有効にできる
D.パラメータグループで設定すれば可能

関連コンテンツ