簡體   English   中英

在多服務器環境中,如果站點的閑置時間超過1500萬,則服務器將失去與PostgreSQL數據庫的連接

[英]In a multi-server environment, if a site has inactivity for more than 15 mn, the server loses connection to PostgreSQL database

如果我的登台服務器(2台服務器)或生產服務器(4台服務器)在約15分鍾內沒有活動,則在airbrake中收到以下錯誤。 這是錯誤消息:

ActiveRecord :: StatementInvalid:PG ::錯誤:無法從服務器接收數據:連接超時

要么

PG ::錯誤:無法連接到服務器:連接超時服務器是否在主機“ tci-db4.dev.prod”上運行並在端口5432上接受TCP / IP連接?

我正在使用PostgreSQL作為數據庫。 其中一台服務器還充當db服務器。

環境:

Ruby 1.9.3 (這在Ruby 1.8.7中也發生過,但是更糟糕的是由於升級,因為服務器上的ruby進程將達到100%並保持100%,直到服務器失去數據庫連接時被殺死。

Rails 3.1.6

PG GEM 0.13.2

Postgres 9.1

Phusion乘客

這個問題已經發生了一年多了,所以我希望有人對如何解決它有所了解。 謝謝。

在應用程序服務器和數據庫服務器之間的所有路由器/交換機上檢查TCP / IP套接字超時設置。 另外,打開數據庫端的日志記錄,觀察連接的整個生命周期,並將時間與應用程序中的錯誤進行比較。 我建議您在postgresql.conf中打開以下設置,直到您了解要查找的內容:

log_connections = on
log_disconnections = on
log_statement = all

這些可以通過postgres進程的SIGHUP激活(或以數據庫超級用戶身份運行“ SELECT pg_reload_conf();”)。

我將是您有一個“由遠程主機關閉的連接”或與實際記錄斷開連接前的最后一條消息類似的東西。

我以前見過,這是中間交換機上的超時設置導致的。

您可能在客戶端和服務器之間有一個NAT路由器,連接跟蹤防火牆或一個備用的“第3層交換機”。 這些設備在超時后會從其表中清除已記住的連接。 您將需要啟用keepalive

從4個應用程序服務器維護很多保持連接的連接可能非常困難(這可能表示大量連接。您可以檢查PgPool-II來保持pgpool和postgres服務器之間的保持連接的合理數量。pgPool將也可以在太多進程要求連接時對連接進行排隊。之后,檢查應用程序中的連接管理方式。應用服務器中是否有管理的連接池?您是否仍然需要它?固定連接還是您可以簡單地使用短會話連接?

如果您仍然斷開了PgPool與postgreSQl服務器之間的會話,則必須檢查TCP / IP問題。 此類問題可能來自操作系統的TCP / IP設置,但也可以在postgreSQl配置中進行調整。 在該運行時配置手冊頁上檢查tcp_keepalive設置 如果使用pgpool,請檢查health_check設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM