astronomerinc/ap-pgbouncer本镜像是为 Astronomer Platform 中 Airflow 部署提供的 PgBouncer 服务容器化实现。PgBouncer 是一款轻量级的 PostgreSQL 连接池工具,通过集中管理数据库连接、实现连接复用,降低数据库连接创建/销毁的开销,优化资源利用率。
SHOW POOLS、SHOW CLIENTS)RELOAD 命令或信号(SIGHUP)动态加载配置变更,无需重启服务bashdocker run -d \ --name airflow-pgbouncer \ -p 6432:6432 \ # PgBouncer 默认端口 -e POSTGRES_HOST=postgres \ -e POSTGRES_PORT=5432 \ -e POSTGRES_DB=airflow \ -e POSTGRES_USER=airflow \ -e POSTGRES_PASSWORD=airflow_password \ -e POOL_MODE=transaction \ # 事务池模式(适合 Airflow 短事务) -e MAX_CONNECTIONS=100 \ # PgBouncer 全局最大连接数 -e DEFAULT_POOL_SIZE=20 \ # 每个数据库池默认连接数 astronomer/pgbouncer:latest
yamlversion: '3.8' services: pgbouncer: image: astronomer/pgbouncer:latest ports: - "6432:6432" environment: # 数据库连接配置 POSTGRES_HOST: postgres POSTGRES_PORT: 5432 POSTGRES_DB: airflow POSTGRES_USER: airflow POSTGRES_PASSWORD: ${AIRFLOW_DB_PASSWORD} # 池配置 POOL_MODE: transaction MAX_CONNECTIONS: 150 DEFAULT_POOL_SIZE: 25 RESERVE_POOL_SIZE: 5 # 池耗尽时可临时扩容的连接数 RESERVE_POOL_TIMEOUT: 5 # 临时连接的超时时间(秒) # 连接超时配置 IDLE_TIMEOUT: 300 # 空闲连接超时(秒) SERVER_LIFETIME: 3600 # 连接最大存活时间(秒) volumes: - ./pgbouncer.ini:/etc/pgbouncer/pgbouncer.ini # 自定义配置文件挂载(可选) - ./users.txt:/etc/pgbouncer/users.txt # 认证用户文件(可选,优先级高于环境变量) depends_on: - postgres restart: unless-stopped postgres: image: postgres:14 environment: POSTGRES_DB: airflow POSTGRES_USER: airflow POSTGRES_PASSWORD: ${AIRFLOW_DB_PASSWORD} volumes: - postgres-db-volume:/var/lib/postgresql/data volumes: postgres-db-volume:
PgBouncer 核心配置文件为 pgbouncer.ini,以下为 Airflow 场景常用配置项:
ini[databases] # 数据库连接配置(格式:<池名称> = host=<postgres_host> port=<port> dbname=<db> user=<user> password=<pass>) airflow_meta = host=postgres port=5432 dbname=airflow user=airflow password=airflow_password [pgbouncer] # 池配置 pool_mode = transaction # 连接池模式:session/transaction/statement max_connections = 100 # 全局最大连接数(建议小于 PostgreSQL max_connections) default_pool_size = 20 # 每个数据库池默认连接数 reserve_pool_size = 5 # 池耗尽时的临时扩容连接数 reserve_pool_timeout = 5 # 临时连接等待超时(秒) # 连接超时 idle_timeout = 300 # 空闲连接超时(秒,超时后释放) server_lifetime = 3600 # 连接最大存活时间(秒,防止连接长期占用) server_idle_timeout = 600 # 数据库端空闲超时(需与 PostgreSQL 配置匹配) # 网络配置 listen_addr = 0.0.0.0 # 监听地址(容器内需监听所有接口) listen_port = 6432 # 监听端口 unix_socket_dir = /tmp # Unix 套接字目录(可选) # 认证配置 auth_type = md5 # 认证方式:md5/scram-sha-256/trust auth_file = /etc/pgbouncer/users.txt # 用户认证文件路径 auth_hba_file = /etc/pgbouncer/pg_hba.conf # HBA 配置文件(可选,优先级高于 auth_file) # 日志配置 log_level = info # 日志级别:debug/info/warn/error log_connections = 1 # 记录客户端连接日志 log_disconnections = 1 # 记录客户端断开日志 log_pooler_errors = 1 # 记录池操作错误
容器化部署时,可通过环境变量覆盖默认配置(优先级:环境变量 > 挂载的 pgbouncer.ini > 镜像内置配置):
| 环境变量名 | 描述 | 默认值 |
|---|---|---|
POSTGRES_HOST | PostgreSQL 数据库主机地址 | postgres |
POSTGRES_PORT | PostgreSQL 数据库端口 | 5432 |
POSTGRES_DB | Airflow 元数据库名称 | airflow |
POSTGRES_USER | 数据库访问用户名 | airflow |
POSTGRES_PASSWORD | 数据库访问密码 | - |
POOL_MODE | 连接池模式(session/transaction/statement) | transaction |
MAX_CONNECTIONS | 全局最大连接数 | 100 |
DEFAULT_POOL_SIZE | 每个数据库池默认连接数 | 20 |
RESERVE_POOL_SIZE | 池耗尽时临时扩容连接数 | 5 |
RESERVE_POOL_TIMEOUT | 临时连接超时时间(秒) | 5 |
IDLE_TIMEOUT | 空闲连接超时(秒) | 300 |
SERVER_LIFETIME | 连接最大存活时间(秒) | 3600 |
LOG_LEVEL | 日志级别(debug/info/warn/error) | info |
通过 psql 或 Airflow 数据库客户端连接 PgBouncer 监控接口(默认数据库名 pgbouncer):
bashpsql -h localhost -p 6432 -U pgbouncer pgbouncer
常用监控命令:
SHOW POOLS;:查看各数据库池状态(当前连接数、活跃数、等待数等)SHOW CLIENTS;:查看客户端连接详情SHOW SERVERS;:查看与 PostgreSQL 的后端连接详情SHOW STATS;:查看连接池统计信息(连接创建数、复用数、查询数等)修改配置文件后,通过以下方式重载配置(无需重启容器):
bash# 进入容器执行 docker exec -it airflow-pgbouncer pgbouncer -R /etc/pgbouncer/pgbouncer.ini # 或发送 SIGHUP 信号 docker kill -s SIGHUP airflow-pgbouncer
auth_type=trust,建议使用 scram-sha-256 认证,并通过 users.txt 或 pg_hba.conf 严格限制访问来源transaction 模式;若任务包含会话级临时表(如 CREATE TEMP TABLE),需使用 session 模式MAX_CONNECTIONS 需小于 PostgreSQL 实例的 max_connections(建议预留 20% 余量),DEFAULT_POOL_SIZE 根据 Airflow 并发任务数调整(如每 10 个并发任务分配 1-2 个连接)
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务