Ubuntu同步文件
指令含义
| 参数 | 作用 |
|---|---|
-a |
归档模式:保留文件权限、所有者、时间戳、软链接等,是增量同步的核心参数 |
-v |
显示同步过程(便于排查,生产环境可去掉) |
-z |
传输时压缩数据,节省带宽(跨机房同步必加) |
--delete |
删除目标端有、但源端没有的文件(可选,确保两端目录完全一致) |
--progress |
显示单个文件的同步进度(同步大文件时建议加) |
| -e “ssh -i 私钥文件路径 -p 端口” | 核心:指定 SSH 连接时使用的私钥文件 + 端口 |
| -o StrictHostKeyChecking=no | 可选:跳过首次连接的主机密钥确认(适合脚本 / 定时任务) |
| -o StrictHostKeyChecking=accept-new | 首次连接时,自动接受并保存新主机的公钥(无需手动确认,适配 cron 无人值守场景); 如果目标主机公钥变更(异常情况),会拒绝连接并告警,避免中间人攻击。 |
| –delete-after | 先完成所有文件的同步,最后再删除目标端多余文件(避免同步中断导致的部分删除); |
实现断点续传的具体方法
rsync 本身内置了断点续传的能力,只需添加特定参数即可实现,下面分基础用法和进阶优化说明:
** 核心参数:--partial + --partial-dir(推荐组合)**
| 参数 | 作用 |
|---|---|
--partial |
保留传输中断时的临时文件(默认会删除未传完的文件),是断点续传的核心参数; |
--partial-dir |
指定临时文件的存放目录(避免临时文件和正常文件混在一起,更整洁)。 |
| –append-verify | 更极致的断点续传(比如按字节级校验) |
手动同步
(指定密钥文件端口,完全同步)
删除目标端独有文件(两端目录100%一致)
1 | rsync -avz --delete -e "ssh -i ~/.ssh/rsync_key -p 2222 -o StrictHostKeyChecking=no" /data/ root@10.0.0.2:/data/ |
(指定密钥文件端口,增量同步)
只同步新增/修改数据,不删目标端独有文件
1 | rsync -avz -e "ssh -i ~/.ssh/rsync_key -p 2222 -o StrictHostKeyChecking=no" /data/ root@10.0.0.2:/data/ |
定时自动同步
适配数据持续增加
数据会新增,配置 crontab 定时任务,每次都指定密钥 + 端口:
编辑定时任务(源服务器执行)
1 | crontab -e # root用户编辑root的定时任务;非root则直接执行,编辑当前用户的 |
添加同步规则(按需选择)
1 | # 示例1:每小时同步一次(root账户,增量同步) |
1 | 0 * * * * /usr/bin/rsync -avz --partial --partial-dir=/tmp/rsync_partial --progress --delete --delete-after -e "ssh -i /root/.ssh/rsync_key -p 2222 -o StrictHostKeyChecking=accept-new" /data/ root@10.0.0.2:/data/ > /var/log/rsync_cron_$(date +\%Y\%m\%d).log 2>&1 |
核心交互逻辑:断点续传 + 同步删除
| 功能维度 | 具体效果 |
|---|---|
| 断点续传 | --partial/--partial-dir/--append-verify 依然生效:1. 传输中断时保留临时文件到 /tmp/rsync_partial;2. 再次执行时从断点处续传,且校验已传输部分的完整性;3. 临时文件不会被 --delete 误删(因为 --delete-after 是最后执行)。 |
| 同步删除 | --delete --delete-after 生效,且执行时机关键:1. --delete-after 强制 rsync 先完成所有文件的传输 / 续传,再删除目标端存在、源端不存在的文件;2. 对比直接用 --delete:避免了 “先删除文件,再传输时中断” 导致的目标端数据缺失;3. 最终目标端 /data/ 会和源端完全一致(增 / 改 / 删都同步)。 |
临时目录的清理:/tmp/rsync_partial 会保留中断的临时文件,若长期不清理可能占磁盘,可定期手动清理(或加定时任务)
1 | # 每天凌晨清理7天前的临时文件 |
生效并验证
1 | # 重启cron服务(Ubuntu/Debian) |
注意:不是必须,但建议用 root
| 账户类型 | 优势 | 风险 / 注意事项 |
|---|---|---|
| root | 1. 无权限问题(可同步所有文件 / 目录);2. 保留文件原始权限 / 所有者;3. 无需额外授权 | 权限过高,若密钥泄露风险大(可通过限制密钥仅用于 rsync 缓解) |
| 非 root | 权限最小化,更安全 | 1. 需确保源 / 目标同步目录对该用户有读(源)+ 写(目标) 权限;2. 同步后文件所有者为该非 root 用户;3. 无法同步 root 专属文件(如 /root 下的文件) |
非 root 同步的权限配置(必做)
如果用非 root 用户(比如 test),需给同步目录授权:
1 | # 源服务器(给test读权限) |
验证同步有效性
- 源服务器新增文件:
touch /data/new_$(date +%Y%m%d).txt - 执行同步命令(指定密钥 + 端口)
- 目标服务器检查:
ls /data/new_*.txt,能看到文件即同步成功; - 定时任务验证:等待指定时间(比如 1 小时),查看目标服务器是否有新增文件。
清理定时任务
使用 logrotate(推荐,行业最佳实践)
logrotate 专为日志文件管理设计,支持按时间 / 大小轮转、压缩、删除旧日志,配置简单且稳定。
创建 logrotate 配置文件
创建 /etc/logrotate.d/rsync 文件(文件名自定义,建议和业务相关):
1 | vim /etc/logrotate.d/rsync |
写入以下配置(适配你的按日期命名的日志文件):
1 | # 匹配/var/log/下所有rsync_cron_开头、.log结尾的日志文件 |
验证配置是否生效
- 手动执行 logrotate 测试(不实际修改文件,仅验证配置语法):
1 | logrotate -d /etc/logrotate.d/rsync |
预期结果:输出 “reading config file /etc/logrotate.d/rsync” 等信息,无语法错误提示。
确认 logrotate 定时执行
logrotate 会被系统默认的 cron 任务(/etc/cron.daily/logrotate)每天执行,无需额外配置,默认执行时间为凌晨(不同系统略有差异,如 CentOS 是凌晨 4 点)。