Amazon RDSでフェイルオーバーが発生した際に確認するポイント
システムを運用していく中で、数秒から数分ダウンタイムが発生し、原因を特定していく過程でRDSのフェイルオーバーが発生していたみたいなケースに遭遇することがあると思います。
今回はそんなケースにおいてフェイルオーバーが発生した原因を特定する際に確認するポイントを紹介していきます。
1. CloudWatch メトリクスの確認
特に最初に確認すべきCloudWatchメトリクスは以下の通りです。
DatabaseConnections
CPUUtilization
FreeableMemory
フェイルオーバーが発生した前後の時間帯において、DB接続数が急増し、それに伴いCPU使用率かメモリ使用率も急増していた場合、十中八九、負荷の急増が原因によるものと判断することができます。
他にもアプリケーション側の特性によって、ディスクI/Oやネットワーク帯域関連のメトリクスを確認するのも良いと思いますが、基本的にはメトリクス上でスパイクが発生していないかを確認します。
注意点として、上記はインスタンスレベルのメトリクスを指しているため、フェイルオーバー以前に稼働していたプライマリインスタンス(旧プライマリインスタンス)のメトリクスを確認する必要があります。
2. 拡張モニタリングの OS メトリクスの確認
拡張モニタリングを有効化している場合、CloudWatchメトリクスだけでなく、拡張モニタリングのメトリクスも確認しましょう。
CloudWatchは、DBインスタンスのハイパーバイザーからメトリクスを収集するのに対し、拡張モニタリングは、DBインスタンス上のエージェントからそのメトリクスを収集します。
そのため、CloudWatchメトリクス上ではメモリに余裕があっても、拡張モニタリングのメトリクス上ではメモリに余裕がない、といった事象が発生したりします。
特にOS側でスラッシングなどが発生していた場合は、拡張モニタリングを確認しないと原因を特定することは難しいと思います。
拡張モニタリングでは最低限下記のメトリクスを確認すると良いと思います。
cpuUtilization
diskIO
memory
swap
3. Performance Insightsの確認
パフォーマンスインサイトも有効化していたら確認しましょう。
パフォーマンスインサイトでは、特定の時間帯におけるDB負荷を確認することができます。データベースロードのグラフでボトルネックが確認できた場合は、該当時間帯に特に負荷をかけているSQLクエリを確認することができます。
どちらかというと、CloudWatchメトリクスで、ある程度負荷が原因だなという目星がついた段階で、より詳細な原因を調査するためにパフォーマンスインサイトを使うことが多いです。
4. メンテナンスウィンドウの確認
メンテナンスウィンドウは必ず設定されるため、週次で何らかのメンテナンスが発生する可能性があります。そのため、メンテナンスウィンドウ中にフェイルオーバーが発生していたかを確認する必要があります。
具体的には下記のような項目のメンテナンスが発生する可能性があり、それに伴うフェイルオーバーが発生します。
- 基盤となるハードウェア
- 基盤となるオペレーティングシステム (OS)
- データベースエンジンのバージョン
他にも下記のような場面で、メンテナンスウィンドウ中にフェイルオーバーが発生する可能性があります。
- マイナーバージョン自動アップグレード: マイナーバージョン自動アップグレードが有効になっている場合、メンテナンスウィンドウ中にアップグレードが実行され、フェイルオーバーが発生することがあります。
- エンジンバージョンの廃止: 廃止されるバージョンを実行しているインスタンスは、スケジュールされたメンテナンスウィンドウ内に、サポート対象となっている最新バージョンへの自動アップグレードのスケジュールが設定される可能性があります。
- DBインスタンスの変更: 一部の設定では、ダウンタイムを要する変更があります。そのため、DBインスタンスの変更を次のメンテナンスウィンドウ時に適用する設定をしていた場合、フェイルオーバーが発生する可能性があります。
5. AWS Health Dashboardの確認
Health Dashboardのイベントログを確認しましょう。エンジンバージョンの廃止アナウンスに該当するリソースがあるか、広域のメンテナンスにリソースが該当しているかなどを確認することができます。
メンテナンスの適用以前にイベントログを確認していた場合は、対象リソースの存在を確認することができますが、予定されていたメンテナンス等がすでに適用されていた場合、対象リソースの記載が消えてしまいます。
そのため、エンジンバージョンアップグレードなどユーザ側で確認できる項目のメンテナンスでない場合は、AWSサポートに当該リソースのメンテナンスの適用有無を確認する必要があります。
6. CloudTrailの確認
CloudTrailでユーザー起因によるフェイルオーバーを誘発する実行リクエストがないかを確認します。
具体的には、以下のような操作が原因となりえます。
- 前述したDBインスタンスの変更リクエストなど
- 管理者が意図的に実行したフェイルオーバー
- 自動化スクリプトによるフェイルオーバー
作業者や運用者が多いと全員の操作を把握することが難しくなり、こういった事象が発生する可能性があります。
7. エラーログの確認
フェイルオーバー発生時間帯前後のエラーログを確認します。データベースエンジンの異常動作に関するログの有無を確認しましょう。
こちらも旧プライマリインスタンスのエラーログを確認する必要がある点について留意しましょう。
8. AWSサポートへの問い合わせ
これまでの項目を全て調査しても原因がはっきりしない場合があります。その場合はAWS側の基盤に障害が発生した可能性があります。
そのため、原因を特定できなかった場合、当該DBインスタンスのARNと今までの調査方法と結果を添えて、AWSサポートにお問い合わせしましょう。
なお、AWSサポートの技術的なお問い合わせガイドラインに記載の通り、AWS側の基盤に障害があった場合は、具体的な障害の原因は開示されない方針のため、留意しましょう。
まとめ
AWS RDSのフェイルオーバーは、システムの可用性を確保するための重要な機能ですが、DBインスタンスの状況により数秒から数分のダウンタイムが発生します。
そのため、都度原因を特定し、継続的な改善と監視を行うことによって、予期せぬフェイルオーバーのリスクを最小限に抑えることが重要です。