Airflow客户端偶发无法连接Pgbouncer问题排查求助
问题:Kubernetes中Airflow Worker/Scheduler偶发连接Pgbouncer失败
在Kubernetes环境部署的Airflow中,Worker与Scheduler偶发出现连接Pgbouncer失败的问题。无论使用外部PostgreSQL服务器(如Azure PostgreSQL)还是Airflow Helm Chart自带的Bitnami PostgreSQL,该问题均存在。经排查,Pgbouncer与PostgreSQL之间无连接中断,问题仅出在Airflow Pod连接Pgbouncer环节。
报错信息
DAG执行报错
((psycopg2.OperationalError) connection to server at "airflow-pgbouncer.airflow.svc.cluster.local" (172.xx.xx.xx), port 6543 failed: Connection refused Is the server running on that host and accepting TCP/IP connections?
Pgbouncer关联日志
closing because: client unexpected eof (age=132s)
当前Pgbouncer配置
[databases] airflow = host=xxxxxxxxxxxxxxxxxxxxx.postgres.database.azure.com dbname=airflow port=5432 pool_size=200 [pgbouncer] pool_mode = transaction listen_port = 6543 listen_addr = * auth_type = md5 auth_file = /etc/pgbouncer/users.txt stats_users = airflow_user ignore_startup_parameters = extra_float_digits max_client_conn = 2000 verbose = 0 log_disconnections = 1 log_connections = 1 admin_users = airflow_user server_tls_sslmode = prefer server_tls_ciphers = normal log_stats = 0 log_pooler_errors = 1 server_idle_timeout = 300 server_connect_timeout = 15
可能的问题原因及修复建议
1. 客户端连接数耗尽
- 原因:当前
max_client_conn=2000,Airflow Worker+Scheduler的并发连接请求可能短时间内超出阈值,同时未配置client_idle_timeout,闲置客户端连接无法自动回收,持续占用连接资源。 - 修复建议:
- 调高
max_client_conn至合理值(如4000,根据集群实际并发规模调整); - 添加
client_idle_timeout=300,让闲置300秒的客户端连接自动关闭; - 检查Airflow的Worker并发数配置,避免超出Pgbouncer的承载上限。
- 调高
2. Kubernetes网络层面连接中断
- 原因:Kubernetes Service的流量转发可能偶发数据包丢失或连接超时,导致Airflow Pod与Pgbouncer的连接被意外中断,触发"client unexpected eof"。
- 修复建议:
- 为Pgbouncer的Service配置
sessionAffinity: ClientIP,确保同一客户端的请求始终转发至同一个Pgbouncer Pod; - 排查Kubernetes集群CNI插件的日志,确认是否存在网络波动或异常;
- 在Airflow的数据库连接配置中添加重试机制,例如设置
connect_timeout=10和retry_limit=3(具体参数根据Airflow使用的数据库连接库调整)。
- 为Pgbouncer的Service配置
3. 客户端侧超时配置缺失
- 原因:仅配置了服务器端的
server_idle_timeout,未设置客户端连接超时参数,导致Pgbouncer主动关闭闲置的Airflow客户端连接后,Airflow进程未感知,再次使用该连接时触发连接拒绝。 - 修复建议:
- 添加
client_login_timeout=60,设置客户端登录超时时间; - 若无需严格SSL验证,添加
client_ssl_verify_depth=0,避免SSL握手超时问题; - 在Airflow配置中开启数据库连接池健康检查,如SQLAlchemy的
pool_pre_ping=True,确保连接可用后再使用。
- 添加
4. Pgbouncer Pod资源不足
- 原因:Pgbouncer Pod的CPU、内存资源受限,高并发场景下进程卡顿,无法及时处理新连接请求。
- 修复建议:
- 为Pgbouncer Pod设置合理的资源请求与限制,例如:
resources: requests: cpu: 200m memory: 256Mi limits: cpu: 500m memory: 512Mi - 将
log_stats=1开启,定期监控连接数、服务器负载等指标,排查资源瓶颈。
- 为Pgbouncer Pod设置合理的资源请求与限制,例如:
内容的提问来源于stack exchange,提问作者Bala Murali
相关产品推荐
相关产品推荐

