指令含义
| 参数 |
作用 |
-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 |
更极致的断点续传(比如按字节级校验) |
关闭历史记录
- 作用:
执行后,此后在该终端中输入的所有命令将不会被记录到内存历史列表(即 history 命令查不到),也不会在会话退出时写入 ~/.bash_history 文件。
- 典型场景:
执行含密码、密钥等敏感信息的命令前(如 mysql -u root -p'123456'),临时关闭历史记录以避免泄露。
- 关键限制:
- 该命令本身会被记录(除非在命令前加空格且
HISTCONTROL 包含 ignorespace)1。
- 仅影响当前终端会话,新开终端或系统重启后自动恢复记录功能6。
恢复历史记录
- 重新开启命令历史记录功能,此后输入的命令将正常写入内存历史列表和
~/.bash_history 文件。
- 典型场景:
完成敏感操作后立即执行,确保后续命令可被审计追踪。
手动同步
(指定密钥文件端口,完全同步)
删除目标端独有文件(两端目录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/
|
定时自动同步
适配数据持续增加
定时任务存放位置
1
| /var/spool/cron/crontabs/用户名
|
数据会新增,配置 crontab 定时任务,每次都指定密钥 + 端口:
编辑定时任务(源服务器执行)
1
| crontab -e # root用户编辑root的定时任务;非root则直接执行,编辑当前用户的
|
添加同步规则(按需选择)
1 2 3 4 5 6 7 8
| # 示例1:每小时同步一次(root账户,增量同步) 0 * * * * /usr/bin/rsync -avz -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
# 示例2:每天凌晨2点同步(非root账户,test用户) 0 2 * * * /usr/bin/rsync -avz -e "ssh -i /home/test/.ssh/rsync_key -p 2222" /data/ test@10.0.0.2:/data/ >> /var/log/rsync_cron_$(date +\%Y\%m\%d).log 2>&1
# 示例3:每10分钟同步一次(适合数据新增快的场景) */10 * * * * /usr/bin/rsync -avz --delete -e "ssh -i /root/.ssh/rsync_key -p 2222" /data/ root@10.0.0.2:/data/ >> /var/log/rsync_cron_$(date +\%Y\%m\%d).log 2>&1
|
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 2
| # 每天凌晨清理7天前的临时文件 40 0 * * * find /tmp/rsync_partial -type f -mtime +7 -delete
|
生效并验证
1 2 3 4 5 6 7 8 9 10
| # 重启cron服务(Ubuntu/Debian) systemctl restart cron # CentOS/RHEL systemctl restart crond
# 查看定时任务列表 crontab -l
# 查看同步日志(验证是否执行成功) tail -f /var/log/rsync_cron_*.log
|
注意:不是必须,但建议用 root
| 账户类型 |
优势 |
风险 / 注意事项 |
| root |
1. 无权限问题(可同步所有文件 / 目录);2. 保留文件原始权限 / 所有者;3. 无需额外授权 |
权限过高,若密钥泄露风险大(可通过限制密钥仅用于 rsync 缓解) |
| 非 root |
权限最小化,更安全 |
1. 需确保源 / 目标同步目录对该用户有读(源)+ 写(目标) 权限;2. 同步后文件所有者为该非 root 用户;3. 无法同步 root 专属文件(如 /root 下的文件) |
非 root 同步的权限配置(必做)
如果用非 root 用户(比如 test),需给同步目录授权:
1 2 3 4 5 6
| # 源服务器(给test读权限) chown -R test:test /data chmod -R 755 /data
# 目标服务器(给test写权限) ssh -i ~/.ssh/rsync_key -p 2222 test@10.0.0.2 "chown -R test:test /data && chmod -R 755 /data"
|
验证同步有效性
- 源服务器新增文件:
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| # 匹配/var/log/下所有rsync_cron_开头、.log结尾的日志文件 /var/log/rsync_cron_*.log { # 每天检查一次 weekly每周轮转 daily # 保留7天的日志(可根据需求调整,比如保留30天则改为30) rotate 7 # 对过期日志进行gzip压缩(节省空间) compress # 延迟压缩:本次轮转的日志不压缩,下次轮转时再压缩 delaycompress # 即使日志文件不存在也不报错 missingok # 空日志文件不处理 notifempty # 不创建新的日志文件(因为rsync命令会自动生成) nocreate # 新增:指定用root用户/组执行轮转,跳过目录权限检查 su root root }
|
验证配置是否生效
- 手动执行 logrotate 测试(不实际修改文件,仅验证配置语法):
1
| logrotate -d /etc/logrotate.d/rsync
|
预期结果:输出 “reading config file /etc/logrotate.d/rsync” 等信息,无语法错误提示。
确认 logrotate 定时执行
logrotate 会被系统默认的 cron 任务(/etc/cron.daily/logrotate)每天执行,无需额外配置,默认执行时间为凌晨(不同系统略有差异,如 CentOS 是凌晨 4 点)。