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ệ:primaryhoặcreplica.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ơnPGSQL_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ồmon,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:
| node | state | priority | sync_state |
|---|---|---|---|
| walreceiver | streaming | 1 | sync |
| walreceiver | streaming | 0 | async |
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.