Rsync 文件同步与增量备份 — 运维的数据守门员

📖 知识点简介

Rsync(Remote Sync)是 Linux 下最强大的文件同步工具,增量传输、差量拷贝、断点续传是其核心利器。结合 SSH 使用可实现安全的远程备份方案,是运维备份体系中最基础也最常用的一环。


🛠️ 核心命令整理

1. Rsync 参数速查

参数 含义 常用度
-a 归档模式(递归 + 保留权限/时间/属主等) ⭐⭐⭐
-v 输出详细同步信息 ⭐⭐⭐
-z 传输时压缩 ⭐⭐⭐
-P --partial --progress 合体,显示进度 + 断点续传 ⭐⭐⭐
--delete 删除目标目录中源没有的文件(保持严格一致) ⭐⭐
--exclude 排除指定文件/目录 ⭐⭐⭐
--link-dest 硬链接增量备份(节省空间神器) ⭐⭐
-n dry-run 模拟运行,测试不实际执行 ⭐⭐⭐
--bwlimit 限制带宽(KB/s),防止占满业务带宽 ⭐⭐
-e 指定远程 shell(默认 SSH,可自定义端口) ⭐⭐

2. 本地同步

bash 复制代码
# 基本同步:将源目录同步到目标目录
rsync -av /data/source/ /data/backup/

# 注意斜杠差异:
# 带斜杠 /data/source/  → 同步目录内容
# 不带斜杠 /data/source → 同步目录本身
# 结果:/data/backup/file.txt        (带斜杠)
# 结果:/data/backup/source/file.txt (不带斜杠)

# 带进度条 + 压缩
rsync -avzP /data/source/ /data/backup/

3. 远程同步(基于 SSH)

bash 复制代码
# 推送到远程服务器
rsync -avzP /data/local/ user@remote:/data/backup/

# 从远程拉取
rsync -avzP user@remote:/data/remote/ /data/local_copy/

# 指定 SSH 端口(默认 22 时无需 -e)
rsync -avzP -e "ssh -p 22222" /data/ user@host:/data/

# 指定密钥文件
rsync -avzP -e "ssh -i ~/.ssh/id_ed25519 -p 22222" /data/ user@host:/data/

📋 实操示例

场景 1:网站目录每日增量备份脚本

bash 复制代码
#!/bin/bash
# /usr/local/bin/backup_web.sh
# 功能:每日增量备份 /var/www/html 到 /backup/web/

SRC="/var/www/html/"
DST="/backup/web/"
LOG="/var/log/rsync_web.log"
DATE=$(date "+%Y-%m-%d %H:%M:%S")

echo "[$DATE] Starting backup..." >> "$LOG"

rsync -avzP --delete \
  --exclude="cache/" \
  --exclude=".tmp/" \
  --exclude="*.log" \
  "$SRC" "$DST" >> "$LOG" 2>&1

if [ $? -eq 0 ]; then
  echo "[$DATE] Backup completed successfully" >> "$LOG"
else
  echo "[$DATE] Backup FAILED!" >> "$LOG"
fi

加入 crontab 每天凌晨 3 点执行:

bash 复制代码
0 3 * * * /usr/local/bin/backup_web.sh

场景 2:硬链接增量备份(类比 macOS Time Machine)

利用 --link-dest 实现全量备份的体验、增量备份的存储:

bash 复制代码
#!/bin/bash
# /usr/local/bin/backup_hardlink.sh
# 功能:硬链接增量备份 /data/project

SRC="/data/project/"
BASE="/backup/project"
DATE=$(date +%Y%m%d_%H%M%S)
DST="$BASE/$DATE"
LATEST=$(ls -1d "$BASE"/*/ 2>/dev/null | tail -1)

mkdir -p "$BASE"

# 首次备份
if [ -z "$LATEST" ]; then
  rsync -avzP "$SRC" "$DST"
  echo "[$DATE] Full backup done -> $DST"
else
  rsync -avzP --link-dest="$LATEST" "$SRC" "$DST"
  echo "[$DATE] Incremental backup done -> $DST (based on $LATEST)"
fi

# 只保留最近 7 天
find "$BASE" -maxdepth 1 -type d -mtime +7 -exec rm -rf {} ;

第一次跑是全量,后续每次只存差异部分。未修改的文件通过硬链向上一版本,空间近乎零增长

场景 3:断点续传 + 带宽限制(传输大文件)

bash 复制代码
# 10MB 日志文件半路断了?--partial 从断点接着传
rsync -avP --partial --bwlimit=1024 /data/bigfile.log user@remote:/backup/

# bwlimit=1024 ≈ 1MB/s,白天跑不影响业务
# 不加 --bwlimit 会打满带宽,慎用

场景 4:模拟运行校验

bash 复制代码
# -n(dry-run)检查会同步哪些文件,不做实际传输
rsync -avzn --delete /data/source/ /data/backup/

生产环境一定要先 dry-run!--delete 时尤其小心,一次误操作可能清空目标目录。


⚠️ 常见坑点 & 注意事项

  1. 斜杠 / 决定目录层级 --- 这是 rsync 最容易踩的坑。src/ vs src 结果完全不同。写脚本时统一用带斜杠的写法,行为更容易预测。

  2. --delete 必须配合 dry-run 使用 --- rsync -av --delete 会把目标中有但源没有的文件全部删掉。如果源路径写错了,后果很严重。每次跑 --delete 前先加 -n 模拟一遍。

  3. --exclude 模式注意路径是相对源目录的 --- 不要写成绝对路径。例如同步 /var/www/html/ 时排除缓存:

    bash 复制代码
    # ✅ 正确
    rsync -av --exclude="cache/" /var/www/html/ /backup/
    
    # ❌ 错误
    rsync -av --exclude="/var/www/html/cache/" /var/www/html/ /backup/
  4. SSH 传输大文件时网络不稳定 --- 建议加 -P(= --partial --progress),万一断了重跑会自动续传。配合 screentmux 使用更稳妥,防止终端关闭中断传输。

  5. 文件变化监控用 inotify + rsync 替代定时任务 --- 如果文件变化频繁且需要实时同步,crontab 定频不够及时。可以用 inotifywait 监听文件变化后触发 rsync:

    bash 复制代码
    # 需安装 inotify-tools
    while inotifywait -r -e modify,create,delete /data/watch/; do
      rsync -avz /data/watch/ user@remote:/backup/
    done
  6. Rsync daemon 模式(rsync://) --- 除了 SSH 隧道,rsync 还支持走自己的 873 端口作为 daemon 服务。配置 /etc/rsyncd.conf 可实现模块化分享,但这会暴露端口在外网,建议仅在内网使用,外网务必走 SSH 隧道。

  7. 备份脚本注意日志记录 --- 不加日志,出问题了根本不知道备份有没有执行成功。建议同时记录退出码并配合告警(如邮件/企业微信通知)。


Rsync 是运维工具箱里的瑞士军刀:增量、差量、远程、限速、断点续传,一个命令全搞定。搭配 SSH 加密传输,就是最轻量的异地灾备方案。

相关推荐
苏三说技术1 小时前
推荐一个牛逼的智能代码审查系统
后端
倾颜1 小时前
从 GitHub Actions 到本地兜底发布:AI Mind 容器化上线的一次真实收口
后端
像我这样帅的人丶你还1 小时前
Java 后端详解(二):注解、参数绑定、评论与用户认证
后端
用户762352425911 小时前
深入理解AQS之独占锁ReentrantLock
后端
用户762352425911 小时前
理解 CAS & Atomic 原子操作类
后端
SimonKing2 小时前
铁子,IntelliJ IDEA 2026.1.3来了,升不升?
java·后端·程序员
铁皮饭盒2 小时前
@kognitivedev/rag, 用js做AI Agent开发
javascript·后端
IT_陈寒2 小时前
JavaScript的默认参数挖坑实录,我掉进去了
前端·人工智能·后端
陈明勇3 小时前
Go 1.26 新特性回顾:语言增强、工具升级与 Green Tea GC 默认启用
后端·go