AWS announces preview of AWS Interconnect - multicloud
AWS announces AWS Interconnect – multicloud (preview), providing simple, resilient, high-speed private connections to other cloud service providers. AWS Interconnect - multicloud is easy to configure and provides high-speed, resilient connectivity with dedicated bandwidth, enabling customers to interconnect AWS networking services such as AWS Transit Gateway, AWS Cloud WAN, and Amazon VPC to other cloud service providers with ease.
為什麼在連線至我的 Amazon RDS for PostgreSQL 時,即使沒有達到最大連線限制,仍出現錯誤 "FATAL: remaining connection slots are reserved for non replicate superuser connections" (致命:其餘連線插槽已保留給非複寫的超級使用者連線)?
在連線至我的 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() 命令終止閒置連線。
相關內容
- 已提問 1 年前
- 已提問 2 年前
