DB インスタンスを、読み取り可能なスタンバイを 2 つ持つマルチ AZ DB クラスター配置に変更する。
マルチ AZ DB クラスター配置は、フェイルオーバーがより速く、スタンバイで読み取りも受けられます。
しかし、フェイルオーバーではエンドポイントの DNS レコードが新しいライターを指すように書き換わる仕組みで、アプリケーションは名前を引き直して接続し直す必要があります。JVM が古い IP アドレスをキャッシュし続ける限り、切り替えが速くなっても接続エラーは再起動まで続きます。
ある企業の Java アプリケーションは、Amazon RDS for MySQL のマルチ AZ DB インスタンスに、DB インスタンスのエンドポイントで接続しています。フェイルオーバーのテストの後、アプリケーションは 20 分以上接続エラーを出し続け、アプリケーションを再起動すると接続できるようになりました。 この問題を解決するため、CloudOps エンジニアは何をすべきですか。
マルチ AZ DB インスタンスのフェイルオーバー後も Java のアプリケーションが古い接続先を使い続ける問題を解決する
DB インスタンスを、読み取り可能なスタンバイを 2 つ持つマルチ AZ DB クラスター配置に変更する。
マルチ AZ DB クラスター配置は、フェイルオーバーがより速く、スタンバイで読み取りも受けられます。
しかし、フェイルオーバーではエンドポイントの DNS レコードが新しいライターを指すように書き換わる仕組みで、アプリケーションは名前を引き直して接続し直す必要があります。JVM が古い IP アドレスをキャッシュし続ける限り、切り替えが速くなっても接続エラーは再起動まで続きます。
アプリケーションの JVM で、名前解決の結果をキャッシュする時間 networkaddress.cache.ttl を 60 秒以下に設定する。
マルチ AZ のフェイルオーバーは、DB インスタンスの DNS レコードをスタンバイへ向け直します。切り替えは通常 60〜120 秒で終わり、既存の接続は張り直しが必要です。
JVM は名前解決の結果をキャッシュし、設定によっては JVM を再起動するまで更新しません。公式ドキュメントは JVM の TTL を 60 秒以下にするよう推奨しており、そうすれば切り替えの後に名前を引き直して新しい IP アドレスへ接続できます。
Amazon Route 53 のプライベートホストゾーンに、エンドポイントを値とする TTL 30 秒の CNAME レコードを作成し、接続先にする。
CNAME レコードの TTL を 30 秒にすると、DNS リゾルバーがこのレコードをキャッシュする時間は 30 秒になり、切り替えが早く伝わるように見えます。
しかし、古い IP アドレスを保持しているのは JVM のキャッシュです。JVM は自身の TTL の設定で名前解決の結果を保持するので、レコードの TTL を短くしても、JVM が名前を引き直すまで古い IP アドレスへの接続は変わりません。
アプリケーションの接続プールで、切断された接続を検出して新しい接続に作り直す検証を有効にする。
接続プールの検証を有効にすると、切れた接続を捨てて新しい接続を作り直せるので、フェイルオーバーで切断された接続は残りません。
しかし、新しい接続を作るときも JVM はキャッシュした古い IP アドレスを使います。作り直した接続も旧プライマリへ向かうため、エラーは再起動まで解消しません。
RDS のマルチ AZ DB インスタンスのフェイルオーバーの要点です。
・スタンバイは別の AZ に同期レプリケーションで置かれ、読み取りは受けません。
・フェイルオーバーは通常 60〜120 秒で、DB インスタンスの DNS レコードがスタンバイを指すように書き換わります。エンドポイントの名前は変わりません。
・既存の接続は張り直しが必要です。JVM は名前解決の結果をキャッシュするので、公式ドキュメントは TTL を 60 秒以下にするよう推奨しています。