1

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

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

或者

PG::Error: could not connect to server: Connection timed out 服务器是否在主机“tci-db4.dev.prod”上运行并接受端口 5432 上的 TCP/IP 连接?

我使用 PostgreSQL 作为我的数据库。其中一台服务器还充当数据库服务器。

环境:

Ruby 1.9.3(这也发生在 Ruby 1.8.7 下,但升级后情况更糟,因为服务器上的 ruby​​ 进程将达到 100% 并保持在 100%,直到服务器失去数据库连接时被终止。

导轨 3.1.6

PG 创业板 0.13.2

Postgres 9.1

Phusion乘客

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

4

3 回答 3

3

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

log_connections = on
log_disconnections = on
log_statement = all

这些可以通过 postgres 进程的 SIGHUP 激活(或以数据库超级用户身份运行“SELECT pg_reload_conf();”。

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

我以前见过这种情况,这是中间交换机上的超时设置导致的。

于 2012-07-12T19:46:42.030 回答
3

您可能在客户端和服务器之间有一个 NAT 路由器、连接跟踪防火墙或一个傲慢的“第 3 层交换机”。这些设备在超时后从它们的表中清除记住的连接。您将需要启用 keepalives

于 2012-07-17T00:02:59.147 回答
3

维护来自 4 个应用程序服务器的大量 keepalived 连接可能很难做到(它可能代表非常多的连接。您可以检查PgPool-II以在 pgpool 和您的 postgres 服务器之间保持合理数量的 keepalived 连接。pgPool 将当有太多进程请求连接时,还要排队连接。然后检查在您的应用程序中如何管理连接。在应用服务器中是否管理连接池?您还需要它吗?您是否需要 long-长期连接还是可以简单地使用短会话连接?

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

于 2012-07-18T07:25:12.923 回答