為什麼在連線至我的 Amazon RDS for PostgreSQL 時,即使沒有達到最大連線限制,仍出現錯誤 "FATAL: remaining connection slots are reserved for non replicate superuser connections" (致命:其餘連線插槽已保留給非複寫的超級使用者連線)?

2 分的閱讀內容
0

在連線至我的 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 時,即使沒有達到最大連線限制,仍出現錯誤 "FATAL: remaining connection slots are reserved for non replicate superuser connections" (致命:其餘連線插槽已保留給非複寫的超級使用者連線)。

簡短描述

在 Amazon RDS for PostgreSQL 中,與非超級使用者的實際可用連線數目上限計算方式如下:

max_connections - superuser_reserved_connections - rds.rds_superuser_reserved_connections.

superuser_reserved_connections 的預設值為 3,而 rds.rds_superuser_reserved_connections 的預設值為 2。

例如,如果您將 max_connections 的值設定為 100,則非超級使用者的實際可用連線數計算如下:

100 - 3 - 2 = 95。

Amazon CloudWatch 指標 DatabaseConnections 指示了在作業系統層級資料庫執行個體的用戶端網路連線數目。此指標的計算方式為測量連接埠 5432 上執行個體的實際 TCP 連線數目。由於指標值不包含下列項目,因此資料庫工作階段的數目可能會高於此指標值:

  • 不再具有網路連線但資料庫未清除的後端處理程序。(例如:由於網路問題,連線終止,但資料庫在嘗試將輸出傳回給用戶端之前不會知道。)
  • 資料庫引擎任務排程器建立的後端程序。(例如:pg_cron)
  • Amazon RDS 連線。

您可能會收到此錯誤,因為連線至 RDS for PostgreSQL 執行個體的應用程式突然建立並中斷連線。這可能會導致後端連線仍然開啟一段時間。此情況可能會使 pg_stat_activity 檢視的值與 CloudWatch 指標 DatabaseConnections 的值之間存在差異。

解決方案

對此錯誤進行疑難排解

若要對此錯誤進行疑難排解,請執行下列檢查:

  • 檢閱 CloudWatch metric DatabaseConnections。
  • 使用效能洞察檢視 numbackends 計數器指標。此值提供發生錯誤時的連線數目資訊。如果您未開啟效能洞察,請以主要使用者身分登入執行個體。然後,執行下列查詢來檢視後端的數目:
SELECT count(*) FROM pg_stat_activity;

如果您發現一些可終止的閒置連線,則可使用 pg_terminate_backend() 函數終止這些後端。您可以執行下列查詢,以檢視要終止的所有閒置連線。此查詢顯示下列其中一種狀態超過 15 分鐘的後端程序相關資訊:「閒置」、「交易閒置」、「交易閒置 (已中止)」和「已停用」。

SELECT * FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled')
AND state_change < current_timestamp - INTERVAL '15' MINUTE;

**注意:**請務必根據您的使用案例更新查詢。

確定所有需要終止的後端程序後,執行下列查詢以終止這些程序。

**注意:**在前面提及的其中一種狀態超過 15 分鐘時,此範例查詢會終止所有後端程序。

SELECT pg_terminate_backend(pid) FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled')
AND state_change < current_timestamp - INTERVAL '15' MINUTE
AND usename != 'rdsadmin';

若要終止所有閒置的後端程序,請執行下列查詢:

SELECT pg_terminate_backend(pid) FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled')
AND usename != 'rdsadmin';

**注意:**您無法終止使用 rdsadmin 建立的後端程序。因此,您必須將其排除在終止之外。

**重要:**如果您無法以 rds_superuser 權限連線至 RDS for PostgreSQL 執行個體,請考慮正常關閉應用程式,以釋放部分連線。

管理資料庫連線數目

使用連線集區

在大多數情況下,您可以使用連線集區管理程式 (如 RDS Proxy 或任何第三方連線集區管理程式),來管理任何指定時間開啟的連線數目。例如,如果您將 RDS for PostgreSQL 執行個體的 max_connections 值設定為 500,則可透過設定最多 400 個連線的連線集區管理程式,來避免 max_connection 相關錯誤。

增加 max_connections 值

您可以根據您的使用案例,考慮增加 max_connections 的值。然而,根據資料庫執行個體的工作負載和執行個體類別,為 max_connections 設定非常高的值可能會導致記憶體問題。

**注意:**如果增加 max_connections 的值,則必須重新啟動執行個體,變更才會生效。

終止閒置連線

您可以將 idle_in_transaction_session_timeout 參數設定為適合您的使用案例的值。若在開啟交易中閒置超過此參數中指定的時間,則工作階段會終止。例如,如果您將此參數設定為 10 分鐘,則交易閒置超過 10 分鐘的任何查詢都會終止。此參數有助於管理停留在此特定狀態的連線。

對於 PostgreSQL 14 版及更新版本,您可以使用 idle_session_timeout 參數。設定此參數後,閒置超過指定時間但不屬於開啟交易的任何工作階段都會終止。

對於 PostgreSQL 14 版及更新版本,您可以使用 client_connection_check_interval 參數。使用此參數,您可以設定執行查詢時,用戶端連線選用檢查間的時間間隔。輪詢通訊端以執行檢查。如果核心報告連線已關閉,此檢查可讓長時間執行的查詢更快結束。此參數有助於 PostgreSQL 不知道與後端程序中斷連線的情況。

增加 rds.rds_superuser_reserved_connections 值

您可以考慮增加 rds.rds_superuser_reserved_connections 參數的值。此參數的預設值設定為 2。增加此參數的值,允許連接 rds_superuser 角色的使用者的更多連線。透過此角色,使用者可執行管理任務,如使用 pg_terminate_backend() 命令終止閒置連線。


AWS 官方
AWS 官方已更新 2 年前