rsync 完全详解手册(从入门到生产)
一、rsync是什么?
rsync = remote sync(远程同步)
一句话定义:
Linux/Unix 下最强大的增量文件同步工具,支持本地复制、远程推送/拉取、断点续传、差异传输、权限保留。
作者: Andrew Tridgell(也是Samba作者)
诞生时间: 1996年
核心算法: 滚动校验+差异传输(只传变化的部分)
二、核心原理(为什么快?)
2.1 增量传输算法
传统复制(scp/cp):
文件100MB → 传输100MB
rsync 第一次:
文件100MB → 传输100MB(全量)
rsync 第二次(只改10KB):
1. 把文件分块(每块512字节)
2. 比对两端每块的校验码
3. 只传有差异的块(10KB)
4. 目标端重组文件
✅ 传输量:10KB,不是100MB!
2.2 工作模式
| 模式 | 传输方式 | 端口 | 加密 | 场景 |
|---|---|---|---|---|
| 本地模式 | 文件系统读写 | – | 无 | 本机cp增强版 |
| SSH模式 | SSH通道 | 22 | ✅ AES | 生产90% |
| 守护进程模式 | rsync协议 | 873 | ❌ 明文 | 内网镜像站 |
三、安装与快速上手
3.1 安装
# CentOS/RHEL
yum install -y rsync
# Ubuntu/Debian
apt install -y rsync
# 检查版本
rsync --version
3.2 3条命令入门
# 1. 本地同步(类似cp -r,但增量)
rsync -av /src/ /dst/
# 2. 本地推远程(SSH模式)
rsync -av /data/ root@192.168.1.100:/backup/
# 3. 远程拉本地(SSH模式)
rsync -av root@192.168.1.100:/backup/ /data/
✅ 10秒学会,这就是rsync!
四、参数详解(必须背的8个)
| 参数 | 英文 | 作用 | 必会指数 |
|---|---|---|---|
-a | archive | 归档模式(保留权限、属主、时间、递归) | ⭐⭐⭐⭐⭐ |
-v | verbose | 显示详情(看哪些文件被传) | ⭐⭐⭐⭐⭐ |
-z | compress | 传输压缩(省带宽,CPU换带宽) | ⭐⭐⭐⭐ |
-P | partial+progress | 断点续传 + 进度条 | ⭐⭐⭐⭐⭐ |
--delete | delete | 目标删除源没有的文件(精确同步) | ⭐⭐⭐⭐ |
--exclude | exclude | 排除文件/目录 | ⭐⭐⭐⭐ |
--bwlimit | bandwidth limit | 限速(单位KB/s) | ⭐⭐⭐ |
-n | dry-run | 模拟运行(测试,不改文件) | ⭐⭐⭐⭐ |
参数组合黄金搭档:
# 最常用(备份)
rsync -avz --delete /src/ /dst/
# 大文件(断点续传+进度)
rsync -avP /src/ /dst/
# 限速(不占满带宽)
rsync -avz --bwlimit=1024 /src/ /dst/
五、两种工作模式详解
5.1 SSH模式(生产90%)
特点:
- ✅ 加密传输(基于SSH)
- ✅ 无需服务端配置
- ✅ 端口22(可改)
- ⚠️ 每次验证密码
命令格式:
# 推送本地到远程
rsync -avz -e ssh /local/ user@host:/remote/
# 拉取远程到本地
rsync -avz -e ssh user@host:/remote/ /local/
# 改SSH端口
rsync -avz -e "ssh -p 52222" /local/ user@host:/remote/
# 指定密钥文件
rsync -avz -e "ssh -i ~/.ssh/id_rsa" /local/ user@host:/remote/
5.2 守护进程模式(内网镜像)
特点:
- ✅ 高性能(无加密开销)
- ✅ 可做匿名镜像
- ✅ 端口873
- ❌ 明文传输(不适合公网)
服务端配置(/etc/rsyncd.conf):
# 全局配置
uid = nobody
gid = nobody
use chroot = yes
max connections = 10
log file = /var/log/rsyncd.log
[backup] path = /data/backup read only = yes auth users = rsync_backup secrets file = /etc/rsyncd.secrets hosts allow = 192.168.1.0/24
客户端命令:
# 查看模块
rsync rsync_backup@192.168.1.100::
# 下载(::双冒号)
rsync -av rsync_backup@192.168.1.100::backup /local/
# 上传(可写模块)
rsync -av /local/ rsync_backup@192.168.1.100::backup/
# 匿名访问(没配auth users)
rsync -av 192.168.1.100::backup /local/
六、15个生产实战场景
6.1 网站代码发布
#!/bin/bash
# 同步到Web集群
WEB_SERVERS="web01 web02 web03"
for host in $WEB_SERVERS; do
rsync -avz --delete \
--exclude=".git" \
--exclude="node_modules" \
--exclude="*.log" \
/data/www/ root@$host:/var/www/html/
done
6.2 数据库备份同步(异地容灾)
#!/bin/bash
# 凌晨备份,同步到异地
DATE=$(date +%Y%m%d)
mysqldump --all-databases | gzip > /backup/mysql/all_$DATE.sql.gz
# 同步到异地机房
rsync -avz --bwlimit=2048 /backup/mysql/ backup@10.0.0.100:/backup/mysql/
# 保留30天
find /backup/mysql -type f -mtime +30 -delete
6.3 大文件断点续传
# 下载ISO,断了重传从断点继续
rsync -avP --partial-dir=.partial \
rsync://mirrors.ustc.edu.cn/centos/8/isos/x86_64/CentOS-8.iso ./
6.4 日志集中收集
# 从各服务器拉取nginx日志
rsync -avz --remove-source-files \
web01::logs/ /data/logs/web01/
6.5 实时同步(配合inotify)
# 监控目录变化,实时触发rsync
while inotifywait -r -e modify,create,delete /data; do
rsync -av --delete /data/ backup@10.0.0.100:/data/
done
6.6 迁移服务器
# 全站迁移,保留所有属性
rsync -avzP --stats /home/ root@新服务器:/home/
6.7 镜像站同步
# 同步CentOS仓库
rsync -avz --delete --exclude="*.iso" \
rsync://mirrors.aliyun.com/centos/ /data/mirrors/centos/
6.8 目录结构同步(不传文件)
rsync -av -f"+ */" -f"- *" /src/ /dst/
6.9 限速备份(不占业务带宽)
rsync -avz --bwlimit=1024 /data/ backup@10.0.0.1:/backup/
6.10 备份带空格的文件
rsync -av --protect-args /data/ backup@10.0.0.1:/backup/
6.11 只同步特定后缀
rsync -av --include="*.php" --include="*.html" --exclude="*" /src/ /dst/
6.12 跳过相同文件(基于大小+时间)
rsync -av --size-only /src/ /dst/
6.13 备份SSH密钥权限不变
rsync -av --chmod=600 ~/.ssh/id_rsa backup@host:~/.ssh/
6.14 压缩级别调整
rsync -av --compress-level=9 /data/ user@host:/backup/
6.15 远程删除大量文件(最快方式)
rsync -av --delete-before --exclude="*" /empty/ user@host:/full-dir/
七、高级技巧
7.1 增量备份 + 硬链接(时间机器)
#!/bin/bash
# 按日期创建目录,相同文件硬链接
BACKUP_DIR="/backup/$(date +%Y%m%d)"
LAST_LINK="/backup/latest"
mkdir -p $BACKUP_DIR
rsync -av --link-dest=$LAST_LINK /data/ $BACKUP_DIR/
rm -f $LAST_LINK
ln -s $BACKUP_DIR $LAST_LINK
7.2 备份后执行远程命令
rsync -av /data/ user@host:/backup/ && ssh user@host "tar czf /backup.tgz /backup"
7.3 通过跳板机同步
rsync -av -e "ssh -J jump@10.0.0.100" /data/ target@172.16.1.10:/backup/
7.4 防火墙只开873的端口转发
# 通过SSH隧道转发873
ssh -L 873:localhost:873 backup@gateway
rsync -av rsync://localhost::backup /local/
八、性能优化
| 场景 | 优化方案 | 效果 |
|---|---|---|
| 海量小文件 | 跳过压缩 -z | CPU降50% |
| 内网千兆 | 不加-z,加-W | 带宽跑满 |
| 跨公网 | --bwlimit限速 | 不占满带宽 |
| 文件超大 | --partial-dir | 断点续传 |
| 内存不足 | --block-size=8192 | 内存降30% |
九、故障排查手册
| 报错 | 原因 | 解决 |
|---|---|---|
Permission denied (publickey) | SSH密钥不对 | -e "ssh -i 密钥" |
@ERROR: auth failed | 密码错或文件权限非600 | chmod 600 /etc/rsyncd.secrets |
@ERROR: chroot failed | use chroot=yes但path权限错 | chown nobody:nobody /path |
rsync: opendir failed: Permission denied | uid读不了path | chmod 755 /path |
The remote shell is not configured | SSH模式没写user@host | 补全用户名 |
@ERROR: Unknown module | 模块名错或list=false | 确认模块名 |
十、与其他工具对比
| 工具 | 增量 | 加密 | 断点续传 | 双向 | 场景 |
|---|---|---|---|---|---|
| rsync | ✅ | ✅ | ✅ | ❌ | 全能同步王 |
| scp | ❌ | ✅ | ❌ | ❌ | 小文件 |
| cp | ❌ | ❌ | ❌ | ❌ | 本机 |
| wget | ❌ | ✅ | ✅ | ❌ | 下载 |
| unison | ✅ | ✅ | ✅ | ✅ | 双向同步 |
| lftp | ✅ | ✅ | ✅ | ✅ | FTP镜像 |
十一、面试必考题
Q1:rsync 和 scp 区别?
答:
- rsync 增量传输,scp 全量
- rsync 断点续传,scp 从头开始
- rsync 保留权限/时间,scp 丢时间
- rsync 压缩传输,scp 不压缩
Q2:rsync 速度慢怎么优化?
答:
- 内网去掉
-z(压缩耗CPU) - 海量小文件加
-W(整文件传输) --bwlimit限速防丢包--block-size=8192加大块尺寸
Q3:如何实现实时同步?
答:
inotify + rsync
或
lsyncd / csync2 / sersync
一句话总结
rsync = 本地cp增强 + 远程scp增强 + 断点续传 + 增量同步
-avz 走天下,–delete 保精确,-P 续命丹,–exclude 排除坑
SSH模式最安全,守护进程跑内网,日志配好审计全
发表回复