Làm chủ Rsync trên Linux: Đồng bộ qua SSH, tối ưu băng thông và sao lưu gia tăng

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Bắt đầu nhanh (5 phút)

Chuyển hàng chục gigabyte giữa các server bằng các công cụ tiêu chuẩn như cp hoặc scp chẳng khác nào một canh bạc. Kết nối SSH bị ngắt sẽ buộc bạn phải bắt đầu lại từ đầu. Tệ hơn nữa, chúng ghi đè một cách mù quáng từng byte của một bản dump database 40 GB dù cho chỉ có 2 KB bị thay đổi. Đó là lý do tại sao rsync (remote sync) vẫn là công cụ thiết yếu đối với các sysadmin và đội ngũ DevOps: thuật toán delta-transfer của nó đối chiếu các file ở cả hai đầu và chỉ truyền phần khác biệt qua mạng.

Trước tiên, hãy đảm bảo rsync đã có mặt trên cả máy local và máy đích:

# Debian / Ubuntu
sudo apt update && sudo apt install -y rsync

# RHEL / Rocky Linux / AlmaLinux
sudo dnf install -y rsync

Cú pháp cơ bản rất đơn giản:

rsync [OPTIONS] SOURCE DESTINATION

Quy tắc vàng về dấu gạch chéo cuối dòng (Trailing Slash)

Hãy chú ý đến dấu gạch chéo ở cuối đường dẫn. Việc thiếu hoặc thừa một dấu / duy nhất là nguyên nhân phổ biến nhất dẫn đến việc lồng thư mục ngoài ý muốn trên Linux:

# Không có dấu gạch chéo cuối: sao chép thư mục 'mydata' vào trong '/backup'
# Kết quả: /backup/mydata/file.txt
rsync -av /var/www/mydata /backup

# Có dấu gạch chéo cuối: sao chép *nội dung bên trong* 'mydata' trực tiếp vào '/backup'
# Kết quả: /backup/file.txt
rsync -av /var/www/mydata/ /backup

Lần đồng bộ từ xa đầu tiên qua SSH

Để kéo các thư mục log từ máy chủ production về an toàn, hãy kết hợp các cờ lưu trữ chuẩn với giao thức SSH:

rsync -avz -e ssh [email protected]:/var/log/nginx/ /opt/logs/remote-nginx/

Mỗi cờ đảm nhiệm một nhiệm vụ riêng biệt: -a giữ nguyên file mode, timestamp, symlink và quyền sở hữu; -v hiển thị chi tiết tiến trình (verbose); và -z nén payload gói tin trong quá trình truyền tải để tiết kiệm băng thông mạng.

Phân tích chuyên sâu: Các cờ cốt lõi và truyền dữ liệu từ xa an toàn

Khi chạy đồng bộ trên các phân vùng production, bạn cần hiểu rõ từng cờ tác động như thế nào đến trạng thái của filesystem.

Các cờ vận hành thiết yếu

  • -a (Chế độ lưu trữ – Archive mode): Gom chung các cờ -rlptgoD. Cờ này đồng bộ file đệ quy, giữ nguyên symlink, quyền truy cập (permissions), timestamp, owner, group cũng như các device node.
  • -P (Tiến trình và phần dở dang – Progress and Partial): Kết hợp giữa --progress và --partial. Bạn sẽ thấy thanh tiến trình trực quan hiển thị tốc độ truyền và thời gian ước tính (ETA). Nếu kết nối bị đứt giữa chừng khi đang truyền file ISO 8 GB, rsync sẽ giữ lại phần file đã tải và tiếp tục tải từ chính xác vị trí byte bị ngắt vào lần chạy tiếp theo.
  • --delete: Xóa các file ở thư mục đích nếu chúng không còn tồn tại ở nguồn. Cờ này đảm bảo bản sao chuẩn 1:1, nhưng hãy kiểm tra thật kỹ đường dẫn đích trước khi thực thi.
  • -h (Dễ đọc – Human-readable): Chuyển đổi các số đếm byte thô sang đơn vị dễ đọc như 512 MB hoặc 3.4 GB.

Thực thi an toàn với Dry Run

Tuyệt đối không chạy lệnh đồng bộ có --delete trên dữ liệu thật khi chưa thử nghiệm. Hãy kiểm tra logic đường dẫn trước bằng cờ -n (dry run) kết hợp với -i (liệt kê chi tiết thay đổi):

rsync -avzPhn --delete /data/project/ [email protected]:/storage/project/

Chế độ dry run sẽ phân tích mọi quy tắc include và exclude rồi in ra những hành động dự kiến mà không chạm vào bất kỳ file nào trên đĩa.

Tùy biến cấu hình SSH

Các máy chủ bastion được gia cố bảo mật thường lắng nghe trên cổng không mặc định hoặc yêu cầu SSH key riêng. Bạn có thể truyền trực tiếp các tham số kết nối tùy chỉnh vào cờ -e:

rsync -avzP -e "ssh -p 2222 -i /home/deploy/.ssh/backup_rsa" /etc/app/ backup-node:/remote-backups/app/

Sử dụng nâng cao: Tối ưu băng thông và sao lưu gia tăng

Chuyển một bản dump database 120 GB qua đường truyền WAN dùng chung rất dễ làm nghẽn uplink, rớt gói VoIP và làm chậm phản hồi của người dùng. Bạn có thể ngăn chặn tắc nghẽn mạng bằng cách giới hạn băng thông và tiết kiệm dung lượng đĩa bằng hard link của filesystem.

Giới hạn băng thông (Bandwidth Throttling)

Tùy chọn --bwlimit thiết lập mức trần cho tốc độ truyền tải tính bằng kilobyte trên giây. Để giới hạn quá trình đồng bộ sang máy chủ ngoài ở mức khoảng 5 MB/s (40 Mbps):

# Giới hạn thông lượng ở mức 5.000 KB/s (~5 MB/s)
rsync -avzP --bwlimit=5000 /var/backups/db.sql offsite-storage:/backups/

Điều này giúp các tác vụ truyền file dung lượng lớn không chiếm dụng hết đường truyền của ứng dụng đang chạy trong giờ làm việc.

Sao lưu gia tăng thông minh bằng Hard Link

Thực hiện sao lưu toàn bộ (full backup) mỗi đêm sẽ nhanh chóng làm cạn kiệt dung lượng ổ cứng. Các phương pháp sao lưu gia tăng truyền thống tuy tiết kiệm dung lượng nhưng việc khôi phục file từ chuỗi snapshot nhiều tầng lại chậm chạp và dễ xảy ra lỗi. Rsync mang đến một giải pháp dung hòa hoàn hảo thông qua --link-dest.

Khi tạo bản snapshot hàng ngày, rsync sẽ đối chiếu với thư mục của ngày hôm trước. Nếu một file không thay đổi về kích thước hoặc timestamp, rsync sẽ tạo một hard link tới inode của file đã có sẵn thay vì ghi các block dữ liệu mới. Các file không đổi hoàn toàn không tiêu tốn thêm block lưu trữ nào trên đĩa.

Trong một thử nghiệm trên server Ubuntu 22.04 theo dõi thư mục 50 GB với tỷ lệ thay đổi 3% mỗi ngày, quá trình sao lưu hàng ngày hoàn tất chỉ trong chưa đầy 45 giây. Mỗi bản snapshot hiển thị như một thư mục độc lập đầy đủ dữ liệu, giúp việc khôi phục đơn giản như một lệnh cp hoặc tar thông thường.

Script sao lưu gia tăng chuẩn Production

Bạn có thể triển khai script tự động hóa sao lưu gọn nhẹ này trực tiếp vào cron:

#!/usr/bin/env bash
set -euo pipefail

# Cấu hình
SOURCE_DIR="/var/www/html/"
BACKUP_ROOT="/mnt/backups/web-app"
DATE_STAMP="$(date +%Y-%m-%d_%H%M%S)"
CURRENT_BACKUP="${BACKUP_ROOT}/${DATE_STAMP}"
LATEST_LINK="${BACKUP_ROOT}/latest"

mkdir -p "${BACKUP_ROOT}"

# Kiểm tra xem có bản sao lưu trước đó để liên kết hay không
LINK_DEST_OPTION=""
if [ -d "${LATEST_LINK}" ]; then
    LINK_DEST_OPTION="--link-dest=${LATEST_LINK}"
fi

# Chạy đồng bộ gia tăng
rsync -a --delete \
    ${LINK_DEST_OPTION} \
    --exclude="*.log" \
    --exclude="cache/" \
    "${SOURCE_DIR}" "${CURRENT_BACKUP}"

# Trỏ symlink 'latest' sang snapshot mới một cách nguyên tử
rm -f "${LATEST_LINK}"
ln -s "${CURRENT_BACKUP}" "${LATEST_LINK}"

echo "Sao lưu hoàn tất thành công: ${CURRENT_BACKUP}"

Cấp quyền thực thi cho script và lên lịch chạy vào lúc 2:00 sáng mỗi đêm:

chmod +x /usr/local/bin/backup-app.sh

# Mở trình chỉnh sửa crontab
sudo crontab -e

# Thêm dòng lập lịch:
0 2 * * * /usr/local/bin/backup-app.sh >> /var/log/backup-app.log 2>&1

Tăng cường bảo mật và tối ưu hiệu năng trong Production

Khi chạy rsync trên các hệ thống file production quy mô lớn, hãy lưu ý những chi tiết vận hành sau:

1. Tổ chức danh sách loại trừ trong file riêng

Các chuỗi cờ --exclude inline quá dài sẽ khiến shell script trở nên rối rắm, khó đọc. Thay vào đó, hãy đặt các pattern vào một file text chuyên dụng:

# /etc/rsync-excludes.txt
.git/
*.tmp
node_modules/
storage/logs/*
cache/*

Nạp danh sách này bằng tùy chọn --exclude-from:

rsync -avz --exclude-from="/etc/rsync-excludes.txt" /var/www/app/ /storage/app/

2. Bảo vệ I/O hệ thống bằng Nice và Ionice

Duyệt qua hàng triệu inode của file và tạo checksum sẽ gây ra tranh chấp tài nguyên đĩa rất lớn. Trên một máy chủ web hoặc database đang chịu tải cao, một tác vụ sao lưu đột ngột có thể làm tăng vọt thời gian chờ I/O (I/O wait) và gây ra lỗi timeout HTTP 504. Hãy giảm độ ưu tiên CPU và block I/O bằng nice và ionice:

# Giảm độ ưu tiên lập lịch CPU (nice 19) và gán mức ưu tiên đĩa khi rảnh rỗi (ionice -c 3)
nice -n 19 ionice -c 3 rsync -a /heavy-data/ /backup/heavy-data/

3. Giải phóng nghẽn cổ chai CPU trên mạng LAN tốc độ cao

Trên kết nối mạng 10GbE, quá trình mã hóa SSH thường chạm ngưỡng giới hạn của CPU trước khi băng thông mạng bị bão hòa. Ngoài ra, việc nén dữ liệu với cờ -z cũng gây lãng phí chu kỳ xử lý của CPU trên mạng nội bộ tốc độ cao đối với các file ảnh hoặc video vốn đã được nén sẵn. Nếu đang đồng bộ qua một mạng VLAN riêng tin cậy, hãy chuyển sang một stream cipher hiệu năng cao như [email protected] hoặc [email protected] và bỏ cờ -z:

rsync -av -e "ssh -c [email protected]" /srv/media/ remote-box:/srv/media/

Những tinh chỉnh này giúp việc truyền dữ liệu diễn ra nhanh chóng, tiết kiệm dung lượng lưu trữ và đảm bảo quy trình sao lưu diễn ra ổn định mà không làm suy giảm hiệu năng của các dịch vụ production.

Share: