【问题标题】:intermittent "connection reset by peer" sql postgres间歇性“对等连接重置”sql postgres
【发布时间】:2018-10-24 14:05:32
【问题描述】:

在一段时间不活动后,我的 go web 服务在执行第一个 postgres sql 查询时收到带有消息 read tcp x.x.x.x:52086->x.x.x.x:24414: read: connection reset by peernet.OpError。报错之后,后续的请求就可以正常工作了。

postgres 数据库由 compose.com 托管,它在 postgres 数据库前面有 haproxy。我的 Go Web 应用程序使用标准 sql 和 sqlx。

我尝试过每 15 分钟运行一次调用 db.Ping() 的代码,但这并没有解决问题。

为什么 go 标准 sql lib 不处理这些连接丢失?

【问题讨论】:

  • 您希望在这里得到什么?如果连接被重置,您需要重新连接。
  • 我正在使用 go 标准库 sql.Open 用于处理连接池的东西,所以我不能简单地重新连接。同样正如我所提到的,在错误发生后,后续查询可以正常进行。为了清楚起见,我会更新问题。
  • 嗯,好的。这里的最后一段似乎暗示了相反的情况。 go-database-sql.org/errors.html
  • 猜测:与 haproxy 的连接仍然存在,但与后端的连接超时并且 haproxy 并没有关闭另一端。我在 redis 上看到过类似的问题。如果你不使用 haproxy 会发生什么?定期 ping 不会有太大帮助,因为无法保证任一池中的所有连接都会在超时之前看到一些流量。
  • 是的,我想我可能刚刚得出了类似的结论。我正在考虑设置db.SetConnMaxLifetime(time.Minute * 15),我认为应该清除死连接。

标签: postgresql go haproxy compose-db sqlx


【解决方案1】:

因为没有人写得这么明确。这个问题的解决方法是设置db.SetConnMaxLifetime(time.Minute)。我试过了,它有效。连接重置经常发生在 AWS 上,其中不活动限制设置为 350 秒,然后返回 TCP RST。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2011-01-11
    • 2012-07-12
    • 1970-01-01
    相关资源
    最近更新 更多