Quản lý cấu hình Cluster PostgreSQL trên Kubernetes với StackGres

Trong hệ sinh thái StackGres, việc quản lý các tham số vận hành của PostgreSQL được thực hiện thông qua Custom Resource Definition (CRD) có tên là SGPostgresConfig. Nếu người dùng không khai báo cấu hình riêng khi khởi tạo cluster, hệ thống sẽ tự động áp dụng bộ tham số mặc định đã được tối ưu hóa cho môi trường sản xuất.

Điểm mạnh của SGPostgresConfig là khả năng tái sử dụng. Bạn có thể định nghĩa một bộ quy tắc cấu hình duy nhất và áp dụng cho nhiều cluster khác nhau trong cùng một namespace, giúp đảm bảo tính nhất quán cho toàn bộ hạ tầng cơ sở dữ liệu.

apiVersion: stackgres.io/v1
kind: SGPostgresConfig
metadata:
  namespace: data-services
  name: optimized-pg-settings
spec:
  postgresVersion: "14"
  postgresql.conf:
    work_mem: '32MB'
    shared_buffers: '1GB'
    random_page_cost: '1.1'
    password_encryption: 'scram-sha-256'
    log_min_duration_statement: '500ms'
    jit: 'off'

Để áp dụng cấu hình này vào một cụm database cụ thể, bạn chỉ cần tham chiếu tên của nó trong phần khai báo SGCluster:

apiVersion: stackgres.io/v1
kind: SGCluster
metadata:
  namespace: data-services
  name: production-db
spec:
# ... các tham số khác
  configurations:
    sgPostgresConfig: 'optimized-pg-settings'

Phân bổ tài nguyên qua Instance Profiles

StackGres trừu tượng hóa việc cấp phát CPU và RAM thông qua SGInstanceProfile. Khái niệm này tương tự như việc chọn kích thước instance (S, M, L) trên các dịch vụ Cloud, giúp kỹ sư nền tảng kiểm soát chặt chẽ tài nguyên mà các Pod PostgreSQL sẽ sử dụng.

apiVersion: stackgres.io/v1
kind: SGInstanceProfile
metadata:
  namespace: data-services
  name: high-perf-profile
spec:
  cpu: "2"
  memory: "4Gi"

Cấu hình này sẽ tự động thiết lập requestslimits cho container chính (chạy Postgres/Patroni) cũng như các container phụ trợ khác. Việc thay đổi profile này trong SGCluster sẽ kích hoạt quá trình cập nhật Rolling Update để thay đổi tài nguyên của các Pod đang chạy.

Quản lý Connection Pooling với PgBouncer

Mặc định, StackGres triển khai một sidecar container chạy PgBouncer đi kèm với mỗi instance PostgreSQL. Điều này giúp giảm tải cho database bằng cách gom các kết nối từ ứng dụng (fan-in) và duy trì một lượng kết nối ổn định tới backend Postgres.

Bạn có thể tùy chỉnh cơ chế pooling thông qua SGPoolingConfig. Dưới đây là ví dụ về cấu hình PgBouncer tối ưu cho chế độ transaction:

apiVersion: stackgres.io/v1
kind: SGPoolingConfig
metadata:
  namespace: data-services
  name: app-pool-policy
spec:
  pgBouncer:
    pgbouncer.ini:
      pgbouncer:
        max_client_conn: '500'
        default_pool_size: '50'
        pool_mode: transaction

Sau khi cập nhật cấu hình pooling, bạn cần gửi tín hiệu để PgBouncer nạp lại tham số mới mà không làm gián đoạn dịch vụ. Sử dụng lệnh sau để tác động vào Pod Primary:

PRIMARY_POD=$(kubectl get pod -l role=master -n data-services -o name)
kubectl exec -n data-services -it ${PRIMARY_POD} -c postgres-util -- pkill --signal HUP pgbouncer

Vô hiệu hóa Connection Pooling

Đối với các tác vụ đặc thù như báo cáo (OLAP) hoặc di trú dữ liệu lớn cần giữ kết nối lâu dài, việc đi qua pooling có thể không cần thiết. Bạn có thể tắt tính năng này trong cấu hình cluster:

spec:
  pods:
    disableConnectionPooling: true

Cấu hình nâng cao cho Session Mode

Nếu ứng dụng yêu cầu giữ phiên làm việc (session state), bạn nên sử dụng cấu hình với các tham số timeout chặt chẽ để tránh tình trạng chiếm dụng kết nối nhàn rỗi (idle in transaction):

apiVersion: stackgres.io/v1
kind: SGPoolingConfig
metadata:
  namespace: data-services
  name: session-mode-config
spec:
  pgBouncer:
    pgbouncer.ini:
      pgbouncer:
        pool_mode: session
        client_idle_timeout: '45s'
        idle_transaction_timeout: '90s'
        server_lifetime: '3600s'

Giám sát trạng thái Connection Pool

Để kiểm tra hiệu năng và lưu lượng qua PgBouncer, bạn có thể truy cập trực tiếp vào console quản trị của nó qua socket nội bộ. Lưu ý sử dụng cổng 6432 thay vì cổng database mặc định:

kubectl exec -it [TEN_POD] -c postgres-util -- psql -p 6432 -d pgbouncer -U pgbouncer

Một số lệnh kiểm tra quan trọng trong console PgBouncer:

  • SHOW STATS;: Xem thống kê tổng quát về lưu lượng và thời gian xử lý truy vấn.
  • SHOW POOLS;: Kiểm tra số lượng kết nối đang hoạt động (active), đang chờ (waiting) và nhàn rỗi (idle) trong pool.
  • SHOW CLIENTS;: Liệt kê chi tiết các ứng dụng khách đang kết nối tới.

Việc hiểu rõ các chỉ số này giúp quản trị viên điều chỉnh max_client_conndefault_pool_size một cách khoa học, tránh hiện tượng nghẽn cổ chai tại tầng middleware.

Thẻ: PostgreSQL StackGres Kubernetes PgBouncer Database-Administration

Đăng vào ngày 1 tháng 6 lúc 13:49