Aurora MySQLはALTER SYSTEM CRASHでインスタンスを強制クラッシュできる

  • AWS
  • Aurora
  • RDS
  • DR

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

Aurora MySQL互換のDBクラスタには、SQL文としてクラッシュや障害をわざと発生させる「フォルトインジェクションクエリ」という仕組みがある。DR訓練やアプリ側の再接続耐性を確認したいときに使えそうなので、内容を整理しておく。

何ができるコマンドか

Aurora MySQL互換インスタンスに対して、以下の4種類のイベントをスケジュールできる。

  • ライター/リーダーインスタンスのクラッシュ
  • Auroraレプリカの障害
  • ディスク障害
  • ディスク輻輳(congestion)

このうちクラッシュ系は「発生をシミュレートする」のではなく、実際にインスタンスをクラッシュさせる。それ以外(レプリカ障害、ディスク障害、輻輳)は指定した時間だけ状態を模擬するもので、実際にその障害が起きるわけではない。

インスタンスクラッシュの構文

ALTER SYSTEM CRASH [ INSTANCE | DISPATCHER | NODE ];

オプションは3種類。

  • INSTANCE — Auroraインスタンス上のMySQL互換データベース部分だけをクラッシュさせる
  • DISPATCHER — ライターインスタンス上のディスパッチャー(クラスタボリュームへの書き込みを担当するプロセス)をクラッシュさせる
  • NODE — 上記両方(MySQL互換DB + ディスパッチャー)をクラッシュさせ、あわせてキャッシュも削除する

実行にはマスターユーザー権限一式が必要で、クラスタのエンドポイントだけでなく、Auroraレプリカのエンドポイントに接続して投げることもできる。

フェイルオーバーは起きない

このクエリはインスタンスを落とすだけで、フェイルオーバーは発生しない。フェイルオーバーそのものを試したい場合は、このコマンドではなく、RDSコンソールの「フェイルオーバー」アクション、failover-db-cluster CLIコマンド、または FailoverDBCluster API操作を使う必要がある。用途がはっきり分かれているので、目的に応じて使い分ける形になる。

他のフォルトインジェクションクエリ

クラッシュ系とは別に、以下のような時間指定つきのシミュレーション系クエリも用意されている。

ALTER SYSTEM SIMULATE percentage_of_failure PERCENT READ REPLICA FAILURE
[ TO ALL | TO "replica name" ]
FOR INTERVAL quantity { YEAR | QUARTER | MONTH | WEEK | DAY | HOUR | MINUTE | SECOND };

レプリカ障害の割合や対象、継続時間を細かく指定できる。ディスク障害・輻輳についても同様の時間指定型の構文がある。長すぎる時間を指定すると、ライター側が大量に書き込んだ場合にAuroraがレプリカをクラッシュしたと判断して置き換えてしまうことがあるらしいので、この時間指定は慎重に決めた方がよさそうだ。

なお、PostgreSQL互換のAuroraでは構文が異なり、SELECT aurora_inject_crash('instance' | 'dispatcher' | 'node'); という関数呼び出しの形になる。MySQL互換とは別物として覚えておく必要がある。

実機での動作確認はまだしていないので、そこは実機未確認として留意しておく。