0
0
Lập trình
TT

Triển Khai Replication PostgreSQL và Sao Lưu Tự Động Trên Cloud

Đăng vào 4 tháng trước

• 8 phút đọc

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

Copy
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 Copy
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 Copy
#!/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 Copy
# 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 Copy
#!/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:

  1. Cài đặt Rclone trên server.
  2. Chạy rclone config.
  3. Tạo một remote mới (ví dụ: onedrive) và ủy quyền cho nó.
  4. Kiểm tra kết nối bằng cách sử dụng rclone lsf onedrive:.
  5. Mẹo: Luôn thử nghiệm rclone copy bằ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:

  1. Dừng tất cả các container:
bash Copy
docker-compose down
  1. Phục hồi cơ sở dữ liệu từ bản sao lưu gần nhất:
bash Copy
psql -U postgres -d mydb < ./backups/mydb_backup_YYYY-MM-DD.sql
  1. Khởi động lại các container:
bash Copy
docker-compose up -d
  1. Xác minh trạng thái replication trong PostgreSQL:
bash Copy
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:

  1. Replication PostgreSQL trên Docker với một cha và nhiều con.
  2. Sao lưu cục bộ tự động bằng các script và cron jobs.
  3. Sao lưu đám mây sử dụng Rclone và OneDrive.
  4. Quy trình phục hồi trong trường hợp Docker hoặc cơ sở dữ liệu gặp sự cố.
  5. 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ữ.
Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào