为什么要在docker(ubuntu:18.04)中运行长时间运行的postgres查询,必须使用`ological copg2.Connect(...)`中的`Keepalives`参数? [英] Why are the `keepalives` params in `psycopg2.connect(...)` required to run long running postgres queries in docker (ubuntu:18.04)?

查看:0
本文介绍了为什么要在docker(ubuntu:18.04)中运行长时间运行的postgres查询,必须使用`ological copg2.Connect(...)`中的`Keepalives`参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们刚刚过渡到使用Docker进行开发,正在使用ubuntu:18.04镜像。我们注意到,使用psycopg2的查询在几分钟后失败。This answer使用以下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不能深入了解参数的作用,但是,this third party文档和this postgres文档可以。

问题是,扩展坞环境与主机环境中的哪些不同使得这些非默认设置是必需的?它们也可以在标准的Ubuntu 18.04环境中运行,但不能在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

心理拷贝2版本:2.8.5

主机操作系统:Windows 10

Docker Image OS:Ubuntu 18:04

推荐答案

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

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

默认的Linux TCP保活设置只在很晚的时候才开始发送数据包(如果启用的话),因此您只有以下选项:

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

这篇关于为什么要在docker(ubuntu:18.04)中运行长时间运行的postgres查询,必须使用`ological copg2.Connect(...)`中的`Keepalives`参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆