Hướng Dẫn Triển Khai Replication PostgreSQL và Sao Lưu Tự Động Sử Dụng Docker và Rclone
Trong môi trường sản xuất hiện đại, việc sao lưu dữ liệu tự động và replication cơ sở dữ liệu là rất quan trọng để đảm bảo tính sẵn sàng cao, khả năng chịu lỗi và phục hồi thảm họa. Bài viết này sẽ hướng dẫn bạn quy trình từng bước để thiết lập hệ thống replication PostgreSQL bằng Docker, tạo sao lưu tự động và tải lên lưu trữ đám mây bằng Rclone.
Tại Sao Thiết Lập Này Lại Quan Trọng
Giả sử bạn có một ứng dụng SaaS đang phát triển mà không thể chịu đựng downtime. Bạn muốn:
- Đảm bảo replication liên tục của cơ sở dữ liệu chính đến nhiều cơ sở dữ liệu phụ.
- Tự động sao lưu hàng ngày để ngăn chặn mất dữ liệu.
- Lưu trữ an toàn các bản sao lưu trên lưu trữ đám mây như OneDrive, Google Drive hoặc S3.
- Có một hệ thống mà việc phục hồi cơ sở dữ liệu trở nên đơn giản nếu các container Docker gặp sự cố.
Cách tiếp cận này lý tưởng cho:
- Triển khai đa môi trường (staging, production).
- Các nhóm quản lý dữ liệu nhạy cảm cần sao lưu ngoài site.
- Các ứng dụng mà downtime có thể dẫn đến tổn thất kinh doanh.
Cấu Trúc Dự Án
project_root/
├── app/
│ └── some_module/
├── backups/
├── backup.sh
├── backup_to_cloud.sh
├── db/
│ ├── parent/
│ │ ├── postgresql.conf
│ │ └── pg_hba.conf
│ ├── child1/
│ │ └── postgresql.conf
│ ├── child2/
│ │ └── postgresql.conf
│ └── child3/
│ └── postgresql.conf
├── db_backups/
├── docker-init-scripts/
├── entrypoint.sh
├── full_backup.sql.gz
├── backup.sql
├── postgresql.conf
├── test_cloud_backup.sh
├── manage.py
├── docker-compose.yml
└── requirements.txt
Giải Thích Cấu Trúc:
db/childX: Tệp cấu hình cho các cơ sở dữ liệu con được replication.backups/: Lưu trữ dữ liệu cho các tệp .sql hoặc .dump.cron_jobs/: Các script được lên lịch để sao lưu định kỳ.backup.sh: Xử lý sao lưu cơ sở dữ liệu cục bộ.backup_to_cloud.sh: Tải các bản sao lưu lên lưu trữ đám mây qua Rclone.
Bước 1: Thiết Lập Các Container Docker cho PostgreSQL Replication
Chúng ta sẽ thiết lập một cơ sở dữ liệu cha và ba cơ sở dữ liệu con. Mỗi cơ sở dữ liệu con sẽ replicate từ cơ sở dữ liệu cha để đảm bảo độ tin cậy.
yaml
services:
postgres_parent:
image: postgres:15
container_name: postgres_parent
restart: always
environment:
POSTGRES_DB: mydb
POSTGRES_USER: postgres
POSTGRES_PASSWORD: admin
volumes:
- postgres_parent_data:/var/lib/postgresql/data
- ./db/primary/postgresql.conf:/etc/postgresql/postgresql.conf
- ./db/primary/pg_hba.conf:/etc/postgresql/pg_hba.conf
command: postgres -c config_file=/etc/postgresql/postgresql.conf
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
interval: 10s
retries: 5
timeout: 5s
postgres_child1:
image: postgres:15
container_name: postgres_child1
restart: always
environment:
POSTGRES_DB: mydb
POSTGRES_USER: postgres
POSTGRES_PASSWORD: admin
PARENT_HOST: postgres_parent
volumes:
- postgres_child1_data:/var/lib/postgresql/data
- ./db/child1/postgresql.conf:/etc/postgresql/postgresql.conf
command: postgres -c config_file=/etc/postgresql/postgresql.conf
depends_on:
- postgres_parent
postgres_child2:
image: postgres:15
container_name: postgres_child2
restart: always
environment:
POSTGRES_DB: mydb
POSTGRES_USER: postgres
POSTGRES_PASSWORD: admin
PARENT_HOST: postgres_parent
volumes:
- postgres_child2_data:/var/lib/postgresql/data
- ./db/child2/postgresql.conf:/etc/postgresql/postgresql.conf
command: postgres -c config_file=/etc/postgresql/postgresql.conf
depends_on:
- postgres_parent
postgres_child3:
image: postgres:15
container_name: postgres_child3
restart: always
environment:
POSTGRES_DB: mydb
POSTGRES_USER: postgres
POSTGRES_PASSWORD: admin
PARENT_HOST: postgres_parent
volumes:
- postgres_child3_data:/var/lib/postgresql/data
- ./db/child3/postgresql.conf:/etc/postgresql/postgresql.conf
command: postgres -c config_file=/etc/postgresql/postgresql.conf
depends_on:
- postgres_parent
volumes:
postgres_parent_data:
postgres_child1_data:
postgres_child2_data:
postgres_child3_data:
Điểm Chính:
- Mỗi container con phụ thuộc vào container cha.
- Các cấu hình PostgreSQL tùy chỉnh được gán để đảm bảo thiết lập replication chính xác.
- Healthcheck đảm bảo rằng cơ sở dữ liệu cha đã sẵn sàng trước khi các cơ sở dữ liệu con bắt đầu.
Bước 2: Sao Lưu Cơ Sở Dữ Liệu Cục Bộ
Để bảo vệ chống lại việc mất dữ liệu, chúng ta sẽ tạo các bản sao lưu hàng ngày.
Ví dụ về backup.sh:
bash
#!/bin/bash
BACKUP_DIR="./backups"
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
DB_NAME="mydb"
USER="postgres"
mkdir -p $BACKUP_DIR
pg_dump -U $USER $DB_NAME > $BACKUP_DIR/${DB_NAME}_backup_$DATE.sql
echo "Backup created at $BACKUP_DIR/${DB_NAME}_backup_$DATE.sql"
Chức Năng:
- Lưu trữ các bản sao lưu .sql được đánh dấu thời gian trong thư mục
backups/. - Có thể được kích hoạt thủ công hoặc qua cron.
Bước 3: Tự Động Hóa Sao Lưu Với Cron
Thiết lập một cron job để chạy script sao lưu hàng ngày.
bash
# crontab -e
0 2 * * * /path/to/my_project/backup.sh >> /path/to/my_project/logs/backup.log 2>&1
Chức Năng:
- Chạy mỗi ngày lúc 2 giờ sáng.
- Lưu trữ nhật ký cho mục đích kiểm tra.
Bước 4: Tải Lên Sao Lưu Lên Cloud Với Rclone
Chúng ta sẽ sử dụng Rclone để tải các bản sao lưu lên OneDrive.
Ví dụ về backup_to_cloud.sh:
bash
#!/bin/bash
BACKUP_DIR="./backups"
REMOTE_NAME="onedrive"
REMOTE_PATH="DB_Backups/$(date +%Y-%m-%d)/"
rclone copy $BACKUP_DIR $REMOTE_NAME:$REMOTE_PATH --progress
Các Bước Thiết Lập Rclone:
- Cài đặt Rclone trên server.
- Chạy
rclone config. - Tạo một remote mới (ví dụ: onedrive) và ủy quyền cho nó.
- Kiểm tra kết nối bằng cách sử dụng
rclone lsf onedrive:. - Mẹo: Luôn thử nghiệm
rclone copybằng tay trước khi tự động hóa.
Bước 5: Xử Lý Sự Cố và Phục Hồi
Tình Huống: Docker hoặc Một Container Gặp Sự Cố.
Các Bước Phục Hồi:
- Dừng tất cả các container:
bash
docker-compose down
- Phục hồi cơ sở dữ liệu từ bản sao lưu gần nhất:
bash
psql -U postgres -d mydb < ./backups/mydb_backup_YYYY-MM-DD.sql
- Khởi động lại các container:
bash
docker-compose up -d
- Xác minh trạng thái replication trong PostgreSQL:
bash
SELECT * FROM pg_stat_replication;
Điểm Chính:
- Giữ bản sao lưu bên ngoài các volumes Docker để ngăn chặn mất mát không mong muốn.
- Sử dụng bản sao lưu theo phiên bản và lưu trữ đám mây để phục hồi từ các sự cố nghiêm trọng.
Ví Dụ Thực Tế
Tình Huống: Một Ứng Dụng SaaS Lưu Trữ Dữ Liệu Hoạt Động Của Khách Hàng.
- Cơ sở dữ liệu cha: Nhận các ghi chép.
- Các cơ sở dữ liệu con: Cung cấp bản sao đọc cho phân tích và báo cáo.
- Các script sao lưu: Chạy hàng đêm, lưu trữ cục bộ và trên đám mây.
- Phục hồi khi gặp sự cố: Nếu container cha gặp sự cố, bản sao lưu gần nhất có thể phục hồi cơ sở dữ liệu, giảm thiểu thời gian chết.
- Thiết lập này đảm bảo tính sẵn sàng cao, độ bền dữ liệu và phục hồi nhanh chóng khi gặp thảm họa.
Kết Luận
Trong bài viết này, chúng ta đã đề cập đến:
- Replication PostgreSQL trên Docker với một cha và nhiều con.
- Sao lưu cục bộ tự động bằng các script và cron jobs.
- Sao lưu đám mây sử dụng Rclone và OneDrive.
- Quy trình phục hồi trong trường hợp Docker hoặc cơ sở dữ liệu gặp sự cố.
- Các thực tiễn tốt nhất cho quản lý sao lưu và replication.
Cách tiếp cận này có thể mở rộng, an toàn và sẵn sàng cho sản xuất, phù hợp cho cả các nhóm nhỏ và môi trường doanh nghiệp lớn.
✅ Các Bước Tiếp Theo:
- Mở rộng các script Rclone để hỗ trợ nhiều nhà cung cấp đám mây.
- Thêm cảnh báo giám sát nếu sao lưu hoặc replication gặp sự cố.
- Lên lịch sao lưu gia tăng để tối ưu hóa lưu trữ.