目录
rsync 传输备份工作原理详解
一、核心算法:差异传输
二、传输流程
三、关键技术
四、与cp/scp复制的本质区别
rsync的使用
基本语法
常用选项
常用组合案例
1. **本地目录同步**
2. **远程同步(SSH协议)**
3. **删除目标端多余文件**
4. **排除特定文件**
5. **限速传输(避免占用带宽)**
6. **仅同步修改时间不同的文件**
关键注意事项
rsync 同步方式
1. 完整备份 (Full Backup)
2. 差量备份 (Differential Backup)
3. 增量备份 (Incremental Backup)
常见问题
rsync实现远程增量备份的方案
rsync + inotify 实时同步案例
1. 安装 inotify-tools
2. 实时同步脚本 (rsync_inotify.sh)
3. 启动脚本(后台运行)
4. 系统服务配置(可选)
rsync 传输备份工作原理详解
rsync是一个快速和非常方便的文件复制工具。 它能本地复制,远程复制,或者远程守护进程方式复制 ,它提供了大量的参数来控制其行为的各个方面,并且允许非常灵活的方式来实现文件的传输复制。
rsync监听端口:873
。
其核心工作原理可以分为以下几个关键方面:
一、核心算法:差异传输
分块校验机制:
rsync 将文件分割成固定大小的块(默认约700字节)
对每个块计算两个校验值:
弱校验(rolling checksum):32位的快速校验
强校验(MD5):128位的精确校验
差异检测过程:
发送方计算源文件的校验值
接收方计算目标文件的校验值
双方比较校验值,仅传输不匹配的块
二、传输流程
扫描:扫描需要传输的文件列表。
检查:对比源和目标文件的时间戳和大小。
分块:将文件分割成固定大小的数据块。
校验:通过滚动校验算法计算数据块的特征值。
传输:仅传输变化的数据块。
重组:在目标端重组完整文件。
三、关键技术
双通道设计:
控制通道:传输命令和元数据
数据通道:实际文件数据传输
滚动校验算法:
/* 简化版滚动校验计算 */
uint16_t weak_checksum(char *buf, int len) {
uint16_t s1 = 0, s2 = 0;
for (int i = 0; i < len; i++) {
s1 += buf[i];
s2 += s1;
}
return (s2 << 16) | s1;
}
这种算法可以高效计算滑动窗口的校验值
三次文件处理:
文件列表生成
差异比较
文件更新
四、与cp/scp复制的本质区别
操作 | cp/scp | rsync |
---|---|---|
文件比较 | 无 | 校验和比较 |
传输单位 | 整个文件 | 文件块 |
网络使用 | 高 | 优化 |
CPU使用 | 低 | 较高 |
适合场景 | 简单复制 | 重复同步 |
rsync的使用
基本语法
rsync [选项] 源文件 目标文件
常用选项
选项 | 作用解释 |
---|---|
-a (–archive) |
归档模式,保留所有文件属性(权限、时间、所有者等),等同于 -rlptgoD |
-v (–verbose) |
显示详细传输过程 |
-z (–compress) |
压缩传输,节省带宽(适合远程同步) |
-h (–human-readable) |
以易读格式(KB/MB/GB)显示文件大小 |
-n (–dry-run) |
模拟运行,只显示会做什么但不实际执行 |
-e |
指定远程 shell 命令 (如 -e "ssh -p 2222",默认为ssh ) |
-P |
组合选项,等同于 --partial --progress (显示进度 + 支持断点续传) |
--exclude |
排除特定文件或目录 |
--include |
包含特定文件或目录 |
--delete |
删除目标目录中存在但源目录中不存在的文件(保持严格同步) |
--checksum |
基于校验和同步 通过计算文件的校验和(而非时间戳和大小)判断是否需要同步,确保数据一致性 |
--progress |
显示传输进度 实时显示文件传输百分比和速度 |
常见问题解答
Q1: -a
和 -r
有什么区别?
-r
仅递归同步,不保留文件属性。
-a
= -r
+ 保留权限、时间戳、属主等(等同于 -rlptgoD
)。
Q2: --delete
会误删数据吗?
会!确保目标目录路径正确,建议先使用 --dry-run
模拟运行:
rsync -avz --delete --dry-run /source/ user@remote:/target/
Q3: --checksum
会导致性能下降吗?
会。校验和计算增加 CPU 开销,但适合对一致性要求高的场景。
如果文件改动不频繁,可用默认的“修改时间+大小”判断(去掉 --checksum
)。
Q4: 如何限速传输?
添加 --bwlimit=5000
(单位:KB/s,示例中限速 5MB/s):
rsync -avz --bwlimit=5000 /source/ user@remote:/target/
常用组合案例
1. 本地目录同步
rsync -av /source/ /destination/
作用:将 /source/
下的内容同步到 /destination/
(保留所有属性)
注意:源路径末尾的 /
表示同步目录内容(不含目录本身),不加 /
会同步目录本身。
2. 远程同步(SSH协议)
rsync -avzP -e "ssh -p 22" /local/path/ user@remote:/remote/path/
-e "ssh -p 22"
:指定 SSH 端口(默认 22 可省略)
-z
:压缩传输加速
3. 删除目标端多余文件
rsync -av --delete /source/ /destination/
危险操作:确保目标路径正确,否则可能误删数据!
4. 排除特定文件
rsync -av --exclude='*.tmp' --exclude='logs/' /source/ /destination/
--exclude
:排除匹配的文件或目录(支持通配符)
*
:匹配零个或多个字符,例如,*.txt
匹配所有以 .txt 结尾的文件。
?
:匹配一个字符,例如,file?.txt
匹配 file1.txt、file2.txt
等。
[abc]
:匹配方括号内的任意字符,例如,file[1-3].txt
匹配 file1.txt、file2.txt、file3.txt
。
5. 限速传输(避免占用带宽)
rsync -avz --bwlimit=1000 /source/ user@remote:/destination/
--bwlimit=1000
:限制带宽为 1000 KB/s(单位:KB)
6. 仅同步修改时间不同的文件
rsync -avu /source/ /destination/
-u
(–update):跳过目标端已存在且更新的文件。
关键注意事项
路径斜杠 /
的区别:
rsync -av /source/ /dest/
→ 同步 source/
下的内容到 dest/
中。
rsync -av /source /dest/
→ 同步 source
目录本身到 dest/
中。
--delete
风险:
同步前先用 -n
模拟运行,确认无误后再执行真实操作。
远程同步需配置 SSH 免密登录:
ssh-keygen -t rsa
ssh-copy-id user@remote
大文件或网络不稳定时:
使用 -P
支持断点续传。
添加 --partial-dir=/tmp/rsync-partial
指定暂存目录。
rsync 同步方式
1. 完整备份 (Full Backup)
全量比较所有文件,复制所有差异文件
# 完全复制源目录到目标位置
rsync -av /source/ /backup/full_backup/
2. 差量备份 (Differential Backup)
将指定目录作为比较基准
目标目录中只保留差异文件
# 基于完整备份后,只备份变化的部分(相比完整备份)
rsync -av --compare-dest=/backup/full_backup/ /source/ /backup/diff_backup_$(date +%F)/
--compare-dest
用于在同步时参考另一个目录的内容,但不会在新备份中创建硬链接。
例如:rsync -av --compare-dest=/data/ /tmp/shyn/ root@192.168.159.133:/data/
,源目录中有1、2、3
,这三个文件,/data/
为空,执行过前面的命令后三个文件同步至/data/
,而后我更改了1
文件的内容,然后再执行一次rsync
命令,查看/data
目录中就只有1
文件还在/data
目标目录中。
3. 增量备份 (Incremental Backup)
对于未修改文件:
目标路径 (/backup/current/
) 已存在该文件
直接跳过(既不新建硬链接,也不删除原文件)
对于修改/新增文件:
正常复制到目标目录(覆盖原有文件)
# 只备份自上次备份以来变化的部分(不管是哪种类型的备份,有变化的数据就备份,且会清除存档属性)
rsync -av --link-dest=/backup/last_backup/ /source/ /backup/incr_backup_$(date +%F)/
--link-dest
用于创建增量备份时,通过硬链接复用未修改的文件,从而节省磁盘空间。指定的基准目录是指目标主机中的目录,例如: rsync -av --delete --link-dest=/data/ /tmp/yana/ root@192.168.159.133:/data/
,是以159.133
主机/data
为参照,检测本机/tmp/yana
的文件变化。
常见问题
–link-dest不能跨文件系统
# 尝试跨分区使用会失败(无提示)
rsync -a --link-dest=/mnt/disk1/backup/ /source/ /mnt/disk2/new_backup/
基准目录必须存在:
如果/基准目录/
不存在,--link-dest
会被静默忽略
不会报错,但会退化为全量复制
时间戳敏感性:
默认依赖修改时间判断文件是否变化
可通过-c
改用校验和比对(更可靠但更耗资源)
rsync实现远程增量备份的方案
首次完整备份:
rsync -avz /local/source/ user@remote:/backups/full_20230601/
后续增量备份:
rsync -avz --link-dest=/backups/full_20230601/
/local/source/ user@remote:/backups/incr_20230602/
rsync + inotify 实时同步案例
1. 安装 inotify-tools
# CentOS/RHEL
yum install inotify-tools -y
# Debian/Ubuntu
apt-get install inotify-tools -y
2. 实时同步脚本 (rsync_inotify.sh)
#!/bin/bash
# 配置参数
SRC_DIR="/data/www/"
DEST_HOST="backup-server"
DEST_DIR="/backup/www/"
LOG_FILE="/var/log/rsync_inotify.log"
# 监控并同步
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w%f %e'
-e modify,delete,create,attrib,move ${SRC_DIR} | while read file
do
# 记录事件
echo "${file} was changed" >> ${LOG_FILE}
# 执行同步
rsync -avz --delete ${SRC_DIR} ${DEST_HOST}:${DEST_DIR} >> ${LOG_FILE} 2>&1
# 可选:触发后续操作
# /path/to/other_script.sh
done
3. 启动脚本(后台运行)
chmod +x rsync_inotify.sh
nohup ./rsync_inotify.sh > /dev/null 2>&1 &
4. 系统服务配置(可选)
创建 /etc/systemd/system/rsync-inotify.service
:
[Unit]
Description=Rsync with Inotify real-time sync
After=network.target
[Service]
Type=simple
ExecStart=/path/to/rsync_inotify.sh
Restart=always
[Install]
WantedBy=multi-user.target
然后启用服务:
systemctl daemon-reload
systemctl enable rsync-inotify
systemctl start rsync-inotify
暂无评论内容