はじめに
弊社で運用しているシステムで突然、データベースに接続できない現象が発生した。
システムの中核と言われるデータベースに接続できない=システムが使えない状況に陥りました。
調査したところ、データベースに再起動が走ったため、アプリケーションサーバで抱えていたコネクションプールが全滅したのが原因でした。全滅後も、特に再接続が行われず、復旧までの間システムに死亡フラグが立ってしまいました。コネクションプールの設定も、サイズまわりは変更したものの他の設定はデフォルトのままでした。
技術スタック
項目 | 名称 | バージョン |
---|---|---|
APサーバ | Payara Server | 4.1 |
言語 | Java | 8 |
DB | Amazon Aurora PostgreSQL | 9.6 |
現象
そもそもコネクションプールとは、コストがかかるDB接続を使いまわそうという仕組みです。
アプリサーバ起動時は次のような状態になってます。
接続な正常な場合、リクエスト時は以下のようになります。
今回はデータベースが再起動され、以下のような状態になりました。
この状態のまま、接続状態な異常のままコネクションプールに残り続け、アプリからは一切データベースに接続できなくなりました。
対応
対応としては、プール内にある接続を全て再接続させるようにすることです。
- 接続状態を検証
- プール内の接続を全て削除
- 再接続
今回修正したパラメータ
パラメータの設定値は、環境に応じて適宜変更してください。
パラメータ | 概要 | 設定値 |
---|---|---|
connection-creation-retry-attempts | 再接続リトライ回数 | 3 |
connection-creation-retry-interval-in-seconds | 再接続リトライインターバル | 10 |
is-connection-validation-required | 接続検証の有無 | true |
validate-atmost-once-period-in-seconds | 接続検証のインターバル | 1 |
fail-all-connections | 接続異常時に全てのプールを削除の有無 | true |