PostgreSQL のDBに接続できない (pg.InternalError)

12月 10, 2023AWS,Database,PostgreSQL,RDS

概要

  • コンテナでエラーメッセージ “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 でも確認が可能です。

 

参考資料