Open9
フェイルオーバー時のライターとリーダーが入れ替わった時のjdbc側の対応

コネクションプールを利用しながらフェイルオーバーした場合何に気をつける必要があるのか確認したい

Connectionとは
Connection オブジェクトは、データベースとの接続を表します。
接続セッションには、実行される SQL 文とその接続を介して返された結果が入ります。
1 つのアプリケーションが 1 つのデータベースとの 1 つ以上の接続を持つことも、多くの異なるデータベースとの接続を持つこともできます

Connection
コネクション取得
コネクションプールを利用下でのコネクション取得
コネクションプールを利用下でのコネクション取得

DNSキャッシュによるエラーの仕組み

AWS Aurora フェイルオーバー時の挙動
参考:https://dev.classmethod.jp/articles/how-amazon-aurora-failover-affect-downtime/
エラーになるタイミング
-
クラスターエンドポイントの更新
- 旧レプリカの再起動での疎通エラー(プライマリ昇格)
- 旧プライマリの再起動での疎通エラー(レプリカ降格)
- 旧プライマリのリーダーロールでの更新エラー
クラスターエンドポイントが新しいプライマリを向くように更新されると、クラスター・リーダーエンドポイントともに利用可能になります。
上記のようにクラスターエンドポイントとリーダーエンドポイントが一時的に1つのインスタンスを指すようになるためリーダーエンドポイントの更新時エラーはなくなる。

コネクションの接続確認を考慮しない場合のシーケンス図(※実際は自動的にされている)

コネクションの接続確認を考慮しない場合のシーケンス図2(※実際は自動的にされている)

コネクションの接続確認を考慮しない場合のシーケンス図3(※実際は自動的にされている)

isValidメソッドとconnectionTestQuery
コネクションが有効/無効の判定処理を以下のタイミングで行っている
- プールからDB接続が貸し出される直前(idleTimeoutが設定されている場合)。
- 定期的な接続検証が有効になっている場合(validationTimeoutが設定されている場合)。
JDBC4からconnectionTestQuery
を設定することは非推奨になっている。
理由はConnection.isValid()
メソッドの存在によるもので、このメソッドはデータベース接続が有効かどうかを確認するようなものです。
また、ConntectionTestQuery
というカスタムのテストクエリ approach は、異なるデータベース製品に対応するためのクエリを提供するための作業が増え、非効率的であったため、この汎用的なメソッドの採用が進みました。
connectionTestQuery
を使って、Auroraのライター/リーダーを判定すれば、使わなかった時と比べてクエリを実行する前にコネクションを貸し出されるタイミングまたは、定期的な接続検証時に消すことができるメリットがある。
ただし、keepaliveTime
も同時に設定しないと定期的な接続検証されないので注意