PostgreSQL のDBに接続できない (pg.InternalError)
概要
- コンテナでエラーメッセージ “pg.InternalError: connection to server" が発生し、DBの接続に失敗しました。
- CloudWatch Logs にてログを確認した結果、以下のログが記録されておりました。
- FATAL: remaining connection slots are reserved for non-replication superuser and rds_superuser connections
- どうやら、PostgreSQL のDB同時接続数 (max_connections) の上限を超過したと思われます。
- MySQL の場合は、Too Many Connections のログが記録されます。
なぜDB同時接続数が上限を超えるか?
- DB はワークロードの増加や、テーブル/行レベルのロックが原因となって接続数が増加します。また、クライアントからの接続が適切に切断されず、時間の経過と共に接続数が増加する場合もあります。
対処方法
インスタンスタイプを変更する
- DB同時接続数の上限を解消するには、いくつかの方法があります。1つは、RDS のインスタンスクラスを変更することです。
- RDS の max_connections のデフォルト値は、RDS で使用されるインスタンスクラスによって異なります。
- DB同時接続数のMax値 は、以下の計算で求められます。
- PostgreSQL の場合
-
max_connections = DBInstanceClassMemory/12582880
-
- MySQL の場合
-
max_connections = LEAST({DBInstanceClassMemory/9531392}, 5000)
-
RDS Proxyを使用する
- RDS Proxy経由でRDS に接続する構成では、接続プーリングによって、コネクションが再利用され同時接続数を抑えることが出来ます。
- Amazon RDS Proxy 概要は、こちらを参照。
DatabaseConnectionsメトリクス
- DB接続数は、CloudWatch のメトリクス DatabaseConnections でも確認が可能です。