一、简介:为什么备份必须“增量+异地”
数据即资产:代码、数据库、图片、日志,丢一次就可能“社会性死亡”。
全量拷贝太慢:1 T 数据天天全量,硬盘和网络都扛不住。
rsync 优势:
增量算法:只传“变化块”,节省 90% 流量;
压缩/断点续传:弱网也稳;
支持本地、远程 shell、守护进程 3 种模式;
开源、无许可证费用,Linux/Win/Mac 全平台。
掌握 rsync,等于给数据上了“医保 + 高铁”:又快又省钱,还能异地容灾。
二、核心概念速通(新手 5 min 看懂)
| 术语/参数 | 一句话说明 | 类比 |
|---|---|---|
| 增量备份 (incremental) | 只拷贝“新增/修改”部分 | 只带今天写完的作业去交 |
| 镜像同步 (mirror) | 目标与源完全一致,多删少补 | 微信聊天记录漫游 |
--delete | 目标端存在、源端不存在的文件一律删除 | 保持“一模一样” |
--exclude | 排除指定文件/目录,支持通配 | 打包行李不带拖鞋 |
--link-dest | 硬链接参考目录,实现“快照”功能 | 同一文件多快照,只占 1 份物理空间 |
rsync algo | 滚动校验和,只传差异块 | 发 diff 补丁,而非整个安装包 |
| daemon 模式 | 服务端常驻 873 端口,支持匿名/账号认证 | FTP 的替代品,更快 |
三、环境准备( 10 min 搭好实验台)
3.1 实验拓扑
+-------------+ 22/873 +-------------+ | 本地节点 A | <-------> | 异地节点 B | | 192.168.1.10 | | 10.0.0.20 | +-------------+ +-------------+3.2 系统与软件
OS:CentOS 7/8、RockyLinux 9、Ubuntu 20.04+ 均可。
rsync:系统自带 v3.1.3+,建议 ≥3.2 支持
xxh128校验。SSH:默认安装,用于加密远程 shell 模式。
crontab/systemd-timer:做定时任务。
硬盘:/backup 分区 ≥ 源数据 1.2 倍,留快照余量。
3.3 免密 SSH(必做,否则定时任务卡住)
# 在 A 节点生成密钥 ssh-keygen -t ed25519 -P '' -f ~/.ssh/id_ed25519 # 拷贝公钥到 B 节点 ssh-copy-id -i ~/.ssh/id_ed25519.pub root@10.0.0.20 # 验证 ssh root@10.0.0.20 "hostname && uptime"四、实际案例与步骤(跟着敲即可)
目标:每天 02:30 把
/data/www增量同步到异地10.0.0.20:/backup/www,并保留 7 天快照。
4.1 创建基础目录(B 节点)
ssh root@10.0.0.20 ' mkdir -p /backup/www/{current,snapshots} ls -ld /backup/www/*'4.2 第一次全量(手动触发)
# 在 A 节点执行 rsync -avP \ --delete \ --exclude="*.log" \ --exclude="*.tmp" \ /data/www/ root@10.0.0.20:/backup/www/current参数拆解-a归档(递归+保留权限+时间戳)-v显示详情-P断点续传 + 进度条--delete保证两端镜像--exclude不同步日志和临时文件
4.3 利用--link-dest做快照(关键)
# 定义变量,方便阅读 REMOTE="root@10.0.0.20" TARGET="/backup/www/current" SNAP="/backup/www/snapshots/$(date +%F_%H-%M)" LINK="/backup/www/current" # 硬链接参考目录 rsync -avP \ --delete \ --exclude="*.log" \ --exclude="*.tmp" \ --link-dest=$LINK \ /data/www/ \ $REMOTE:$SNAP执行后:
如果文件未改动,在
$SNAP中只是硬链接,不额外占空间;修改过的文件,rsync 会复制新实体,未修改的继续链接到
current,实现快照 + 增量合二为一。
4.4 自动化脚本(/usr/local/bin/rsync_www.sh)
#!/bin/bash # 变量区 SRC=/data/www/ REMOTE=root@10.0.0.20 BASE=/backup/www DATE=$(date +%F_%H-%M) LOG=/var/log/rsync_www.log # 1. 先同步到 current(镜像) rsync -avP --delete --exclude='*.log' --exclude='*.tmp' \ $SRC $REMOTE:$BASE/current >> $LOG 2>&1 # 2. 再基于 current 做硬链接快照 ssh $REMOTE "mkdir -p $BASE/snapshots/$DATE" rsync -avP --link-dest=$BASE/current \ $SRC $REMOTE:$BASE/snapshots/$DATE >> $LOG 2>&1 # 3. 只保留最近 7 天快照 ssh $REMOTE "find $BASE/snapshots -maxdepth 1 -type d -mtime +7 -exec rm -rf {} +" echo "[$DATE] www backup finished" >> $LOG赋可执行权限chmod +x /usr/local/bin/rsync_www.sh
4.5 加入定时任务(crontab -e)
# 每天 02:30 执行 30 2 * * * /usr/local/bin/rsync_www.sh >/dev/null 2>&14.6 一键还原(演练灾难恢复)
# 假设 A 节点 /data/www 被误删 rsync -avP \ root@10.0.0.20:/backup/www/current/ \ /data/www/或者回滚到 3 天前的快照
rsync -avP \ root@10.0.0.20:/backup/www/snapshots/2025-12-13_02-30/ \ /data/www/五、daemon 模式(873 端口)— 多人共享备份仓库
场景:
需要匿名只读 or 账号认证;
多部门共用一台备份服务器;
不想开 SSH 账号。
5.1 服务端配置(B 节点)
# 安装 yum -y install rsync-daemon # CentOS # 或 apt install rsync # Ubuntu 已集成 daemon # 配置文件 /etc/rsyncd.conf cat >/etc/rsyncd.conf <<'EOF' uid = nobody gid = nobody use chroot = yes max connections = 20 log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock [wwwbackup] path = /backup/www/current comment = WWW mirror read only = yes auth users = backup secrets file = /etc/rsyncd.secrets EOF # 账号密码 echo 'backup:123456' > /etc/rsyncd.secrets chmod 600 /etc/rsyncd.secrets # 启动并开机自启 systemctl enable --now rsyncd5.2 客户端拉取(任意机器)
# 列出模块 rsync rsync://10.0.0.20/ # 下载 rsync -avP rsync://backup@10.0.0.20/wwwbackup/ /tmp/test/六、常见问题与解答(FAQ)
| 问题 | 现象 | 解决 |
|---|---|---|
1. 出现Permission denied (publickey) | 定时任务失败 | 确认 crontab 里使用绝对路径SSH_AUTH_SOCK,或在脚本里ssh-agent |
2.--delete误删文件 | 目标被清空 | 加--filter保护关键目录,或先不做--delete,确认日志后再加 |
| 3. 断网后重新同步慢 | 从头开始校验 | 确保-P参数,并升级 rsync ≥3.2 支持xxh128校验,更快 |
| 4. 硬链接快照仍占双倍空间 | du -sh显示变大 | 使用du -sh --apparent-size查看逻辑大小;确认文件是否真的改动 |
| 5. 文件名空格/中文失败 | 报错file has vanished | 使用-s(–protect-args)或IFS=$'\n'循环 |
七、实践建议与最佳实践
3-2-1 原则:至少 3 份副本,2 种介质,1 份异地。rsync 解决“1 份异地”。
先做恢复演练:备份≠能恢复,每月随机抽快照还原一次。
带宽限速:白天业务高峰加
--bwlimit=20m避免占满上行。排除清单集中管理:把
--exclude-from=/etc/rsync.exclude写进文件,方便 Git 版本化。监控日志 + 告警:
tail -n 5 /var/log/rsync_www.log | grep -q 'finished' || alert使用
rsync + btrfs/zfs快照:可节省 50%+ 空间,秒级回滚。加密传输:
远程 shell 模式默认走 SSH,已加密;
daemon 模式需配合 stunnel 或 VPN,否则明文。
大文件优化:
-W(whole file)局域网千兆时可关闭块校验,直接全文件传输更快。
八、总结与应用场景
核心回顾:
rsync 通过“滚动校验和 + 差异块”实现增量,配合--delete做镜像、--exclude过滤垃圾、--link-dest零成本快照,是 Linux 世界最经济实用的“备份瑞士军刀”。典型应用场景:
网站代码/图片异地热备;
MySQL 物理备份(先
xtrabackup→ rsync 到灾备机);日志归集:各节点
rsync --append集中到日志中心;虚拟机镜像:凌晨快照后 rsync 到远程 NAS;
私人网盘:家用树莓派 + 移动硬盘,rsync 拉回公司数据。
下一步学习:
结合
inotify/rsyncd做实时的“触发式同步”;使用
rsync + lsyncd达到 Dropbox 同秒级体验;对比
rclone(支持对象存储)(本系列第 201 篇)。
把今天这份脚本直接搬到生产环境,你的数据就拥有了“时间回溯”超能力。祝你备份愉快,永不跑路!