PostgreSQL 中的無效連線處理 - Amazon Aurora

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

PostgreSQL 中的無效連線處理

即使用戶端應用程式異常捨棄或終止,資料庫工作階段仍會在伺服器上保持作用中時,會發生無效連線。當用戶端在未正確關閉資料庫連線或取消持續請求的情況下,意外當機或終止時,通常會發生這種情況。

PostgreSQL 可有效識別和清除無效連線。不過,對於閒置、等待用戶端輸入或主動執行查詢的工作階段而言,偵測具有挑戰性。為了處理這些案例,PostgreSQL 提供 tcp_keepalives_*tcp_user_timeoutclient_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_idletcp_keepalives_intervaltcp_keepalives_count。例如,使用 Aurora PostgreSQL 預設時,偵測無效連線大約需要一分鐘 (2 個探查 × 30 秒)。降低這些值可以加快偵測速度。

  • 使用 tcp_user_timeout指定確認的最大等待時間。

TCP 保持連線設定可協助核心偵測無效連線,但在使用通訊端之前,PostgreSQL 可能不會運作。如果工作階段執行長查詢,只有在查詢完成後才會偵測到無效連線。在 PostgreSQL 14 和更高版本中, client_connection_check_interval可以在查詢執行期間定期輪詢通訊端,以加速無效連線偵測。

最佳實務

  • 設定合理的保持連線間隔:調校 tcp_user_timeouttcp_keepalives_idletcp_keepalives_counttcp_keepalives_interval,以平衡偵測速度和資源使用。

  • 為您的環境最佳化:使設定與網路行為、防火牆政策和工作階段需求保持一致。

  • 利用 PostgreSQL 功能:在 PostgreSQL 14 和更高版本client_connection_check_interval中使用 ,以實現高效的連線檢查。