在多服务器环境中,如果一个网站有超过15万闲置的服务器失去连接到PostgreSQL数据库(In a

2019-09-19 06:53发布

我收到以下错误,在空气制动,如果我的分期(2台服务器)或生产(4台服务器),服务器有大约15分钟没有任何活动。 下面是错误信息:

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

要么

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

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

环境:

红宝石1.9.3(这也红宝石1.8.7下发生的,但它是更糟,因为升级,因为在服务器上的红宝石过程将达到100%,并保持在100%,直到当服务器失去数据库连接被杀害。

Rails的3.1.6

PG SAVE 0.13.2

Postgres的9.1

乘客的Phusion

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

Answer 1:

检查所有路由器上的TCP / IP套接字超时设置/应用服务器和数据库服务器之间的切换。 还打开登录数据库端,看连接的整个生命周期,并比较在你的应用程序中的错误的时机。 我建议把以下设置postgresql.conf里面,直到你得到一个什么样寻找一个想法:

log_connections = on
log_disconnections = on
log_statement = all

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

我会是你或实际脱节登录前的最后消息类似的东西了“通过远程主机关闭连接”。

我以前见过这和它的中间交换机上是超时设置造成的。



Answer 2:

你可能有一个NAT路由器,连接跟踪的防火墙,或者在客户端和服务器之间的不知天高地厚的“第三层交换机”。 这些器件在超时后他们的桌子冲洗记得连接。 您将需要启用保持连接 。



Answer 3:

保持了很多从4个应用程序服务器的keepalived连接的可能是相当难做到(这可能是一种非常高的连接数。你可以检查PgPool-II到maitain pgpool和你的Postgres服务器之间的keepalived连接的reasonnable数。pgPool会也排队连接时过分过程要求的连接,之后检查连接是如何在你的应用程序管理。是否有应用服务器管理的连接池吗?你还需要吗?你有一个需要长期站在连接或可以单纯使用短会连接?

如果您还断开PgPool和你的PostgreSQL服务器之间的会话,你将不得不检查TCP / IP的问题。 这样的问题可能来自OS TCP / IP设置,但也可以在PostgreSQL的配置微调。 检查上TCP_KEEPALIVE设置 运行时配置手册页 。 如果你使用pgpool,检查health_check设置。



文章来源: In a multi-server environment, if a site has inactivity for more than 15 mn, the server loses connection to PostgreSQL database