4. rsync本地与远程备份

rsync 是 RHEL 系统中最常用的文件级备份与同步工具,它既能做本地目录镜像,也能通过 SSH 在主机之间加密传输。与 cp、tar 相比,rsync 的核心价值在于“只传差异”:第一次同步可能传输大量数据,后续同步只发送发生变化的部分,因此非常适合日常增量备份、远程站点同步以及基于硬链接的快照式备份。

增量同步算法:滚动校验与差异块传输

rsync 的增量算法基于“滚动校验 + 强校验”的两级比对。发送端把源文件按固定块大小切分,对每个块计算弱校验(滚动校验)和强校验(MD5 或 xxHash 类)。接收端对已有目标文件同样分块计算校验,并把校验值列表回传给发送端。发送端在源文件中滑动窗口,寻找与目标文件匹配的块;匹配上的块不传输,只传输不匹配的新数据块和匹配位置指令。接收端根据这些指令重组文件,最终得到与源一致的内容。

这种机制的关键参数是块大小。rsync 默认根据文件大小自动选择块大小,通常从 700 字节到 128 KB 不等。对于大文件频繁小改的场景,较小的块能提高匹配率,但校验计算量增加;对于变化较大的文件,块大小影响有限。实际使用中一般不需要手动指定,除非面对超大文件或特殊存储介质。

rsync 增量同步:滚动校验与差异块传输 源文件(发送端) 块A 块B 块C' 块D 块C 被修改为 C',其余块未变 弱校验 + 强校验逐块比对 目标文件(接收端) 块A 块B 块C 块D 已有块A、B、C、D 回传校验列表给发送端 仅传输差异 块A、B、D 匹配 → 不传 块C' 不匹配 → 传输新数据 校验列表回传 接收端重组结果 块A + 块B + 新块C' + 块D 目标文件与源文件完全一致

排除规则:控制同步范围

实际备份中,并非所有文件都需要同步。rsync 提供 --exclude、--include、--exclude-from 等选项来定义排除规则。规则按顺序匹配,先匹配到的规则生效,因此 include 通常要放在 exclude 之前。常见排除对象包括缓存目录、临时文件、日志、挂载点以及版本控制目录。

rsync -av --delete \
  --exclude='*.tmp' \
  --exclude='cache/' \
  --exclude='.git/' \
  --exclude-from='/etc/rsync-exclude.txt' \
  /data/ /backup/data/

排除文件每行一条规则,支持通配符和目录结尾斜杠。需要注意,--exclude='cache/' 只排除名为 cache 的目录,而 --exclude='cache' 会同时排除同名文件和目录。若希望排除某目录但保留其中特定子目录,可用 include 先放行再排除父目录。

硬链接快照:空间高效的版本保留

rsync 的 --link-dest 选项可以实现硬链接快照。每次备份时,未变化的文件不再复制数据,而是与上一次备份中的同名文件建立硬链接,只有变化的文件才占用新空间。这样既能保留多个时间点的完整目录视图,又能大幅节省磁盘。

rsync -av --delete \
  --link-dest=/backup/data/2025-01-01 \
  /data/ /backup/data/2025-01-02/

执行后,/backup/data/2025-01-02/ 中未变化的文件与 2025-01-01 共享 inode,变化文件则是新副本。用 ls -li 可观察 inode 是否相同,用 du -sh 可看到新快照实际占用远小于全量大小。注意 --link-dest 要求目标路径为绝对路径,且源与目标文件属性需一致才能建立硬链接。

通过 SSH 加密传输与断点续传

远程同步时,rsync 默认通过远程 shell 传输。使用 SSH 只需在目标前加 user@host:,并可通过 -e ssh 指定端口或密钥。传输过程中若网络中断,可用 --partial 保留已传部分,配合 --append-verify 或 --partial-dir 实现断点续传。

rsync -avz --partial --progress \
  -e 'ssh -p 2222 -i /root/.ssh/backup_key' \
  /data/ backup@192.168.10.20:/backup/data/

--partial 让 rsync 保留未完成的临时文件,下次同步时从断点继续;--progress 显示传输进度和速率;-z 在传输时压缩数据,适合文本类文件,但对已压缩文件效果有限。若希望更严格的续传校验,可使用 --append-verify,它会在续传后校验已有部分,避免因文件变化导致错误拼接。

带宽限制与结果判断

生产环境中,备份不应占满业务带宽。rsync 提供 --bwlimit 限制传输速率,单位是 KB/s。例如限制为 5 MB/s 可写 --bwlimit=5000。该限制作用于 rsync 进程的整体传输,适合在业务高峰期限速,夜间再放开。

rsync -av --bwlimit=5000 --partial \
  /data/ backup@192.168.10.20:/backup/data/

判断同步是否成功,可观察退出码:0 表示成功,23 表示部分文件未传输,24 表示源文件在传输中消失,30 表示超时。结合 --itemize-changes 可看到每个文件的变化类型,如 >f+++++++++ 表示新文件,>f.st...... 表示内容变化。日常备份脚本中应检查退出码并记录日志,确保异常可追溯。

建议将排除规则、SSH 密钥、带宽限制和日志检查写入固定备份脚本,配合 cron 或 systemd timer 定时执行,形成可重复、可审计的备份流程。