Tới nội dung
Cloudj

Hướng dẫn VPS

Sao lưu VPS đúng cách: chiến lược chống mất dữ liệu

Chiến lược sao lưu VPS thực tế: quy tắc 3-2-1, restic hoặc borg ra ngoài máy chủ, dump cơ sở dữ liệu, custom image và kiểm tra khôi phục định kỳ.

Cập nhật · 6 phút đọc

Sao lưu VPS chỉ có một mục tiêu: khi sự cố xảy ra, bạn lấy lại được dữ liệu và dịch vụ trong khoảng thời gian chấp nhận được. Phần lớn sự cố trên một máy chủ đơn lẻ không đến từ phần cứng hỏng. Chúng đến từ một lệnh rm -rf gõ nhầm, một migration làm hỏng bảng, một plugin bị chiếm quyền, hoặc lỡ tay xoá luôn máy chủ. Một kế hoạch tốt luôn giả định bạn sẽ mắc một trong những lỗi đó, và đảm bảo bản sao bạn cần nằm ở nơi lỗi đó không chạm tới được.

Bài này nói về chiến lược trước, lệnh sau. Nó không dựa vào bất kỳ tính năng sao lưu nào phía nhà cung cấp: mọi thứ dưới đây chạy từ máy chủ của bạn tới nơi lưu trữ do chính bạn kiểm soát.

Bắt đầu bằng hai câu hỏi

Trước khi chọn công cụ, hãy ghi ra hai con số cho từng máy chủ.

  • Bạn chấp nhận mất bao nhiêu dữ liệu? Nếu câu trả lời là "một ngày", sao lưu mỗi đêm là đủ. Nếu là "vài phút", bạn cần replication hoặc dump cơ sở dữ liệu thường xuyên, không chỉ sao lưu file.
  • Bạn chấp nhận dừng dịch vụ bao lâu? Nếu có thể dừng cả buổi chiều, việc dựng lại từ image sạch rồi khôi phục dữ liệu là ổn. Nếu chỉ chịu được vài phút, bạn cần một máy chủ dự phòng, và đó là một dự án khác.

Hai câu trả lời này quyết định tần suất sao lưu và mức đầu tư cho việc dựng lại nhanh. Phần còn lại chỉ là chi tiết.

Quy tắc 3-2-1 áp dụng cho một VPS

Quy tắc kinh điển là ba bản dữ liệu, trên hai loại lưu trữ khác nhau, trong đó một bản đặt ở nơi khác. Với một cloud server đơn lẻ, có thể hiểu như sau:

Bản saoNằm ở đâuBảo vệ trước rủi ro gì
1. Dữ liệu đang chạyỔ đĩa của chính máy chủKhông gì cả, đây là thứ cần được bảo vệ
2. Bản sao lưu ngoài máy chủMáy hoặc dịch vụ lưu trữ riêng, ở vị trí khácMáy chủ bị xoá, ransomware, sự cố phía nhà cung cấp
3. Bản sao lưu thứ haiNhà cung cấp khác, hoặc máy ở nhà hay văn phòngSự cố với bản 2 hoặc tài khoản chứa nó

Từ khoá quan trọng là "ngoài máy chủ". Một bản sao lưu trên cùng ổ đĩa, hay một cron job copy file vào thư mục /backup trên chính VPS đó, sẽ biến mất cùng máy chủ. Hãy giữ ít nhất một bản mà máy chủ được ghi vào nhưng không xoá được, ví dụ repository chỉ cho phép ghi thêm (append-only) hoặc tài khoản lưu trữ dùng thông tin đăng nhập riêng.

Nên sao lưu gì, bỏ qua gì

Hãy sao lưu những thứ không thể tạo lại bằng script:

  • Dữ liệu ứng dụng: file upload, /var/www, file người dùng.
  • Cơ sở dữ liệu, dưới dạng bản dump nhất quán (xem phần dưới), không phải copy file dữ liệu thô khi database đang chạy.
  • Cấu hình: /etc, các site Nginx, systemd unit, cron job, file .env được lưu an toàn.
  • Mọi Docker volume có chứa trạng thái.

Bỏ qua những gì dựng lại được: hệ điều hành, các gói đã cài, node_modules, cache và log không cần giữ. Bản sao lưu càng gọn thì chạy càng nhanh, và khôi phục còn nhanh hơn nhiều.

Dump cơ sở dữ liệu là việc đầu tiên

Copy thư mục /var/lib/postgresql hay /var/lib/mysql khi database đang chạy có thể cho ra một bản sao lưu không khởi động nổi. Hãy dump database ra file, rồi sao lưu file đó.

sudo mkdir -p /var/backups/db

# PostgreSQL: compressed custom format, restore with pg_restore
sudo -u postgres pg_dump -Fc appdb > /var/backups/db/appdb.dump

# MySQL or MariaDB: consistent snapshot of InnoDB tables
mysqldump --single-transaction --routines appdb | gzip > /var/backups/db/appdb.sql.gz

Trên các bản MariaDB mới, công cụ này có tên mariadb-dump. Hãy chạy dump vài phút trước khi sao lưu file để bản sao lưu luôn chứa bản dump mới nhất. Nếu cần hướng dẫn vận hành PostgreSQL, xem bài cài đặt PostgreSQL trên VPS.

Sao lưu ra ngoài máy chủ bằng restic hoặc borg

Cả hai công cụ đều tạo bản sao lưu được mã hoá và loại bỏ trùng lặp: sau lần chạy đầu, mỗi lần sao lưu chỉ lưu phần thay đổi, nên bạn giữ được nhiều mốc khôi phục mà không tốn nhiều dung lượng. Chọn một trong hai.

restic

restic hỗ trợ nhiều backend, gồm SFTP và object storage tương thích S3. Ví dụ dưới đây dùng SFTP tới một máy sao lưu riêng.

sudo apt install -y restic
export RESTIC_REPOSITORY=sftp:[email protected]:/srv/restic/web1
export RESTIC_PASSWORD_FILE=/root/.restic-password

restic init
restic backup /etc /var/www /var/backups/db --exclude-caches
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
restic check

restic gọi mỗi mốc khôi phục là "snapshot"; đó là thuật ngữ riêng của restic, không liên quan gì tới snapshot máy chủ. Tài liệu restic mô tả chi tiết từng backend.

borg

borg chạy qua SSH tới bất kỳ máy nào có cài borg, nổi tiếng với khả năng loại bỏ trùng lặp hiệu quả.

sudo apt install -y borgbackup
export BORG_REPO=ssh://[email protected]/./borg/web1
export BORG_PASSCOMMAND="cat /root/.borg-passphrase"

borg init --encryption=repokey-blake2
borg create --stats ::'{hostname}-{now}' /etc /var/www /var/backups/db
borg prune --keep-daily 7 --keep-weekly 4 --keep-monthly 6
borg compact

Dù dùng công cụ nào, hãy cất mật khẩu repository ở nơi khác ngoài máy chủ. Nếu máy chủ mất mà mật khẩu chỉ nằm trên đó, bản sao lưu sẽ không đọc được.

Đặt lịch chạy

Một dòng crontab của root là đủ cho đa số máy chủ:

15 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Gom lệnh dump, sao lưu và dọn bản cũ vào backup.sh, và cho script gửi thông báo khi thất bại, ví dụ qua Telegram hoặc email. Một job sao lưu lỗi âm thầm suốt một tháng còn tệ hơn không có, vì bạn tưởng mình đã an toàn.

Custom image: công cụ dựng lại, không phải bản sao lưu

Cloudj cho phép bạn lưu custom image của máy chủ và tạo máy chủ mới từ image đó. Điều này giúp khôi phục nhanh hơn: một image của máy chủ đã cấu hình đầy đủ (gói phần mềm, Nginx, user, agent giám sát) cho phép bạn dựng lại phần hệ thống trong một bước, sau đó khôi phục dữ liệu mới nhất từ restic hoặc borg.

Hãy coi image là khuôn mẫu, không phải bản sao lưu dữ liệu. Nó chỉ ghi lại một thời điểm, do bạn tạo thủ công, và không phải bản sao ngoài máy chủ có nhiều phiên bản như quy tắc 3-2-1 yêu cầu. Cập nhật image sau mỗi lần thay đổi cấu hình lớn, còn dữ liệu thì để cho bản sao lưu file lo.

Kiểm tra khôi phục theo lịch

Một bản sao lưu chưa từng được khôi phục chỉ là niềm hy vọng. Mỗi tháng một lần, hoặc sau mỗi lần sửa script sao lưu:

  1. Tạo một máy chủ tạm. Tính tiền theo giờ rất hợp cho việc này; xem bài VPS theo giờ hay theo tháng.
  2. Cài restic hoặc borg, trỏ tới repository và khôi phục bản mới nhất vào thư mục tạm: restic restore latest --target /tmp/restore-test.
  3. Nạp bản dump cơ sở dữ liệu và khởi động ứng dụng.
  4. Ghi lại thời gian thực hiện. Đó là thời gian khôi phục thật của bạn.
  5. Xoá máy chủ tạm để không bị tính phí tiếp.

Hãy thử cả việc khôi phục một file đơn lẻ từ vài tuần trước. Phần lớn lần khôi phục thực tế là "hôm qua lỡ xoá file cấu hình", chứ không phải mất trắng.

Kế hoạch sao lưu VPS cho một máy chủ nhỏ

  • Dump cơ sở dữ liệu lúc 03:00 mỗi đêm, sao lưu file bằng restic hoặc borg lúc 03:15.
  • Giữ 7 bản hằng ngày, 4 bản hằng tuần và 6 bản hằng tháng.
  • Repository đặt trên máy ở vị trí khác, với thông tin đăng nhập mà web server không dùng để xoá lịch sử được.
  • Bản thứ hai đồng bộ hằng tuần sang nhà cung cấp khác hoặc máy ở văn phòng.
  • Custom image cập nhật sau mỗi thay đổi lớn.
  • Kiểm tra khôi phục hằng tháng, có ghi lại thời gian.

Nếu bạn đang cân nhắc đặt máy sao lưu ở đâu, hướng dẫn chọn vị trí VPS giúp chọn khu vực thứ hai, và bài chọn vị trí VPS theo độ trễ giải thích vì sao khoảng cách ít quan trọng với job sao lưu ban đêm hơn là với traffic người dùng. Kết hợp kế hoạch này với checklist bảo mật VPS mới để kẻ tấn công không thể đi qua máy chủ mà xoá bản sao lưu.

Câu hỏi thường gặp

Cloudj có tự động sao lưu máy chủ cho tôi không?

Đừng mặc định rằng nhà cung cấp nào cũng giữ hộ bạn một bản dữ liệu. Hãy tự chạy sao lưu ra ngoài máy chủ như hướng dẫn ở trên; Cloudj cung cấp custom image để bạn dựng lại máy chủ nhanh hơn.

RAID hoặc thêm một ổ đĩa trên cùng máy chủ có phải là sao lưu không?

Không. Nó chỉ giúp khi một ổ đĩa hỏng, không bảo vệ trước việc xoá nhầm, dữ liệu hỏng hay mất cả máy chủ. Bản sao lưu phải tách biệt và có nhiều phiên bản.

Nên chọn restic hay borg?

Chọn restic nếu bạn muốn dùng object storage hoặc nhiều loại backend. Chọn borg nếu sao lưu qua SSH tới máy bạn tự quản lý. Cả hai đều ổn định; việc kiểm tra khôi phục quan trọng hơn lựa chọn công cụ.

Nên giữ bản sao lưu bao lâu?

Đủ lâu để kịp phát hiện vấn đề. Dữ liệu hỏng âm thầm hoặc máy chủ bị xâm nhập có thể vài tuần sau mới lộ ra, nên hãy giữ các mốc hằng tháng ít nhất vài tháng.

Lên kế hoạch trước khi cần đến

Hãy thiết lập sao lưu ngay trong ngày triển khai, khi máy chủ còn nhỏ và đơn giản. Bạn có thể tạo máy chủ chính và một máy sao lưu riêng trong console Cloudj, nạp số dư bằng chuyển khoản VND, và xem giá trực tiếp cho từng vị trí trên trang bảng giá.

Triển khai máy chủ hoặc mua proxy

Chọn vị trí trong console, xem giá trực tiếp và thanh toán từ số dư tài khoản.