为什么 `psycopg2.connect(...)` 中的 `keepalives` 参数需要 运行 长 运行ning postgres 查询 docker (ubuntu:18.04 )?

Why are the `keepalives` params in `psycopg2.connect(...)` required to run long running postgres queries in docker (ubuntu:18.04)?

我们刚刚过渡到使用 Docker 进行开发,并且正在使用 ubuntu:18.04 图像。我们注意到使用 psycopg2 的查询在几分钟后失败。 使用以下 keepalives 参数解决了问题:

self.db = pg.connect(
    dbname=config.db_name,
    user=config.db_user,
    password=config.db_password,
    host=config.db_host,
    port=config.db_port,
    keepalives=1,
    keepalives_idle=30,
    keepalives_interval=10,
    keepalives_count=5
)

这对我们也有效,但是为什么 这有效? The psycopg2 docs do not give insight into what the params do, however, this third party documentation does, and this postgres 文档有。

问题是,docker 环境与需要这些非默认设置的主机环境有何不同?它们也可以在标准 Ubuntu 18.04 环境中工作,但不能在 docker 中工作。我希望我们可以重新配置我们的 docker 图像,以便首先不需要这些非标准参数。


Postgres 版本:PostgreSQL 13.4 (Ubuntu 13.4-1.pgdg20.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, 64-bit

psycopg2 版本:2.8.5

主持人OS:Windows10

Docker 图片 OS: Ubuntu 18:04

您可能正在使用 Docker 的覆盖网络功能(或负载均衡服务的入口网络),它基于 Linux IP 虚拟服务器 (IPVS),a.k.a.Linux 虚拟服务器.这对空闲 TCP 连接使用默认的 900 秒(15 分钟)超时。

参见:https://github.com/moby/moby/issues/31208

默认 Linux TCP Keep-Alive 设置仅在很久以后才开始发送数据包(如果启用的话),因此您可以选择:

  • 更改服务器或客户端上的 TCP Keep-Alive 设置
  • 更改 Docker 网络以直接使用主机网络
  • 更改您的软件以避免空闲的 TCP 连接,例如为数据库配置连接池以移除空闲连接或更频繁地检查健康状况
  • 更改内核 IPVS 默认值或 TCP 默认值