投稿

RDS Multi-AZ failover には2種類ある — 別 AZ 切替と同一 AZ 復旧の見分け方

RDS Multi-AZ failover には2種類ある — 別 AZ 切替と同一 AZ 復旧の見分け方

参考: Amazon RDS event categories and event messages

まとめ

  • RDS Multi-AZ の failover は「別 AZ への切替」と「同一 AZ での復旧」の2パターンがある
  • RDS-EVENT-0015 (Multi-AZ failover to standby complete) → 別 AZ への切替
  • RDS-EVENT-0050 / 0051 (Multi-AZ instance activation) → 同一 AZ での復旧
  • DB instance restarted の件数で判別するのは公式に保証されていない。イベント ID で判定するのが正攻法
  • リアルタイム判定なら MySQL の @@hostname を SQL で問い合わせるのが最速。describe_db_instances の AZ メタデータは数分単位でラグする

何が困ったか

reboot_db_instance(ForceFailover=True) を実行して Multi-AZ instance failover completed イベントが出ていたので「フェールオーバー成功=AZ が切り替わった」と思い込んでいたが、describe_db_instances を見ると Primary AZ が変わっていない。AWS コンソールでも同じ AZ のまま。実際にはフェールオーバーが同一 AZ 内で完結していたケースだった。

公式イベントで明確に区別できる

AWS RDS のイベントメッセージは公式で以下のように定義されている。

Event ID Message 意味
RDS-EVENT-0013 Multi-AZ instance failover started. 開始
RDS-EVENT-0015 Multi-AZ failover to standby complete - DNS propagation may take a few minutes. 別 AZ の Standby を新 Primary に昇格
RDS-EVENT-0049 Multi-AZ instance failover completed. 汎用完了(AZ 変化の有無を問わない)
RDS-EVENT-0050 Multi-AZ instance activation started. 同一 AZ で再昇格開始
RDS-EVENT-0051 Multi-AZ instance activation completed. 同一 AZ 再昇格完了

注目すべきは RDS-EVENT-0050 の説明:

A Multi-AZ activation has started after a successful DB instance recovery. This event occurs if Amazon RDS promotes the primary DB instance to the same AZ as the previous primary DB instance.

つまり「同じ AZ で Primary を再昇格させた」ことが明示的にこのイベントで通知される。RDS-EVENT-0049 の generic な「completed」だけ見ていると見逃す。

なぜ同一 AZ 復旧が起きるのか

ForceFailover=True をリクエストしても、Standby が利用可能でない・整合性がとれない等の事情があると AWS 側で「同一 AZ で Primary を再起動するだけ」に倒すことがある。それでも Multi-AZ instance failover completed のイベントは出るので、汎用 completed メッセージだけ見ていると気付けない。

「DB instance restarted」の件数は使えるか

経験的な観察として:

ケース DB instance restarted の件数
別 AZ への切替 2 回
同一 AZ で復旧 1 回

メカニズム的には納得できる(別 AZ 切替は2インスタンスが役割転換、同一 AZ 復旧は Primary だけ再起動)。ただし AWS 公式に「restart 件数で判別する」記述はない。判定ロジックには使わず補助情報として扱うのが安全。

DNS 伝播の落とし穴

別 AZ 切替が起きても describe_db_instancesAvailabilityZone はしばらく旧値を返す。RDS-EVENT-0015 のメッセージに DNS propagation may take a few minutes と書かれているとおり API メタデータにはラグがある。API 比較だけだと「変わっていない」と誤検出するので、イベントログで RDS-EVENT-0015 を検出していればラグに関わらず AZ 変化ありと言い切れる。

実測: API ラグと SQL ホスト名の差

10 秒間隔で describe_db_instances と MySQL @@hostname を併走モニタリングしたときのログ抜粋:

時刻 Status API の Primary AZ MySQL @@hostname
12:04:18 available ap-northeast-1c ip-10-0-2-100
12:05:01 rebooting ap-northeast-1c ip-10-0-2-100
12:05:21 rebooting ap-northeast-1c ip-10-0-1-200 ← SQL 切替
12:06:12 available ap-northeast-1c ip-10-0-1-200
12:13:41 available ap-northeast-1a ← API 切替 ip-10-0-1-200

reboot 中の 20 秒以内@@hostname が新ホストに切り替わっているのに対し、describe_db_instancesPrimary AZ が新 AZ を返すまでは 約 8 分20 秒かかっている。失敗オーバー完了 (12:06:12) からカウントしても 7 分以上のラグ。

つまり API メタデータの「ラグ」は数分〜10 分弱の単位で、リアルタイムには使えない。即時に新 Primary を判定したいなら以下が早い:

  • RDS イベント (RDS-EVENT-0015 / 0050) — failover 直後にほぼ即時で発火
  • DB に SQL を投げて @@hostname を取得 — 接続できれば現在値そのもの
  • エンドポイントの DNS 解決 (nslookup) — Multi-AZ エンドポイントの CNAME は TTL 5 秒で更新される

Multi-AZ instance failover completed だけ見るのではなく、RDS-EVENT-0015 / RDS-EVENT-0050 か SQL 経由のホスト名で確認する運用にする。

トレンドのタグ