Triển khai cụm sao chép luồng PostgreSQL với Docker Image Bitnami

Bitnami cung cấp một hình ảnh Docker được tối ưu hóa cho PostgreSQL, hỗ trợ cấu hình nhanh chóng các mô hình sao chép luồng (streaming replication) thông qua biến môi trường — không cần chỉnh sửa tay tập tin cấu hình hay script khởi động.

Các biến môi trường điều khiển sao chép

  • PGSQL_REPL_MODE: Thiết lập vai trò node — giá trị hợp lệ: primary hoặc replica.
  • PGSQL_REPL_USER: Tên người dùng dùng để xác thực kết nối sao chép từ replica đến primary.
  • PGSQL_REPL_PASS: Mật khẩu tương ứng với người dùng sao chép.
  • PGSQL_REPL_PASS_FILE: Đường dẫn tới file chứa mật khẩu — ưu tiên cao hơn PGSQL_REPL_PASS.
  • PGSQL_PRIMARY_HOST: Địa chỉ host của node primary (dành riêng cho replica).
  • PGSQL_PRIMARY_PORT: Cổng kết nối tới primary (mặc định: 5432).

Trong kiến trúc sao chép, chỉ tồn tại duy nhất một node primary (có thể ghi và đọc), trong khi các node replica chỉ cho phép truy vấn đọc. Việc phân tách tải đọc/ghi giúp cải thiện hiệu năng tổng thể và độ sẵn sàng hệ thống.

Bước 1: Khởi tạo node primary

Dưới đây là lệnh khởi chạy container primary với cấu hình đầy đủ:

docker run -d \
  --name pg-primary \
  -e PGSQL_REPL_MODE=primary \
  -e PGSQL_USERNAME=app_user \
  -e PGSQL_PASSWORD=secure_app_pass \
  -e PGSQL_DATABASE=prod_db \
  -e PGSQL_REPL_USER=replicator \
  -e PGSQL_REPL_PASS=sync_secret_2024 \
  -p 5432:5432 \
  -v pg_primary_data:/bitnami/postgresql \
  bitnami/postgresql:15-debian-11

Bước 2: Triển khai node replica

Replica sẽ tự động kết nối tới primary, đồng bộ dữ liệu ban đầu, và duy trì kết nối streaming liên tục:

docker run -d \
  --name pg-replica-01 \
  -e PGSQL_REPL_MODE=replica \
  -e PGSQL_PRIMARY_HOST=pg-primary \
  -e PGSQL_PRIMARY_PORT=5432 \
  -e PGSQL_REPL_USER=replicator \
  -e PGSQL_REPL_PASS=sync_secret_2024 \
  -e PGSQL_PASSWORD=secure_app_pass \
  --network container:pg-primary \
  bitnami/postgresql:15-debian-11

Lưu ý: Tham số --network container:pg-primary đảm bảo replica sử dụng cùng mạng nội bộ với primary — loại bỏ yêu cầu --link (đã lỗi thời) và tăng tính ổn định.

Sử dụng Docker Compose để quản lý cụm

Tệp docker-compose.yml sau định nghĩa một cụm gồm 1 primary và 2 replica:

version: '3.8'

services:
  pg-primary:
    image: bitnami/postgresql:15-debian-11
    container_name: pg-primary
    environment:
      - PGSQL_REPL_MODE=primary
      - PGSQL_USERNAME=app_user
      - PGSQL_PASSWORD=secure_app_pass
      - PGSQL_DATABASE=prod_db
      - PGSQL_REPL_USER=replicator
      - PGSQL_REPL_PASS=sync_secret_2024
      - PGSQL_SYNCHRONOUS_COMMIT_MODE=remote_apply
      - PGSQL_NUM_SYNCHRONOUS_REPLICAS=1
    volumes:
      - pg_primary_vol:/bitnami/postgresql
    ports:
      - "5432:5432"

  pg-replica-01:
    image: bitnami/postgresql:15-debian-11
    environment:
      - PGSQL_REPL_MODE=replica
      - PGSQL_PRIMARY_HOST=pg-primary
      - PGSQL_PRIMARY_PORT=5432
      - PGSQL_REPL_USER=replicator
      - PGSQL_REPL_PASS=sync_secret_2024
      - PGSQL_PASSWORD=secure_app_pass
    depends_on:
      - pg-primary

  pg-replica-02:
    image: bitnami/postgresql:15-debian-11
    environment:
      - PGSQL_REPL_MODE=replica
      - PGSQL_PRIMARY_HOST=pg-primary
      - PGSQL_PRIMARY_PORT=5432
      - PGSQL_REPL_USER=replicator
      - PGSQL_REPL_PASS=sync_secret_2024
      - PGSQL_PASSWORD=secure_app_pass
    depends_on:
      - pg-primary

volumes:
  pg_primary_vol:
    driver: local

Để mở rộng số lượng replica lên 4, chạy:

docker compose up -d --scale pg-replica-01=2 --scale pg-replica-02=2

Cấu hình sao chép đồng bộ (synchronous replication)

Để đảm bảo tính toàn vẹn dữ liệu cao hơn, bạn có thể kích hoạt chế độ commit đồng bộ bằng cách thiết lập:

  • PGSQL_SYNCHRONOUS_COMMIT_MODE: Các giá trị hợp lệ bao gồm on, remote_apply, remote_write, local, off. Giá trị remote_apply đảm bảo transaction chỉ được coi là thành công sau khi đã được áp dụng trên ít nhất một replica.
  • PGSQL_NUM_SYNCHRONOUS_REPLICAS: Số lượng replica bắt buộc phải xác nhận trước khi commit hoàn tất.

Kiểm tra trạng thái sao chép hiện tại bằng truy vấn SQL sau trên node primary:

SELECT 
  application_name AS node,
  state,
  sync_priority AS priority,
  sync_state
FROM pg_stat_replication;

Kết quả mẫu:

nodestateprioritysync_state
walreceiverstreaming1sync
walreceiverstreaming0async

Mở rộng nâng cao

Để tổ chức nhiều nhóm sao chép độc lập (ví dụ: phân tách theo khu vực địa lý hoặc mức độ quan trọng), thiết lập biến PGSQL_CLUSTER_NAME — mỗi nhóm sẽ sử dụng một giá trị khác nhau, từ đó kiểm soát chính sách đồng bộ và failover riêng biệt.

Thẻ: PostgreSQL docker streaming-replication bitnami synchronous-commit

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