如何使用 rsync 增量备份网站文件

rsync 是 Linux 下强大的文件同步工具,支持增量备份,能有效节省存储和带宽。本文介绍其增量原理、常用命令、排除规则、自动化脚本及恢复验证方法,并讨论其适用边界。

如何使用 rsync 增量备份网站文件
封面图:ZuCDN · ZuCDN 原创

网站文件备份是运维的底线,而 rsync 增量备份 是 Linux 服务器上最常用的文件同步方案。它能只传输变化的部分,大幅节省时间和带宽。但 rsync 并非万能,它只负责文件同步,不处理数据库备份,也不等同于“版本控制”。在开始之前,请明确:本文只讨论文件层面的增量备份,不涉及数据库、配置或系统镜像;且 rsync 依赖源端和目标端的网络连通性,若目标端不在线,备份将失败。

rsync 增量备份的工作原理

rsync 的核心是“差异传输”:它通过对比源文件和目标文件的元数据(如大小、修改时间)或校验和,只传输发生变化的部分。增量备份的意义在于,每次备份仅复制新增或修改的文件,而非全量拷贝。要实现真正的增量,通常结合 --link-dest 选项,它会在目标目录中创建硬链接,指向上次备份中未变化的文件,从而在保留多个历史版本的同时,几乎不占用额外空间。

需要注意,rsync 的增量是“文件级别”的,而非“块级别”(除非使用 --block-size 等高级选项)。这意味着,如果一个文件内部有少量修改,rsync 仍可能传输整个文件(除非使用 --inplace--partial)。对于大多数网站文件(如 PHP、HTML、图片),文件级增量已足够。

基础命令:全量同步与增量同步

最简单的全量同步命令如下,它将本地目录同步到远程服务器:

rsync -avz /path/to/source/ user@remote:/path/to/destination/
  • -a:归档模式,保留权限、时间戳等。
  • -v:显示详细输出。
  • -z:传输时压缩,节省带宽。

要实现增量备份并保留历史版本,可以使用 --link-dest

rsync -avz --link-dest=/backup/current /path/to/source/ /backup/backup-$(date +%Y%m%d)/

这里,/backup/current 是上一次备份的目录,新备份会硬链接到未变化的文件。执行后,将新备份目录重命名为 current,以便下次使用。这样,每个备份目录看起来都是完整的,但实际只占用变化部分的空间。

排除不需要备份的文件

网站目录中常包含缓存、日志、临时文件等,它们会频繁变化且无需备份。使用 --exclude 可以跳过这些目录:

rsync -avz --exclude='cache/' --exclude='*.log' --exclude='tmp/' /path/to/source/ user@remote:/backup/

也可以将排除规则写入文件:

rsync -avz --exclude-from='/path/to/exclude-list.txt' /source/ /dest/

排除文件每行一条规则,支持通配符。合理的排除规则能显著减少备份体积和耗时,但需谨慎:不要排除重要配置或用户上传内容。

自动化增量备份脚本

手动执行备份不可靠,应编写脚本并配合 cron 定时任务。以下是一个简单的脚本示例:

#!/bin/bash
BACKUP_ROOT="/backup"
CURRENT="$BACKUP_ROOT/current"
TIMESTAMP=$(date +%Y%m%d%H%M%S)
NEW="$BACKUP_ROOT/$TIMESTAMP"
rsync -avz --link-dest="$CURRENT" /var/www/html/ "$NEW"
rm -f "$CURRENT"
ln -s "$NEW" "$CURRENT"
# 可选:删除超过 30 天的备份
find "$BACKUP_ROOT" -maxdepth 1 -type d -mtime +30 -exec rm -rf {} ;

将此脚本加入 crontab:

0 2 * * * /usr/local/bin/backup.sh

注意:脚本中的 --link-dest 要求目标目录在同一文件系统上,否则硬链接会失效。此外,备份到远程服务器时,--link-dest 无法使用,因为硬链接不能跨文件系统(除非目标端支持)。对于远程备份,可以考虑 rsync --partial --append 等选项,但增量特性会减弱。

验证备份完整性与恢复演练

备份的价值在于恢复。定期验证备份目录的完整性至关重要。可以使用 rsync -avnc --delete 对比源和目标,确认无差异:

rsync -avnc --delete /source/ /backup/current/

恢复演练同样重要:在测试环境从备份目录恢复文件,确保网站能正常运行。WordPress 官方文档强调,备份应包括所有文件和数据库,并定期测试恢复流程(来源1)。

常见误区与失败条件

  • 误以为 rsync 能备份数据库:rsync 只处理文件,数据库需使用 mysqldump 等工具单独备份。
  • 忽略权限和时间戳:使用 -a 可保留元数据,但若目标文件系统不支持(如某些网络挂载),可能导致权限错乱。
  • 硬链接跨文件系统:如上述,--link-dest 要求同一文件系统,否则会复制而非硬链接,失去增量意义。
  • 备份目录被误删:脚本中的删除策略要谨慎,建议保留多份备份。

与网站性能的关系

备份操作本身会消耗 I/O 和带宽,可能影响网站性能。MDN 指出,性能是用户感知的加载和交互体验(来源2)。建议在低峰期执行备份,并使用 --bwlimit 限制带宽:

rsync -avz --bwlimit=1000 /source/ /dest/

结合云存储与可靠性设计

本地备份可能因磁盘故障而丢失,建议将备份同步到对象存储(如 AWS S3)。AWS 可靠性支柱强调,应设计备份的冗余性(来源3)。可以使用 s3cmd syncaws s3 sync 将备份目录同步到云,但注意这需要额外的配置。

结论

rsync 增量备份是网站文件备份的高效方案,通过 --link-dest 实现空间高效的版本管理。但需明确其边界:不处理数据库,依赖网络,且增量粒度有限。建议结合数据库备份、云存储和定期恢复演练,构建完整的备份策略。更多自动化流程可参考本站相关文章。

参考资料

延伸阅读