在多服务器环境中,如果站点的不活动超过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设置。
- rails postgres ERROR:类型为double precision的输入语法无效
- Rails:部署到Heroku,有很多问题
- Active Record Query中基于时间的优先级
- 未定义的方法auto_upgrade! 将Sinatra / DataMapper应用程序推送到Heroku时
- 如何调整在Heroku上运行的Ruby on Rails应用程序,它使用生产级Heroku Postgres?
- 处理用户发送的“字符串包含空字节”
- 在Hash中保存错误排序后的activerecord-postgres-hstore
- ruby迁移回滚但在再次运行迁移时出错
- Rails&Heroku:PG db无法创建数据库