Aurora PostgreSQL のフォールト・インジェクション・クエリ


Aurora PostgreSQL ではフォールト・インジェクション・クエリを発行することで、インスタンスのクラッシュをシミュレートできる。以下のクエリが利用可能。

フォールト・インジェクション・クエリ 説明
aurora_inject_crash() インスタンスのクラッシュ
aurora_inject_replica_failure() レプリカの障害
aurora_inject_disk_failure() ディスクの障害
aurora_inject_disk_congestion() ディスクの輻輳


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

aurora_inject_crash() はインスタンスのクラッシュを強制的に発生させる。

SELECT aurora_inject_crash ('instance' | 'dispatcher' | 'node');
オプション 説明
instance データベースインスタンスのクラッシュをシミュレート
dispatcher ディスパッチャーのクラッシュをシミュレート(ディスパッチャーはクラスタボリュームへの書き込みを行うコンポーネント)
node インスタンスとディスパッチャー両方のクラッシュをシミュレート

このクエリではフェイルオーバーは発生しないため、以下の操作で復旧させる必要がある。

  • RDS コンソールで DB クラスターの Failover インスタンスアクションを選択
  • AWS CLI コマンドの failover-db-cluster または RDS API の FailoverDBCluster操作を行う

単にフェイルオーバー後のアプリ動作を確認するだけなら、AWS CLI コマンドで failover-db-cluster するだけでもよい。

aws rds failover-db-cluster --db-cluster-identifier <DBClusterIdentifier>


レプリカの障害のテスト

aurora_inject_replica_failure() ではレプリカの障害をシミュレートできる。

SELECT aurora_inject_replica_failure(
   percentage_of_failure, time_interval, 'replica_name'
);

指定した時間/割合でレプリカへのレプリケーションがブロックされる(writerインスタンスは無影響)。 指定した時間が終了すると、影響を受けたレプリカは自動的にプライマリインスタンスと同期される。

オプション 説明
percentage_of_failure ブロックするレプリケーションの割合を 0~100 で指定。0 を指定すると、レプリケーションはブロックされず、100 を指定すると、全てのレプリケーションがブロックされる
time_interval レプリカの障害時間を秒単位で指定。長すぎる値を設定すると、書き込みインスタンスが大量のデータを書き込んだ場合、レプリカがクラッシュしたものと見なしてレプリカを置き換える可能性がある
replica_name 対象のレプリカを指定(SELECT server_id FROM aurora_replica_status(); で確認可能)。空文字とした場合は全てのレプリカが対象。


ディスクの障害

aurora_inject_disk_failure() でDB クラスターのディスクの障害をシミュレートできる。

ディスク障害のシミュレーションでは、DB クラスターがランダムにディスクセグメントをエラーとしてマークする。これらのセグメントに対するリクエストはブロックされる。

SELECT aurora_inject_disk_failure(
   percentage_of_failure,
   index, 
   is_disk, 
   time_interval
);
オプション 説明
percentage_of_failure 障害イベントの発生時にエラーとしてマークするディスクの割合を 0~100 で指定。0 を指定すると、ディスクのどの部分もエラーとしてマークされず100 を指定すると、ディスク全体がエラーとしてマークされる。
index 障害イベントをシミュレートする特定の論理的なデータブロックまたはストレージノードを指定(is_disk を参照)。SELECT * FROM aurora_show_volume_status() で表示されるdisks の値がクラスターボリュームの論理的なデータブロックの総数、nodes の値がクラスターボリュームのストレージノードの総数。この値以下を指定する。
is_disk true を指定すると、論理的なブロックに障害が挿入され、false を指定すると、ストレージノードに障害が挿入される
time_interval ディスク障害をシミュレートする時間を秒単位で指定


ディスクの輻輳

aurora_inject_disk_congestion() でDB クラスターのディスクの輻輳をシミュレートできる。

ディスク輻輳のシミュレーションでは、DB クラスターがランダムにディスクセグメントを輻輳としてマークする。これらのセグメントに対するリクエストは、シミュレーションの実行中、指定した最小遅延値と最大遅延値の間で遅延する。

SELECT aurora_inject_disk_congestion(
   percentage_of_failure, 
   index, 
   is_disk, 
   time_interval, 
   minimum, 
   maximum
);
オプション 説明
percentage_of_failure 障害イベントの発生時に輻輳としてマークするディスクの割合を 0~100 で指定。0 を指定すると、ディスクのどの部分も輻輳としてマークされず、100 を指定すると、ディスク全体が輻輳としてマークされる。
index 障害イベントのシミュレーションに使用する特定の論理的なデータブロックまたはストレージノードを指定。SELECT * FROM aurora_show_volume_status() で表示されるdisks の値がクラスターボリュームの論理的なデータブロックの総数、nodes の値がクラスターボリュームのストレージノードの総数。この値以下を指定する。
is_disk true を指定すると、論理的なブロックに障害が挿入され、false を指定すると、ストレージノードに障害が挿入される
time_interval ディスク輻輳をシミュレートする時間を秒単位で指定
minimum/ maximum 輻輳による遅延の最小値と最大値をミリ秒単位で指定(有効な値の範囲は 0.0~100.0 ミリ秒)。シミュレーションを実行する間、輻輳としてマークされたディスクセグメントでは、最小値と最大値の間の範囲でランダムな遅延が発生する。