修復 PSQLException:“致命:抱歉,已經有太多客戶端”
1. 概述
在本教學中,我們將討論 PostgreSQL 異常, FATAL: sorry, too many clients already
。通常,當 PostgreSQL 伺服器無法接受來自客戶端應用程式的連線請求時,它會拋出此錯誤。
我們將探討其原因、解決問題並了解一些預防指南。
2. 如何、何時、為何
資料庫伺服器以有限數量的連線啟動。有時連接已耗盡。因此,資料庫伺服器無法為新連線提供服務。這時它會拋出異常, FATAL: sorry, too many clients already
。
首先,讓我們了解這個問題如何、何時以及為何發生。假設有四個客戶端應用程式連接到 PostgreSQL 資料庫:
大多數情況下,應用程式在啟動期間實現連接池。假設資料庫管理員將 PostgreSQL 資料庫伺服器配置為最多 90 個連線。我們必須記住,資料庫保留一些連接供其內部使用。可供客戶端實際使用的連線更少。應用程式部署團隊為每個客戶端應用程式配置連線池大小30
。
現在假設部署團隊從Client-1
開始按順序啟動客戶端應用程式。當Client-4
嘗試啟動時,客戶端應用程式Client-1
、 Client-2
和Client-3
已取得並阻止了 90 個連線。因此,當Client-4
向資料庫伺服器要求30
以上連線時,伺服器會拒絕該要求,並顯示錯誤FATAL: sorry, too many clients already
。
當開發人員嘗試使用psql 、 pgAdmin 、 DBeaver等資料庫管理工具連接到 PostgreSQL 伺服器時,也可能會發生該錯誤。畢竟,這些工具也會嘗試取得與資料庫的連接,如果連接不足,它們可能會失敗也面臨同樣的錯誤。
3. 如何排除故障
首先,我們首先透過在 PostgreSQL 資料庫中執行查詢來確定最大連接數:
show max_connections
預設情況下,它設定為 100,但它可以具有更高的值。我們可以透過修改資料庫伺服器中postgresql.conf
檔案中的PostgreSQL 運行時連接設定max_connections
來設定它:
/var/lib/postgresql/data # cat postgresql.conf | grep max_connections
max_connections = 100 # (change requires restart)
但是,我們應該先調查資料庫連線的高使用率,而不是將其設定為更高的值,以獲得永久解決方案。
當客戶端應用程式報告此類錯誤時,我們必須確定與資料庫伺服器的活動連線數。對於每個活動連接,資料庫伺服器中都會執行一個後端進程。 PostgreSQL 資料庫在pg_stat_activity
視圖中追蹤這些後端程序。我們可以對其執行 SQL 查詢來取得活動連線和空閒連線:
select pid, datname, application_name, client_addr, state
from pg_stat_activity
where state in ('idle', 'active')
讓我們看一下顯示連接詳細資訊的範例輸出:
讓我們了解輸出中各列的含義:
姓名 | 描述 |
---|---|
PID | 後端進程的進程id |
數據名 | 該後端連接的資料庫的名稱 |
應用程式名稱 | 連接到該後端的應用程式的名稱 |
客戶端位址 | 連接到該後端的客戶端的IP位址 |
狀態 | 該後端目前的總體狀態。可能的值為: |
-
active
:後端正在執行查詢 -
idle
:後端正在等待新的客戶端指令
|
發現活動連接和空閒連接後,我們可以識別無關緊要的連接,並停止或終止阻止它們的後端進程。此外,我們也可以使用pg_terminate_backend
系統管理函數強制終止資料庫中的會話:
select pg_terminate_backend(147)
資料庫函數pg_terminate_backend()
取得後端程序 ID 147
並終止它。
4. 如何預防
防止錯誤的主要步驟是準確地對應用程式進行基準測試,以評估其資料庫伺服器連線要求。經過基準測試後,我們可以調整和配置資料庫伺服器以滿足最大連接要求。然後,部署團隊可以在應用程式中設定最佳連線池大小。
此外,在啟用自動伸縮的環境中,我們應該謹慎地設定應用程式程序的連線池大小。當在 Kubernetes 叢集等環境中自動產生新進程時,資料庫中的連線大小可能不足以滿足更多連線請求。
開發人員應該在應用程式中設定適當的連線逾時並適當地關閉連線。因此,連線不會保持較長的持續時間,並返回到池或資料庫伺服器。
開發人員在完成工作後應勤勉地退出資料庫管理工具,如 pgAdmin、DBeaver 等。配置這些工具以在一段時間不活動後關閉連線和會話是一個很好的做法。
基礎設施和網路工程師應限制與資料庫伺服器的連線。此外,資料庫管理員可以設定資料庫來管理允許連接的來源 IP。
5. 結論
在本文中,我們討論了 PostgreSQL 錯誤FATAL: sorry, too many clients already
。
預防總是勝於治療,因此我們必須對應用程式進行基準測試以確定其資料庫連接要求。此外,我們必須將操作環境配置為僅允許與資料庫的必要連接,僅此而已。