psycopg2.OperationalError:服务器意外关闭了连接(AWS 中的气流,双方连接断开)

时间:2021-01-22 11:50:37

标签: python postgresql amazon-web-services airflow psycopg2

我们有一个在 AWS Fargate 中运行的 Airflow 实例。它连接到本地 Postgres 服务器(在 Windows 上)并尝试从(复杂的)视图加载数据。它为此使用了 PostgresHook。但是,DAG 中的任务在 Airflow 中失败并出现此错误:

  File "/usr/local/lib/python3.7/site-packages/airflow/hooks/dbapi_hook.py", line 120, in get_records
    cur.execute(sql)
psycopg2.OperationalError: server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.

不久前,错误发生在大约 10-15 分钟后。现在,它发生得更快,5 分钟后甚至更快。

我查看了 Postgres 日志,它显示(令人困惑)是客户端关闭了连接:

LOG:  could not send data to client: An existing connection was forcibly closed by the remote host.
FATAL:  connection to client lost

我已经尝试了很多潜在的解决方案。

无气流 在 Airflow 之外连接到服务器,直接使用 psycopg2:有效(使用复杂视图)。

不同的表 尝试从云中的 Airflow 加载不同表中的数据:有效,完成也很快。所以这个“超时”只是因为查询需要一段时间。

在本地运行 Airflow 容器 起初我可以重现这个问题,但我(认为我)通过在 postgres 连接字符串中添加一些额外的参数来解决它:keepalives=1&keepalives_idle=60&keepalives_interval=60。但是,我无法在云中的 Airflow 中重现此修复程序,因为当我在那里添加这些参数时,错误仍然存​​在。

增加超时时间 见上文,我添加了 keepalive,但我也试图推断其他潜在的超时。我在 DAG 参数中添加了超时 execution_timeout,但无济于事。我们还检查了网络超时,但考虑到连接失败的不规则模式,这听起来不像是一个硬超时......

我在这里不知所措。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

更新:我们已经通过一种变通方法解决了这个问题。我们没有在查询复杂视图时保持连接打开,而是将连接转换为异步连接(即 psycopg docs 中的 aconn = psycopg2.connect(database='test', async=1))。而且,我们把视图变成了物化视图,这样我们只通过异步连接调用一个REFRESH MATERIALIZED VIEW,然后我们可以稍后在物化视图上SELECT *,这非常快.