Heroku “psql: FATAL: 剩余的连接槽是为非复制超级用户连接保留的”

Posted

技术标签:

【中文标题】Heroku “psql: FATAL: 剩余的连接槽是为非复制超级用户连接保留的”【英文标题】:Heroku "psql: FATAL: remaining connection slots are reserved for non-replication superuser connections" 【发布时间】:2012-08-04 12:54:02 【问题描述】:

我正在使用 Postgresql 后端在 Heroku 上开发应用程序。在尝试从 CLI 和在服务器上加载页面时,我会定期收到此错误消息:

psql: FATAL: remaining connection slots are reserved for non-replication superuser connections

有人以前见过这个吗,或者请帮我指出正确的方向?

【问题讨论】:

遇到同样的问题。我在某处读到 Heroku 支持在某些服务器上“检测到了一些问题”,他们建议有问题的用户配置一个新的 Basic 数据库并使用 pgbackups 迁移到它。我现在的问题是该应用程序太新了,以至于我还没有创建备份,而且我在尝试创建一个时遇到了同样的错误:D 作为记录,尽管出现此错误,我还是能够使用 heroku pgbackups 命令创建备份。 要重现此问题,您可以创建大量终端。 .bat Windows 中的脚本:for /l %%x in (1, 1, 100) do ( start psql ) 其中 100 是所需的后端数量。 我遇到了同样的问题。我无法使用pg:backups copypg:backups capture、通过在我自己的计算机上从pgAdmin 连接到它,或者我能想象的任何其他方式将数据传输到新数据库。即使pg:killall 也无济于事。一小时后,我再次尝试,连接数为 50-50,因此经过几次尝试,我成功获得了 pg:backups copy,并且我的应用程序重新启动。这……不是一个有趣的日子。如果您在 Google 上搜索过,请喝一杯水。 我现在又遇到了。多么幸运地记录了我以前的经历......编辑:这次重新启动就足够了。 【参考方案1】:

您要么需要增加max_connections 配置设置,要么(可能更好)use connection pooling 以通过较小的连接池路由大量用户请求。

https://wiki.postgresql.org/wiki/Number_Of_Database_Connections

【讨论】:

另外一个常见问题是客户端应用程序崩溃并保持连接打开,然后在重新启动时打开新连接。如果这种事情经常发生,那么您将用完连接。或者应用只是配置不当,打开的连接太多。 我认为我无法更改 Heroku 上的配置设置。有没有办法关闭所有打开的连接? 希望服务器在相当激进的基础上配置为保持活动数据包。如果连接突然中断,这将导致会话在合理的时间内终止。如果没有配置,如果您可以作为数据库超级用户登录,您可以识别会话的pid 值并使用pg_terminate_backend() 函数来杀死它们。为避免此问题,请务必正确关闭连接,而不是突然关闭客户端。 @nathancahill 终止与数据库的所有连接:heroku pg:killall【参考方案2】:

当我忘记关闭连接时发生此异常

【讨论】:

【参考方案3】:

见Heroku “psql: FATAL: remaining connection slots are reserved for non-replication superuser connections”:

Heroku 有时会出现数据库负载平衡问题。

André Laszlomarkshiz 和我都报告说在 cmets 中处理过这个问题。

为了节省您的支持电话,以下是我从 Heroku 支持部门收到的针对类似问题的回复:

你好,

爱好层数据库的限制之一是突击维护。许多爱好数据库在单个共享服务器上运行,我们偶尔需要重新启动该服务器以进行硬件维护,或者将数据库迁移到另一台服务器以进行负载平衡。发生这种情况时,您会在日志中看到错误或连接出现问题。如果服务器正在重新启动,则数据库可能需要 15 分钟或更长时间才能重新联机。

大多数维护连接池的应用程序(如 Rails 中的 ActiveRecord)都可以打开与数据库的新连接。但是,在某些情况下,应用程序将无法重新连接。如果发生这种情况,您可以 heroku 重新启动您的应用程序以使其重新联机。

这是我们建议不要为关键生产应用程序运行爱好数据库的原因之一。标准和高级数据库包括停机事件通知,并且总体上性能更高且更稳定。您可以使用 pg:copy 迁移到标准或高级计划。

如果这种情况继续,您可以尝试使用 heroku addons:add 配置一个新数据库(在不同的服务器上),然后使用 pg:copy 移动数据。请记住,爱好等级规则适用于 9 美元的基本计划以及免费数据库。

谢谢, 布拉德利

【讨论】:

我想知道当您使用每月 50 美元的数据库计划时,预设响应是什么? 只有爱好层使用共享数据库服务器。使用每月 50 美元的计划,您将拥有自己的服务器,因此,如果您遇到此问题,则由您自己的应用程序创建它。每月 50 美元的计划为您提供更多管理选项,因此更容易诊断和修复。 您能解释一下标准选项可以提供哪些管理选项吗?只有 200 个连接时也会收到此消息。【参考方案4】:

我实际上尝试使用以下方法在 django 端实现连接池:

https://github.com/gmcguire/django-db-pool

但我仍然收到此错误,尽管将可用连接数降低到低于 20 个打开连接的标准开发数据库配额。

这里有一篇文章介绍了如何将您的 postgresql 数据库迁移到 Amazon RDS 的免费/廉价层。这将允许您将max_connections 设置得更高。这也将允许您使用 PGBouncer 在数据库级别池连接。

https://www.lewagon.com/blog/how-to-migrate-heroku-postgres-database-to-amazon-rds

更新:

Heroku 回复了我的未解决问题,并表示我的数据库在他们的网络中的负载平衡不正确。他们说,改进他们的系统应该可以防止将来出现类似的问题。尽管如此,支持手动重定位我的数据库并且性能显着提高。

【讨论】:

我认为移动数据库是完全控制它的最佳解决方案。感谢那篇文章。【参考方案5】:

在 Linux 中重现同样的问题:

for i in 1..300; do
     PGPASSWORD=MY_PASSWORD gnome-terminal -e  $'/usr/bin/psql -h \'127.0.0.1\' -p 5432 -U MY_USERNAME' 
done

在 dotnet 客户端中,您可以阅读:

  System.InvalidOperationException: An exception has been raised that is likely due to a transient failure.
   ---> Npgsql.PostgresException (0x80004005): 53300: sorry, too many clients already

【讨论】:

【参考方案6】:

我有很多空闲连接,所以我必须在创建新连接之前重用空闲连接,

【讨论】:

【参考方案7】:

错误消息表示应用已用完所有可用连接。

在aws中使用带有knex和typescript的postgres来做一些查询和更新工作时,当它完成390个数据库操作时会弹出问题,一个错误会阻止正常的knex.destroy()操作。错误信息是:

(node:66236) UnhandledPromiseRejectionWarning: 错误:剩余的连接槽是为非复制超级用户连接保留的

当 knex.destroy() 转到正确的位置时,错误就消失了。

【讨论】:

以上是关于Heroku “psql: FATAL: 剩余的连接槽是为非复制超级用户连接保留的”的主要内容,如果未能解决你的问题,请参考以下文章

heroku create ENOTFOUND: getaddrinfo ENOTFOUND api.heroku.com api.heroku.com:443

Heroku:“heroku ps:exec”和“heroku run bash”有啥区别?

如何将heroku cedar-14堆栈应用程序升级到最新的heroku堆栈(即,升级到heroku 18)

heroku 在构建脚本中失败,但 heroku 本地网络很好

Heroku - 为啥在向 Heroku 推送版本时会出现错误 R12(退出超时)?

heroku 上的应用程序错误无法更新 heroku 配置