本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
PostgreSQL 中的無效連線處理
即使用戶端應用程式異常捨棄或終止,資料庫工作階段仍會在伺服器上保持作用中時,會發生無效連線。當用戶端在未正確關閉資料庫連線或取消持續請求的情況下,意外當機或終止時,通常會發生這種情況。
PostgreSQL 可有效識別和清除無效連線。不過,對於閒置、等待用戶端輸入或主動執行查詢的工作階段而言,偵測具有挑戰性。為了處理這些案例,PostgreSQL 提供 tcp_keepalives_*
、 tcp_user_timeout
和 client_connection_check_interval
參數。
了解 TCP 保持連線
TCP Keepalive 是一種通訊協定層級機制,可協助維護和驗證連線完整性。每個 TCP 連線都會維護控制保持連線行為的核心層級設定。當保持連線計時器過期時,系統會執行下列動作:
-
傳送未設定資料和 ACK 旗標的探查封包。
-
根據 TCP/IP 規格,預期來自遠端端點的回應。
-
根據回應或缺乏回應來管理連線狀態。
Aurora PostgreSQL 中的金鑰 TCP 保持連線參數
參數 | 描述 | 預設值 |
---|---|---|
tcp_keepalives_idle |
Specifies number of seconds of inactivity before sending keepalive message. | 300 |
tcp_keepalives_interval |
Specifies number of seconds between retransmissions of unacknowledged keepalive messages. | 30 |
tcp_keepalives_count |
Maximum lost keepalive messages before declaring connection dead | 2 |
tcp_user_timeout |
Specifies how long (in Milliseconds) unacknowledged data can remain before forcibly closing the connection. | 0 |
client_connection_check_interval |
Sets the interval (in Milliseconds) for checking client connection status during long-running queries. This ensures quicker detection of closed connections. | 0 |
TCP 保持連線設定的使用案例
保持閒置工作階段持續運作
若要防止防火牆或路由器因閒置而終止閒置連線:
-
設定
tcp_keepalives_idle
以定期傳送保持連線封包。
偵測無效連線
若要立即偵測無效連線:
-
調整
tcp_keepalives_idle
、tcp_keepalives_interval
和tcp_keepalives_count
。例如,使用 Aurora PostgreSQL 預設時,偵測無效連線大約需要一分鐘 (2 個探查 × 30 秒)。降低這些值可以加快偵測速度。 -
使用
tcp_user_timeout
指定確認的最大等待時間。
TCP 保持連線設定可協助核心偵測無效連線,但在使用通訊端之前,PostgreSQL 可能不會運作。如果工作階段執行長查詢,只有在查詢完成後才會偵測到無效連線。在 PostgreSQL 14 和更高版本中, client_connection_check_interval
可以在查詢執行期間定期輪詢通訊端,以加速無效連線偵測。
最佳實務
-
設定合理的保持連線間隔:調校
tcp_user_timeout
、tcp_keepalives_idle
tcp_keepalives_count
和tcp_keepalives_interval
,以平衡偵測速度和資源使用。 -
為您的環境最佳化:使設定與網路行為、防火牆政策和工作階段需求保持一致。
-
利用 PostgreSQL 功能:在 PostgreSQL 14 和更高版本
client_connection_check_interval
中使用 ,以實現高效的連線檢查。