rsync适用场景及实际使用地方

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个)

参数英文作用必会指数
-aarchive归档模式(保留权限、属主、时间、递归)⭐⭐⭐⭐⭐
-vverbose显示详情(看哪些文件被传)⭐⭐⭐⭐⭐
-zcompress传输压缩(省带宽,CPU换带宽)⭐⭐⭐⭐
-Ppartial+progress断点续传 + 进度条⭐⭐⭐⭐⭐
--deletedelete目标删除源没有的文件(精确同步)⭐⭐⭐⭐
--excludeexclude排除文件/目录⭐⭐⭐⭐
--bwlimitbandwidth limit限速(单位KB/s)⭐⭐⭐
-ndry-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/

八、性能优化

场景优化方案效果
海量小文件跳过压缩 -zCPU降50%
内网千兆不加-z,加-W带宽跑满
跨公网--bwlimit限速不占满带宽
文件超大--partial-dir断点续传
内存不足--block-size=8192内存降30%

九、故障排查手册

报错原因解决
Permission denied (publickey)SSH密钥不对-e "ssh -i 密钥"
@ERROR: auth failed密码错或文件权限非600chmod 600 /etc/rsyncd.secrets
@ERROR: chroot faileduse chroot=yes但path权限错chown nobody:nobody /path
rsync: opendir failed: Permission denieduid读不了pathchmod 755 /path
The remote shell is not configuredSSH模式没写user@host补全用户名
@ERROR: Unknown module模块名错或list=false确认模块名

十、与其他工具对比

工具增量加密断点续传双向场景
rsync全能同步王
scp小文件
cp本机
wget下载
unison双向同步
lftpFTP镜像

十一、面试必考题

Q1:rsync 和 scp 区别?

答:

  1. rsync 增量传输,scp 全量
  2. rsync 断点续传,scp 从头开始
  3. rsync 保留权限/时间,scp 丢时间
  4. rsync 压缩传输,scp 不压缩

Q2:rsync 速度慢怎么优化?

答:

  1. 内网去掉 -z(压缩耗CPU)
  2. 海量小文件加 -W(整文件传输)
  3. --bwlimit 限速防丢包
  4. --block-size=8192 加大块尺寸

Q3:如何实现实时同步?

答:

inotify + rsync
或
lsyncd / csync2 / sersync

一句话总结

rsync = 本地cp增强 + 远程scp增强 + 断点续传 + 增量同步
-avz 走天下,–delete 保精确,-P 续命丹,–exclude 排除坑
SSH模式最安全,守护进程跑内网,日志配好审计全

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注