0
0
Lập trình
Admin Team
Admin Teamtechmely

Hướng Dẫn Sao Lưu Tự Động PostgreSQL Trong Docker

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

• 8 phút đọc

Giới thiệu

Cơ sở dữ liệu có thể gặp sự cố vì nhiều lý do: triển khai sai, bảng bị xóa, hỏng ổ đĩa, hoặc đơn giản chỉ là chạy một truy vấn hủy hoại. Khi PostgreSQL chạy trong Docker, một lớp rủi ro khác được thêm vào. Nếu container hoặc volume của bạn bị xóa mà không có sao lưu, dữ liệu của bạn sẽ biến mất vĩnh viễn.

Nếu bạn nghiêm túc với ứng dụng của mình, sao lưu tự động PostgreSQL là điều không thể thương lượng. Trong hướng dẫn này, chúng ta sẽ đi qua các phương pháp thiết thực để thiết lập sao lưu tự động cho PostgreSQL bên trong Docker. Chúng ta sẽ xem xét các công cụ mà PostgreSQL cung cấp, cách lên lịch sao lưu, cách xoay vòng và làm sạch chúng, và những điều cần cân nhắc cho các hệ thống lớn hoặc sản xuất.

Cuối cùng, bạn sẽ có một chiến lược hoạt động tự động và bảo vệ cơ sở dữ liệu của bạn.

Cài Đặt PostgreSQL

Để minh họa, dưới đây là một tệp docker-compose.yml tối thiểu để chạy PostgreSQL:

yaml Copy
services:
  db:
    image: postgres:16
    container_name: postgres
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypass
      POSTGRES_DB: mydb
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

Cấu hình này cho bạn một phiên bản Postgres hoạt động với lưu trữ liên tục. Cơ sở dữ liệu nằm bên trong volume db_data. Nếu volume đó bị mất hoặc hỏng, dữ liệu của bạn cũng sẽ biến mất. Các bản sao lưu cần phải sống bên ngoài vòng đời của container này.

Bạn muốn triển khai PostgreSQL trên máy chủ của mình? Hãy tham khảo hướng dẫn của chúng tôi để triển khai PostgreSQL trên VPS bằng Docker.

Tạo Sao Lưu Thủ Công với pg_dump

pg_dump là cách phổ biến nhất để tạo bản sao lưu logic cho một cơ sở dữ liệu PostgreSQL. Nó xuất khẩu schema và dữ liệu của bạn vào một tệp SQL, làm cho nó có thể di chuyển và dễ dàng phục hồi. Chạy nó bên trong Docker là đơn giản với docker exec:

bash Copy
docker exec postgres pg_dump -U myuser mydb > backup.sql

Điều này hoạt động tốt cho các cơ sở dữ liệu nhỏ hơn, nhưng hãy nhớ rằng các dump logic có thể mất thời gian và tiêu tốn không gian đĩa đáng kể khi tập dữ liệu của bạn phát triển. Đối với các cơ sở dữ liệu rất lớn, bạn có thể thích các bản sao lưu vật lý với pg_basebackup hoặc các snapshot hệ thống tệp. Tuy nhiên, đối với hầu hết các ứng dụng, pg_dump là sự cân bằng đúng giữa sự đơn giản và độ tin cậy.

Nhược điểm của việc chạy pg_dump thủ công là nó chỉ hoạt động nếu bạn nhớ thực hiện. Và hãy thành thật, các kỹ sư rất giỏi trong việc tự động hóa mọi thứ ngoại trừ những việc họ cần làm hàng ngày. Vì vậy, hãy đi vào việc tự động hóa các bản sao lưu để bạn có thể yên tâm ngủ ngon vào ban đêm biết rằng dữ liệu của bạn được an toàn.

Tự Động Hóa Sao Lưu với Container Bên Cạnh

Để tự động hóa sao lưu, bạn có thể chạy một container nhẹ bên cạnh cơ sở dữ liệu của bạn để thực hiện pg_dump theo lịch. Một cách tiếp cận phổ biến là lặp lại với sleep, viết một tệp dump mới mỗi ngày.

Dưới đây là một dịch vụ sao lưu được thêm vào docker-compose.yml:

yaml Copy
  backup:
    image: postgres:16
    container_name: pg_backup
    depends_on:
      - db
    volumes:
      - ./backups:/backups
    entrypoint: >
      bash -c 'while true; do
        pg_dump -h db -U myuser mydb > /backups/db-$(date +%F-%H-%M-%S).sql;
        sleep 86400;
      done'
    environment:
      PGPASSWORD: mypass

Cấu hình này:

  • Kết nối đến dịch vụ db.
  • Sao lưu cơ sở dữ liệu mỗi 24 giờ một lần.
  • Lưu đầu ra vào thư mục đã gắn kết ./backups với dấu thời gian.

Đây là một cách đơn giản nhưng hiệu quả. Đối với nhiều dự án nhỏ, cách tiếp cận container bên cạnh này là tất cả những gì bạn cần.

Lên Lịch Sao Lưu PostgreSQL với Cron

Trong khi lặp lại với sleep bên trong một container là tốt cho các thiết lập đơn giản, cron là công cụ mà hầu hết các kỹ sư sử dụng khi họ muốn lập lịch thực sự. Cron cung cấp cho bạn toàn quyền kiểm soát khi nào sao lưu chạy, tần suất và cách chúng tích hợp với các nhiệm vụ bảo trì khác.

Trên máy chủ, bạn có thể thêm một mục cron như sau:

bash Copy
0 2 * * * docker exec postgres pg_dump -U myuser mydb > ~/backups/db-$(date +\%F).sql

Điều này tạo ra một bản sao lưu mới mỗi ngày vào lúc 2 giờ sáng. Nếu bạn cần sao lưu thường xuyên hơn, bạn có thể lên lịch chúng hàng giờ hoặc mỗi vài phút chỉ bằng cách điều chỉnh biểu thức.

Lợi ích của cron là tính linh hoạt của nó. Bạn có thể thêm các bước xử lý sau trong cùng một tác vụ, chẳng hạn như nén tệp hoặc đẩy nó lên lưu trữ đám mây. Và khác với một container sao lưu chạy trong vòng lặp, cron dễ dàng để xem và quản lý lịch trình trên máy chủ của bạn.

Đối với các môi trường mà cron không có sẵn, bạn có thể đạt được cùng một hiệu ứng bên trong một container riêng biệt chạy daemon cron. Cách tiếp cận này giữ tất cả logic bên trong Docker và tránh phụ thuộc vào cấu hình ở cấp máy chủ.

Nén Để Tiết Kiệm Không Gian

Ngay khi bạn bắt đầu giữ nhiều hơn một vài bản sao lưu, kích thước tệp trở thành một vấn đề. Các dump logic là văn bản thuần túy và văn bản thuần túy nén rất tốt. Giải pháp là dẫn đầu ra qua một công cụ nén như gzip:

bash Copy
docker exec postgres pg_dump -U myuser mydb | gzip > backup.sql.gz

Điều này có thể giảm kích thước tệp sao lưu xuống 70-90%, tùy thuộc vào dữ liệu của bạn. Đối với các hệ thống sản xuất với các bản sao lưu hàng ngày, nén là điều cần thiết để giữ chi phí lưu trữ nằm trong tầm kiểm soát.

Chính Sách Giữ Lại và Dọn Dẹp Sao Lưu

Nếu không có dọn dẹp hợp lý, thư mục sao lưu của bạn cuối cùng sẽ tiêu thụ tất cả không gian đĩa có sẵn. Một chính sách giữ lại tốt sẽ giữ các bản sao lưu gần đây dễ dàng truy cập trong khi loại bỏ các bản cũ hơn để tiết kiệm không gian.

Dưới đây là một chiến lược giữ lại đơn giản sử dụng find:

bash Copy
# Giữ các bản sao lưu hàng ngày trong 7 ngày, xóa các bản cũ hơn
find ./backups -name "db-*.sql.gz" -mtime +7 -delete

# Tinh vi hơn: giữ hàng ngày trong 7 ngày, hàng tuần trong 4 tuần
find ./backups -name "db-*.sql.gz" -mtime +7 ! -name "*-01.sql.gz" -delete

Bạn có thể tích hợp điều này trực tiếp vào tác vụ cron của mình:

bash Copy
# Quy trình sao lưu và dọn dẹp hoàn chỉnh  
0 2 * * * docker exec postgres pg_dump -U myuser mydb | gzip > ~/backups/db-$(date +\%F).sql.gz && find ~/backups -name "db-*.sql.gz" -mtime +7 -delete

Đối với các hệ thống sản xuất, hãy xem xét một chính sách giữ lại tinh vi hơn:

  • Sao lưu hàng giờ trong 24 giờ qua
  • Sao lưu hàng ngày trong 7 ngày qua
  • Sao lưu hàng tuần trong 4 tuần qua
  • Sao lưu hàng tháng trong 12 tháng qua

Khôi Phục Sao Lưu PostgreSQL

Tạo bản sao lưu chỉ là một nửa câu chuyện. Bạn cần biết cách khôi phục chúng khi thảm họa xảy ra. Dưới đây là cách khôi phục từ các bản sao lưu nén của bạn:

bash Copy
# Khôi phục vào cơ sở dữ liệu hiện có (sẽ ghi đè dữ liệu hiện có)
gunzip -c backup.sql.gz | docker exec -i postgres psql -U myuser mydb

# Khôi phục vào một cơ sở dữ liệu mới để thử nghiệm
docker exec postgres createdb -U myuser mydb_test
gunzip -c backup.sql.gz | docker exec -i postgres psql -U myuser mydb_test

# Khôi phục từ bản sao lưu không nén
docker exec -i postgres psql -U myuser mydb < backup.sql

Luôn kiểm tra quy trình khôi phục của bạn trên một cơ sở dữ liệu không sản xuất trước. Một bản sao lưu chỉ tốt bằng khả năng khôi phục từ nó.

Tóm Tắt Tất Cả

Một giải pháp sao lưu PostgreSQL hoàn chỉnh kết hợp lập lịch tự động, nén và chính sách giữ lại. Dưới đây là một ví dụ sẵn sàng cho sản xuất kết nối mọi thứ lại với nhau:

bash Copy
#!/bin/bash
# Kịch bản sao lưu hoàn chỉnh với xử lý lỗi và dọn dẹp
BACKUP_DIR="/backups"
DB_NAME="mydb"
RETENTION_DAYS=7
DATE=$(date +%F_%H-%M-%S)
BACKUP_FILE="$BACKUP_DIR/db-$DATE.sql.gz"

# Tạo bản sao lưu với nén
if docker exec postgres pg_dump -U myuser "$DB_NAME" | gzip > "$BACKUP_FILE"; then
    echo "Sao lưu thành công: $(basename $BACKUP_FILE)"

    # Dọn dẹp các bản sao lưu cũ
    find "$BACKUP_DIR" -name "db-*.sql.gz" -mtime +$RETENTION_DAYS -delete
    echo "Đã dọn dẹp các bản sao lưu cũ hơn $RETENTION_DAYS ngày"
else
    echo "Sao lưu thất bại!"
    exit 1
fi

Lưu tệp này dưới dạng một kịch bản, làm cho nó có thể thực thi, và thêm nó vào crontab của bạn. Điều này sẽ cung cấp cho bạn một hệ thống sao lưu đáng tin cậy chạy tự động và quản lý không gian lưu trữ.

Các phương pháp trong hướng dẫn này có thể mở rộng từ môi trường phát triển đến các hệ thống sản xuất. Bắt đầu với container bên cạnh để đơn giản, sau đó chuyển sang lập lịch dựa trên cron khi nhu cầu của bạn tăng lên. Chìa khóa là sự nhất quán: các bản sao lưu tự động chạy thường xuyên có giá trị hơn nhiều so với các bản sao lưu hoàn hảo mà không bao giờ xảy ra.

Đơn Giản Hóa Với Serversinc

Nghe có vẻ như nhiều việc? Serversinc xử lý tất cả sự phức tạp cho bạn. Nền tảng của chúng tôi kết hợp quản lý container, API cron để lập lịch các lệnh sao lưu, quản lý volume, và thông báo tự động, vì vậy bạn có thể thiết lập các bản sao lưu PostgreSQL đáng tin cậy mà không cần gánh nặng hoạt động.

Hãy thử Serversinc miễn phí tại serversinc.io và tự động hóa các bản sao lưu cơ sở dữ liệu của bạn trong vài phút.

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