一、rsync简介
1.1 rsync 是什么?
rsync 是一款功能强大且灵活的Linux文件同步工具,通过高效的增量传输算法,能够显著减少数据传输量和时间,是备份、镜像和跨平台文件同步的理想选择。其核心价值在于只传输文件的差异部分,而非全量复制,从而节省带宽和存储资源。
rsync支持多种同步模式,包括:
- 本地目录同步
- 远程SSH同步
- 通过rsync守护进程的高效传输,且可与定时任务工具结合实现自动化同步。
在实际应用中,rsync广泛用于网站内容部署、日志备份、代码更新和实时文件监控等场景,有效提升了运维效率。
1.2 rsync基本语法与核心参数
rsync的基本语法分为 本地同步 和 远程同步 两种格式。
- 
本地同步命令结构为: rsync [选项] 源路径 目标路径 
- 
远程同步则需指定用户和远程主机,格式为: rsync [选项] 源路径 [用户@]远程主机:目标路径 或 rsync [选项] [用户@]远程主机:源路径 [目标路径]。 
rsync的差分算法是其高效传输的基础,通过比较源文件和目标文件的元数据(大小、时间戳)和内容(校验和),仅传输变化部分。这种机制使得rsync特别适合大文件和频繁更新的场景。
归档模式(-a) 是rsync最常用的参数,其本质是-rlptgoD的组合,能够保留文件的所有属性。具体参数包括:
- -r递归同步目录及其子目录
- -l保留符号链接
- -p保留文件权限
- -t保留时间戳
- -g保留属组信息
- -o保留属主信息
- -D保留设备文件和特殊文件
其它参数:
- -z–compress 对备份的文件在传输时进行压缩处理, 利用压缩算法减少网络传输量,对远程同步尤其有用。
- -v(详细输出)
- -vv(更详细输出)参数用于显示同步过程的信息,便于调试。
- -e 'ssh -p 1234'指定使用 SSH 端口作为传输通道。
- --delete参数使目标目录与源目录完全同步,删除目标中源目录不存在的文件。
- --exclude=PATTERN指定排除(不需要)传输的文件和目录模式,
- --include=PATTERN指定不排除而需要传输的文件和目录模式
- --exclude=“模式” 和- --include=“模式"参数允许用户指定需要排除或包含的文件和目录,支持通配符(*、?)和规则文件。
- --progress参数显示传输进度,
- -P断点续传 + 进度条,大文件必备, 该参数等价于- --partial
- --progress,即保留部分传输的文件并显示进度。
- --partial参数允许恢复中断的传输,避免每次中断后重新传输整个文件。
- --password-file=FILE从FILE中得到密码
二、本地同步场景与案例
本地同步适用于同一台服务器上不同目录之间的文件复制和备份。
基础目录同步是最常见的用例,通过-av参数保留文件属性并递归同步:
|  |  | 
/data/source/路径末尾的斜杠(/)表示只同步source目录下的 文件和子目录到/data/backup目录下, 不包括 source 目录名 ;
/data/source路径不带斜杠则同步(copy)整个目录/文件到/data/backup目录下, 同步完成后在/data/backup目录下存放
了名为 source 的 目录/文件。
排除特定文件的同步场景常用于避免同步临时文件或日志:
|  |  | 
--exclude参数支持通配符和目录路径,可多次使用或通过--exclude-from=文件引用规则文件。
对于需要保留历史版本的备份,rsync提供了增量备份功能,通过--link-dest参数实现:
|  |  | 
此命令会为未修改的文件创建硬链接到基准目录(/backup/last),仅复制差异部分,大幅节省存储空间。硬链接备份特别适合每日全量备份与增量保留,通过创建时间戳目录和软链接实现版本控制。
三、远程SSH同步场景与案例
远程SSH同步是rsync最常用的场景之一,适用于服务器间文件传输和备份。
基本远程同步命令格式为:
|  |  | 
- -z参数启用压缩传
- -e "ssh"指定SSH协议。
对于双向同步(本地与远程相互同步),可使用以下命令:
|  |  | 
此命令会将远程目录同步到本地。若需频繁同步,可通过SSH密钥认证实现免密登录,避免每次输入密码。
完全同步(包括删除目标中多余的文件)需要添加–delete参数:
|  |  | 
--delete 参数会删除目标目录中存在但是源目录不存在的文件,使两端数据完全一致,但使用时需谨慎,避免误删重要文件。
限速同步适用于需要控制带宽的场景,如避免同步任务占用过多网络资源:
|  |  | 
–bwlimit=KB/s参数限制传输速率,单位为KB/s。
排除文件远程同步可与本地同步类似使用–exclude参数:
|  |  | 
此命令排除了临时文件和交换文件,仅同步实际需要的文件内容。
四、实时同步配置与高级技巧
对于需要即时响应文件变化的场景,rsync可与inotify结合实现实时文件同步。
inotify基础配置需先安装inotify-tools:
|  |  | 
然后编写监控脚本:
|  |  | 
此脚本会持续监控源目录及其子目录,当检测到文件变化时触发rsync同步。事件定向同步可避免全量传输,仅同步发生变更的目录:
|  |  | 
通过$(dirname ${file})获取文件的父目录,仅同步受影响的子目录,显著提高效率。
排除临时文件是实时同步中的重要技巧,避免因编辑器临时文件(如.swp)触发不必要的同步:
|  |  | 
--exclude参数可多次使用或通过--exclude-from=文件引用规则文件。
多服务器实时同步可通过循环实现:
|  |  | 
此脚本会将源目录的变化同步到所有指定的从服务器。
系统资源限制是实时同步需注意的问题。inotify默认可监控的文件数量有限,可通过调整内核参数解决:
|  |  | 
max_user_watches参数控制每个用户可监控的最大文件数量,需根据实际监控目录的文件数量设置。
事件队列优化可防止因频繁触发同步导致的资源占用:
|  |  | 
sleep 2 命令在同步后添加延迟,防止因连续变化触发过多rsync进程。