在多服务器环境中,如果站点的不活动超过15分钟,则服务器将失去与PostgreSQL数据库的连接

如果我的暂存(2台服务器)或生产(4台服务器)服务器在大约15分钟内没有活动,我在airbrake中会出现以下错误。 以下是错误消息:

ActiveRecord :: StatementInvalid:PG ::错误:无法从服务器接收数据:连接超时

要么

PG ::错误:无法连接到服务器:连接超时服务器是否在主机“tci-db4.dev.prod”上运行并接受端口5432上的TCP / IP连接?

我正在使用PostgreSQL作为我的数据库。 其中一个服务器也充当数据库服务器。

环境:

Ruby 1.9.3 (这也发生在Ruby 1.8.7下,但是自升级以来更糟,因为服务器上的ruby进程将达到100%并保持100%直到服务器丢失数据库连接时被杀死。

Rails 3.1.6

PG GEM 0.13.2

Postgres 9.1

Phusion Passenger

这个问题已经发生了一年多,所以我希望有人对如何解决这个问题有一些了解。 谢谢。

检查应用程序服务器和数据库服务器之间的所有路由器/交换机上的TCP / IP套接字超时设置。 同时打开数据库端的日志记录并观察连接的整个生命周期,并将时间与应用程序中的错误进行比较。 我建议在postgresql.conf中打开以下设置,直到你知道要查找的内容:

log_connections = on log_disconnections = on log_statement = all 

这些可以使用postgres进程的SIGHUP激活(或者作为数据库超级用户运行“SELECT pg_reload_conf();”。

我会说你有一个“远程主机关闭的连接”或类似于记录实际断开连接之前的最后一条消息。

我之前见过这个,它是导致它的中间开关的超时设置。

您可能在客户端和服务器之间有NAT路由器,连接跟踪防火墙或高速“第3层交换机”。 这些设备在超时后刷新其表中的记忆连接。 您需要启用Keepalive 。

从4个应用程序服务器维护大量的keepalived连接可能很难(它可能代表了很多连接。你可以检查PgPool-II以保持pgpool和你的postgres服务器之间合理数量的keepalived连接.pgPool将当过多的进程要求连接时,也会排队连接。之后检查应用程序中的连接是如何管理的。应用服务器中是否有管理连接池?你还需要它吗?你需要长时间吗?站立连接或者您可以简单地使用短会话连接吗?

如果您仍然在PgPool和postgreSQl服务器之间断开会话,则必须检查TCP / IP问题。 此类问题可能来自OS TCP / IP设置,但也可以在postgreSQl配置中进行调整。 检查该运行时配置手册页上的tcp_keepalive设置 。 如果您使用pgpool,请检查health_check设置。