Sao lưu máy chủ Linux lên Object Storage bằng rclone: thiết lập lịch chạy tự động hằng đêm

Bài này dành cho quý Khách hàng đã đẩy thử được dữ liệu lên Object Storage và giờ muốn biến việc đó thành một lịch chạy tự động hằng đêm, tự báo khi hỏng, và khôi phục lại được khi thật sự cần.

Bài này không lặp lại hai bài đã có. Phần cài đặt rclone, khai cấu hình kết nối và lần đẩy thử đầu tiên nằm ở bài Sao lưu máy chủ lên Object Storage bằng rclone trên cloudzone.vn. Phần dọn bản cũ và giữ dung lượng nằm ở bài Dọn dữ liệu và giữ dung lượng Object Storage trong tầm kiểm soát trong chính chuyên mục này. Ở đây chỉ bàn phần ở giữa: biến một câu lệnh chạy tay thành một lịch chạy tự động đáng tin.

1. Lấy khoá kết nối

Mọi thứ bên dưới cần một cặp khoá lấy trong Portal Cloudzone, mục dịch vụ của gói Object Storage, nút Khoá kết nối.

Hộp thoại Khoá kết nối Object Storage trong Portal Cloudzone: endpoint, access key, secret key
Endpoint dùng chung cho mọi khách hàng, hai khoá thì riêng của từng gói. Ảnh chụp trên tài khoản thử, khoá đã được che.

Chưa có cặp khoá thì xem bài Bắt đầu với Object Storage. Chưa có cấu hình rclone thì làm theo mục 4 của bài hướng dẫn trên cloudzone.vn trước, rồi quay lại đây. Phần còn lại của bài giả định quý Khách hàng đã có một remote tên cloudzone chạy được.

2. Chọn copy hay sync: chỗ dễ mất dữ liệu nhất

Đây là quyết định quan trọng hơn mọi tuỳ chọn khác trong bài.

Lệnh Làm gì Rủi ro
rclone copy Chỉ thêm và cập nhật. Không bao giờ xoá gì trên kho Kho phình dần, phải dọn riêng
rclone sync Làm kho giống hệt nguồn, kể cả xoá Nguồn bị xoá hoặc bị mã hoá thì lượt chạy kế tiếp xoá luôn bản trên kho

Với bản sao lưu, mặc định nên dùng copy. Mã độc tống tiền mã hoá dữ liệu trên máy chủ lúc 2 giờ sáng, sync chạy lúc 3 giờ sáng sẽ cần mẫn chép bản đã bị mã hoá đè lên kho và xoá những gì không còn ở nguồn. Lúc đó kho dự phòng không còn là dự phòng nữa.

Chỉ dùng sync khi đang nhân bản một thư mục tĩnh mà bản trên kho bắt buộc phải khớp từng tệp, và luôn chạy thử trước:

rclone sync /var/www cloudzone:abc-sao-luu-web/web --dry-run

--dry-run in ra những gì sẽ làm mà không làm thật. Dòng nào bắt đầu bằng Deleted là dòng cần đọc kỹ.

3. Cơ sở dữ liệu phải xuất ra tệp trước, đừng chép thẳng thư mục

Chép thẳng /var/lib/mysql khi dịch vụ đang chạy thì rất hay ra một bản sao lưu mở không lên. Xuất ra tệp, nén lại dưới định dạng .gz, rồi mới đẩy lên kho:

mysqldump --single-transaction --quick --routines --events \
  --all-databases | gzip > /var/sao-luu/csdl-$(date +%F).sql.gz

Với PostgreSQL:

sudo -u postgres pg_dumpall | gzip > /var/sao-luu/csdl-$(date +%F).sql.gz

--single-transaction cho bản xuất nhất quán mà không khoá bảng, dùng được với InnoDB; gzip ở cuối lệnh nén luôn kết quả thành .gz, thường giảm được phần lớn dung lượng vì tệp .sql là dữ liệu dạng chữ.

4. Kịch bản sao lưu đầy đủ

Tạo tệp /root/sao-luu.sh. Kịch bản này gộp đủ những thứ một việc chạy tự động cần có:

#!/bin/bash
set -euo pipefail

KHO=cloudzone:abc-sao-luu-web
TAM=/var/sao-luu
NHAT_KY=/var/log/sao-luu.log
NGAY=$(date +%F)

mkdir -p "$TAM"

# Khong cho hai luot chay chong len nhau
exec 9>/var/lock/sao-luu.lock
flock -n 9 || { echo "$(date +%F' '%T) luot truoc chua xong, bo qua" >> "$NHAT_KY"; exit 0; }

{
  echo "=== bat dau $NGAY $(date +%T) ==="

  mysqldump --single-transaction --quick --routines --events \
    --all-databases | gzip > "$TAM/csdl-$NGAY.sql.gz"

  rclone copy "$TAM" "$KHO/csdl" --log-level INFO

  rclone copy /var/www "$KHO/web" \
    --exclude "*.log" \
    --exclude "cache/**" \
    --exclude "node_modules/**" \
    --exclude "vendor/**" \
    --transfers 8 --checkers 16 \
    --log-level INFO

  rm -f "$TAM/csdl-$NGAY.sql.gz"

  echo "=== xong $(date +%T) ==="
} >> "$NHAT_KY" 2>&1

Ba dòng đáng để ý:

  • set -euo pipefail – gặp lỗi là dừng ngay. Thiếu dòng này thì lệnh xuất cơ sở dữ liệu hỏng nhưng kịch bản vẫn chạy tiếp và vẫn đẩy một tệp rỗng lên kho, rồi báo thành công.
  • flock – lượt chạy đêm trước chưa xong thì bỏ qua lượt này. Dữ liệu lớn dần, sớm muộn sẽ có đêm chạy quá 24 giờ, và hai lượt chồng nhau làm tải máy chủ tăng gấp đôi đúng lúc không nên.
  • rm -f tệp tạm – nếu không, ổ đĩa máy chủ đầy vì chính bản sao lưu.

Cấp quyền chạy cho tệp bằng chmod +x /root/sao-luu.sh, rồi chạy thử một lượt bằng tay trước khi đem đi hẹn giờ.

5. Hẹn giờ bằng systemd timer

Cron chạy được, nhưng systemd timer có ba thứ cron không có: nhật ký gộp chung với nhật ký hệ thống, trạng thái lần chạy gần nhất xem được bằng một lệnh, và Persistent – máy tắt đúng giờ hẹn thì chạy bù khi bật lại.

Tạo /etc/systemd/system/sao-luu.service:

[Unit]
Description=Sao luu len Object Storage

[Service]
Type=oneshot
ExecStart=/root/sao-luu.sh

Tạo /etc/systemd/system/sao-luu.timer:

[Unit]
Description=Chay sao luu hang dem

[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
RandomizedDelaySec=600

[Install]
WantedBy=timers.target

Bật lên:

systemctl daemon-reload
systemctl enable --now sao-luu.timer
systemctl list-timers sao-luu.timer

Xem lần chạy gần nhất đã làm gì:

systemctl status sao-luu.service
journalctl -u sao-luu.service --since today

6. Phải biết khi việc hỏng

Một lịch sao lưu tự động mà không báo gì khi hỏng thì tệ hơn không có, vì người ta tin là đang có bản sao lưu. Thêm một đơn vị OnFailure để systemd tự báo:

[Unit]
Description=Sao luu len Object Storage
OnFailure=bao-hong@%n.service

Rồi tạo /etc/systemd/system/bao-hong@.service, trong đó ExecStart gọi một lệnh gửi tin của quý Khách hàng: gửi thư, gọi webhook, hay nhắn vào nhóm trực. Cách nào cũng được, miễn là nó đến được chỗ có người đọc.

Cách tối thiểu mà không cần hạ tầng gì thêm: mỗi sáng xem một dòng.

systemctl is-failed sao-luu.service
rclone lsl cloudzone:abc-sao-luu-web/csdl | tail -3

Dòng thứ hai cho biết tệp mới nhất trên kho có đúng là của đêm qua không. Đây là phép kiểm thật, vì nó đọc trên kho chứ không đọc nhật ký ở máy chủ.

7. Bản sao lưu chỉ có giá trị khi khôi phục được

Đối chiếu hai bên bằng rclone check:

rclone check /var/www cloudzone:abc-sao-luu-web/web --one-way \
  --exclude "*.log" --exclude "cache/**" \
  --exclude "node_modules/**" --exclude "vendor/**"

--one-way chỉ xét thiếu theo chiều nguồn lên kho, không báo những gì chỉ có trên kho – đúng với cách copy làm việc.

Mỗi quý nên khôi phục thử một lần, trên máy khác, không phải máy đang chạy:

rclone copy cloudzone:abc-sao-luu-web/csdl/csdl-2026-10-24.sql.gz /tmp/thu
gunzip -c /tmp/thu/csdl-2026-10-24.sql.gz | mysql -u root csdl_thu

Chưa khôi phục thử lần nào thì chưa biết mình có bản sao lưu hay không.

8. Băng thông và tốc độ

Tuỳ chọn Dùng khi
--bwlimit 20M Sao lưu ban ngày, không muốn chiếm hết đường truyền của website
--bwlimit "08:00,10M 22:00,off" Giới hạn theo khung giờ, ban đêm thả hết
--transfers 8 --checkers 16 Nhiều tệp nhỏ. Tăng số tệp gửi song song
--s3-chunk-size 64M Tệp rất lớn. Mỗi phần gửi to hơn thì ít lượt gọi hơn, nhưng tốn RAM hơn
--retries 5 --low-level-retries 20 Đường truyền hay ngắt

Đừng tăng --transfers quá tay. Mỗi luồng ăn một phần RAM và một phần đường truyền; đặt 32 trên một máy chủ nhỏ thường làm chậm cả website đang chạy trên đó.

9. Mã hoá trước khi đẩy

Dữ liệu nhạy cảm thì mã hoá ngay tại máy chủ, trước khi rời máy. Khai thêm một remote dạng crypt chồng lên remote sẵn có:

rclone config
# chon n (new remote), ten: kho-mat
# chon type: crypt
# remote: cloudzone:abc-sao-luu-web/mat
# dat mat khau va mat khau thu hai, LUU LAI CHO KHAC

Rồi dùng kho-mat: thay cho cloudzone: trong kịch bản.

Mất mật khẩu crypt là mất dữ liệu. Không ai mở lại được, kể cả Cloudzone – đó chính là điểm của cách làm này. Lưu mật khẩu ở nơi khác máy chủ và khác kho.

10. Giữ bao nhiêu bản, và dọn thế nào

Kịch bản ở trên chỉ thêm chứ không xoá, nên dung lượng sẽ tăng đều. Cách đặt quy tắc giữ theo tuổi dữ liệu, dọn phần tải dở dang và theo dõi dung lượng theo tháng nằm ở bài Dọn dữ liệu và giữ dung lượng Object Storage trong tầm kiểm soát trong chuyên mục này.

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

Nên chạy lúc mấy giờ? Lúc máy rảnh nhất, thường là 2 tới 4 giờ sáng. Nhiều máy chủ cùng đẩy lên một lúc thì thêm RandomizedDelaySec như ví dụ ở mục 5 để chúng lệch nhau.

Sao lưu đang chạy mà máy chủ khởi động lại thì sao? Lượt đó dở dang. Lượt kế tiếp copy sẽ gửi tiếp phần còn thiếu, không gửi lại từ đầu những tệp đã xong. Phần tải lên dở dang của tệp đang gửi lúc đứt thì xem mục 4 của bài dọn dữ liệu.

Một gói Object Storage dùng cho nhiều máy chủ được không? Được. Mỗi máy đẩy vào một prefix riêng, ví dụ web-01/ và web-02/, để sau này tìm và dọn theo từng máy.

Rclone báo SignatureDoesNotMatch hoặc AccessDenied thì sao? Xem bài Lỗi thường gặp khi kết nối Object Storage và cách xử lý trong chuyên mục này, có đủ 12 mã lỗi hay gặp kèm cách xử lý.

Dung lượng gói sắp đầy? Mua thêm dung lượng hoặc nâng gói ngay trong Portal, dữ liệu và khoá giữ nguyên, không phải cấu hình lại rclone.

Quý Khách hàng cần Cloudzone hỗ trợ dựng việc sao lưu cho máy chủ của mình, vui lòng nhắn qua ô chat trên trang Cloudzone.

Bài liên quan trong chuyên mục Object Storage

Hướng dẫn này có ích cho bạn?

Cần đặt dịch vụ? Xem cấu hình và giá tại bảng giá Cloudzone - đặt gói trực tuyến, nhận dịch vụ ngay sau thanh toán. Cần tư vấn, mở khung chat ở góc phải màn hình.

Hướng dẫn liên quan