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

KiloKilo
3 min read

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:

  1. Connection reset: Do cấu hình timeout chưa hợp lý trong PgBouncer.

  2. Application not compatible with pooling mode: Một số câu lệnh SQL không tương thích với transaction mode.

  3. 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

0
Subscribe to my newsletter

Read articles from Kilo directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Kilo
Kilo