Tăng hiệu năng và ổn định cho Airflow với PgBouncer trên Kubernetes

Trong quá trình vận hành Apache Airflow trên Kubernetes ở môi trường production, một trong những vấn đề phổ biến nhất là quá tải kết nối database. Bài viết này chia sẻ cách sử dụng PgBouncer để giải quyết vấn đề đó và giúp hệ thống Airflow hoạt động ổn định, tiết kiệm tài nguyên hơn.
1. Tại sao cần PgBouncer?
Apache Airflow cần kết nối liên tục đến cơ sở dữ liệu metadata (thường là PostgreSQL) từ nhiều thành phần:
Scheduler
Webserver
Workers (hoặc Pod Executor / Kubernetes Executor)
Triggerer
CLI (khi người dùng tương tác)
Trên Kubernetes, mỗi worker hoặc pod có thể tạo kết nối riêng biệt đến PostgreSQL. Nếu số lượng pod lớn, có thể dẫn đến:
Connection Pool Exhaustion (hết kết nối đến DB)
Tăng độ trễ truy vấn
Crash DB do quá tải
PgBouncer là một lightweight connection pooler cho PostgreSQL, đóng vai trò làm “cầu nối” giữa Airflow và DB, giúp tái sử dụng kết nối thay vì tạo mới liên tục.
2. PgBouncer hoạt động thế nào?
PgBouncer tạo ra một pool kết nối cố định tới PostgreSQL, và quản lý các kết nối từ client (Airflow components) đến DB bằng các cơ chế như:
Session pooling: Giữ nguyên 1 kết nối cho đến khi client disconnect.
Transaction pooling: Thay kết nối sau mỗi transaction.
Statement pooling: Pooling ở cấp độ statement.
Trong Airflow, thường dùng transaction pooling để đảm bảo hiệu năng cao mà vẫn ổn định.
3. Kiến trúc triển khai trên Kubernetes
+------------------------+
| Airflow Components |
| (Web, Scheduler, etc) |
+----------+-------------+
|
| TCP (5432)
v
+---------------+
| PgBouncer |
| (Deployment) |
+-------+-------+
|
| TCP (5432)
v
+---------------+
| PostgreSQL DB |
+---------------+
PgBouncer được triển khai như một Deployment trong cùng namespace với Airflow, có thể được expose qua ClusterIP
service (ví dụ pgbouncer.airflow.svc.cluster.local:5432
).
4. Cấu hình thực tế
a. Cài đặt PgBouncer bằng Helm
Sử dụng chart chính thức:
bashCopyEdithelm repo add bitnami https://charts.bitnami.com/bitnami
helm install pgbouncer bitnami/pgbouncer \
--set postgresql.host=my-postgresql \
--set postgresql.username=airflow \
--set postgresql.password=airflowpass \
--set postgresql.database=airflow \
--set poolMode=transaction
b. Cấu hình Airflow sử dụng PgBouncer
Trong values.yaml
của Airflow:
yamlCopyEditconfig:
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflowpass@pgbouncer:5432/airflow
AIRFLOW__DATABASE__SQL_ALCHEMY_POOL_ENABLED: False
AIRFLOW__CORE__SQL_ALCHEMY_POOL_ENABLED: False
AIRFLOW__DATABASE__LOAD_DEFAULT_CONNECTIONS: False
Lưu ý:
Tắt SQLAlchemy connection pool vì PgBouncer đã đảm nhiệm việc này.
Sử dụng
psycopg2
driver thay vìasyncpg
để tương thích tốt hơn với PgBouncer.
5. Kinh nghiệm thực tế
✅ Ưu điểm khi dùng PgBouncer:
Giảm tải PostgreSQL, ngăn chặn connection overflow.
Tăng khả năng mở rộng Airflow trong môi trường Kubernetes.
Hạn chế lỗi:
FATAL: remaining connection slots are reserved
.
⚠️ Những lỗi thường gặp:
Connection reset: Do cấu hình timeout chưa hợp lý trong PgBouncer.
Application not compatible with pooling mode: Một số câu lệnh SQL không tương thích với
transaction
mode.Pool quá nhỏ: Số lượng kết nối trong PgBouncer (
max_client_conn
,default_pool_size
) cần điều chỉnh theo quy mô Airflow.
6. Monitoring PgBouncer
Bạn có thể expose metrics từ PgBouncer bằng cách dùng công cụ như:
pgbouncer-exporter (Prometheus Exporter)
Telegraf
Custom SQL query từ Airflow DAG
Subscribe to my newsletter
Read articles from Kilo directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
