在服务器之间同步文件、做定时备份,rsync 是最常用的工具:它只传输变化的部分,支持断点续传,通过 SSH 即可使用。但它有几个容易出事故的细节,比如源路径末尾的斜杠、--delete 误删目标文件。本文按“先安全、再高效”的顺序整理。
rsync -avz /data/app/ user@192.168.0.10:/backup/app/常用选项:
-a:归档模式,递归并保留权限、时间戳、属主属组、符号链接,等价于 -rlptgoD。-v:显示详细过程。-z:传输时压缩。对已经压缩过的文件(图片、视频、压缩包)收益很小,局域网内也未必划算。-P:等于 --partial --progress,保留传输中断的部分文件并显示进度,大文件断点续传依赖它。-e "ssh -p 2222":指定 SSH 端口或其他参数。这是最常见的坑:
# 同步目录“里面的内容”到目标目录
rsync -a /data/app/ /backup/app/
# 同步目录“本身”,目标下会多出一层 app 目录
rsync -a /data/app /backup/app/第一条结果是 /backup/app/文件...,第二条结果是 /backup/app/app/文件...。目标路径末尾的斜杠影响不大,源路径的斜杠才有区别。
默认情况下,rsync 只复制和更新,不会删除目标中多出的文件。加上 --delete 后,目标里源端没有的文件会被删除。这对镜像同步有用,但配错路径就会造成数据丢失。
使用前务必先做演练:
rsync -avn --delete /data/app/ /backup/app/-n(--dry-run)只显示将要执行的动作,不做实际修改。确认删除列表符合预期后再去掉 -n。还要警惕:
--delete 会把目标清空。脚本里应先检查源目录是否存在且非空。--max-delete=100 限制一次最多删除的文件数,作为保险。rsync -av --exclude='*.log' --exclude='node_modules/' /data/app/ /backup/app/排除规则很多时,用文件管理:--exclude-from=/etc/rsync-exclude.txt。
每天做一份完整备份占用空间很大。--link-dest 让没有变化的文件以硬链接指向上一次备份,只为变化的文件占用新空间,而每个日期目录看起来都是一份完整备份:
today=$(date +%F)
rsync -a --delete \
--link-dest=/backup/snap/latest \
/data/app/ /backup/snap/$today/
ln -sfn /backup/snap/$today /backup/snap/latest要点:
latest 不存在,rsync 会提示但仍会做完整复制。--checksum,会读取并计算两端文件的校验和,较慢。--bwlimit=20000(单位 KB/s)。--info=progress2 可以查看整体进度。flock 防止重叠运行。authorized_keys 中用 command= 限定该密钥只能执行 rsync。--delete 前先 -n 演练,脚本里检查源目录并加删除数量上限。--link-dest 做节省空间的增量快照。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。