1. rsync 命令概述:Linux 文件同步利器
第一次在服务器间同步日志文件时,我用了整整一晚上 scp 命令。直到发现 rsync 只传输差异部分的功能,才明白为什么运维老手都说这是 Linux 下最强大的同步工具。这个用 C 语言编写的开源工具,自 1996 年诞生以来就因其增量传输算法成为系统管理员的核心武器。
rsync 的核心价值在于智能同步——通过校验算法比较源和目标文件的差异,仅传输变化的部分。想象你要同步一个 10GB 的目录,如果只有 1MB 内容变动,传统 scp 会重新传输整个目录,而 rsync 只需传输那 1MB。这种差异传输机制(delta-transfer algorithm)让它在大文件同步场景下效率提升数百倍。
实际测试:同步 50GB 虚拟机镜像文件(修改了 3 个配置文件)
- scp 耗时:22 分钟
- rsync 首次同步:21 分钟
- rsync 二次同步:8 秒
2. 核心参数深度解析
2.1 基础参数组合拳
-a 参数是新手最容易忽视的宝藏,这个归档模式(archive)实际上包含了:
-r递归目录-l保留符号链接-p保留权限-t保留修改时间-g保留属组-o保留属主-D保留设备文件
但要注意,-a 不包含 -H(硬链接处理),对于有硬链接的目录需要额外添加。我常用这个组合处理网站备份:
bash复制rsync -aH --delete /var/www/ user@backup:/backups/www/
2.2 传输优化三剑客
-
压缩传输
-z:
在带宽受限环境下特别有效,但要注意 CPU 开销。实测同步 10GB 文本日志:- 无压缩:传输量 10GB,耗时 15 分钟
- 启用压缩:传输量 3.2GB,耗时 9 分钟(CPU 占用 35%)
-
带宽限制
--bwlimit=1000:
单位是 KB/s,适合避免影响生产网络。我曾经因为没限速导致办公网络瘫痪,现在同步生产数据必加:bash复制
rsync -az --bwlimit=5000 /data/ user@remote:/backup/ -
部分传输
--partial:
断点续传的关键参数。配合--progress可以看到实时传输进度:bash复制
rsync -azP --partial /bigfile user@remote:/destination/
3. 企业级实战场景
3.1 数据库热备份方案
MySQL 热备需要配合 --rsync-path 指定特殊权限命令。这是我用的生产环境脚本:
bash复制#!/bin/bash
LOCK_FILE=/tmp/rsync_mysql.lock
if [ -f $LOCK_FILE ]; then
echo "Backup already running"
exit 1
fi
touch $LOCK_FILE
# 创建快照
mysql -e "FLUSH TABLES WITH READ LOCK;"
lvcreate -L 10G -s -n mysql_snap /dev/vg/mysql
# 释放锁
mysql -e "UNLOCK TABLES;"
# 同步快照
rsync -a --rsync-path="sudo rsync" /dev/vg/mysql_snap dba@backup:/mysql_backups/
# 清理
lvremove -f /dev/vg/mysql_snap
rm $LOCK_FILE
3.2 千万级小文件同步
遇到 200 万个小图片同步时,原始 rsync 会卡在文件列表阶段。解决方案是:
- 使用
--no-recursive+find并行处理 - 增加
--max-size和--min-size过滤 - 调整
--block-size(默认 700B)
优化后的命令:
bash复制find /images -type f -print0 | xargs -0 -n 100 -P 4 rsync -a \
--no-recursive \
--max-size=10M \
--min-size=1K \
--block-size=4096 \
--files-from=- \
user@remote:/images_backup/
4. 高级技巧与排错指南
4.1 实时同步方案对比
| 方案 | 触发方式 | 延迟 | CPU 占用 | 适用场景 |
|---|---|---|---|---|
| inotify+rsync | 文件事件 | <1s | 高 | 关键目录实时同步 |
| cron rsync | 定时任务 | 分钟级 | 低 | 常规备份 |
| lsyncd | 事件+定时 | 秒级 | 中 | 平衡型方案 |
生产环境推荐 lsyncd 配置示例:
lua复制settings {
logfile = "/var/log/lsyncd.log",
statusFile = "/var/log/lsyncd.status"
}
sync {
default.rsync,
source = "/data/",
target = "backup:/data/",
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
bwlimit = 5000
},
delay = 5
}
4.2 典型错误排查
问题1:rsync: failed to set times on "/path/": Operation not permitted
- 原因:目标文件系统为只挂载或权限不足
- 解决:添加
--no-times参数或检查目标权限
问题2:传输中途卡住无响应
- 检查网络 MTU:
bash复制ping -s 1472 -M do target_host # 如果失败,逐步减小1472 - 添加
--timeout=30和--contimeout=20参数
问题3:rsync error: received SIGINT, SIGTERM, or SIGHUP
- 网络不稳定导致,改用持久连接:
bash复制rsync -e "ssh -o TCPKeepAlive=yes" -avz source/ target:/path/
5. 安全加固方案
5.1 SSH 隧道加密
禁止使用 --rsh=rsh 这种明文传输方式。建议的 SSH 优化配置:
bash复制rsync -e "ssh -T -c aes256-gcm@openssh.com -o Compression=no -x" \
-avz /data/ user@host:/backup/
各参数含义:
-T禁用伪终端分配-c指定加密算法-o Compression=no避免双重压缩(已用 -z)-x禁用X11转发
5.2 只读守护模式
在备份服务器启动 rsync 守护进程(/etc/rsyncd.conf):
ini复制[backup]
path = /backup/
comment = Read-only backup area
read only = yes
use chroot = yes
hosts allow = 192.168.1.0/24
auth users = backup
secrets file = /etc/rsyncd.secrets
启动命令:
bash复制rsync --daemon --config=/etc/rsyncd.conf
客户端连接方式:
bash复制rsync -avz /data/ backup@server::backup/
6. 性能调优实战
6.1 磁盘IO优化
当同步大量小文件到机械硬盘时,添加这些参数:
bash复制rsync -a --no-whole-file --inplace --delay-updates /source/ /target/
--no-whole-file:禁用文件整体传输(更适合小文件)--inplace:直接修改目标文件(减少磁盘寻址)--delay-updates:最后统一重命名(减少元数据操作)
6.2 网络传输优化
跨数据中心同步时,这些参数可以提升 30% 以上速度:
bash复制rsync -az \
--protocol=30 \
--write-batch=~/rsync_batch \
--sockopts="SO_SNDBUF=1048576,SO_RCVBUF=1048576" \
/source/ user@remote:/target/
关键点:
--protocol=30使用最新协议版本- batch 模式适合定期同步相同目录
- 调整 socket 缓冲区大小(单位字节)
7. 替代方案对比
当 rsync 不是最佳选择时:
| 工具 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| tar+ssh | 处理百万级小文件更快 | 无增量同步 | 全量备份/迁移 |
| unison | 双向同步 | 需要两端安装 | 开发环境双向同步 |
| rclone | 支持云存储 | 本地同步效率低 | 云存储同步 |
| btrfs send | 文件系统级快照 | 需要 btrfs 文件系统 | 系统快照迁移 |
对于 50GB 以上的单文件同步,推荐先用 split 分块:
bash复制split -b 2G bigfile bigfile_part_
rsync -az bigfile_part_* remote:/path/
ssh remote "cat bigfile_part_* > bigfile"