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
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"

验证同步有效性

  1. 源服务器新增文件:touch /data/new_$(date +%Y%m%d).txt
  2. 执行同步命令(指定密钥 + 端口)
  3. 目标服务器检查:ls /data/new_*.txt,能看到文件即同步成功;
  4. 定时任务验证:等待指定时间(比如 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
}

验证配置是否生效

  1. 手动执行 logrotate 测试(不实际修改文件,仅验证配置语法):
1
logrotate -d /etc/logrotate.d/rsync

预期结果:输出 “reading config file /etc/logrotate.d/rsync” 等信息,无语法错误提示。

确认 logrotate 定时执行

logrotate 会被系统默认的 cron 任务(/etc/cron.daily/logrotate)每天执行,无需额外配置,默认执行时间为凌晨(不同系统略有差异,如 CentOS 是凌晨 4 点)。