rsync备份(理论篇)
文章目录
- rsync 备份(理论篇)
- 概述
- 核心特性
- 基础语法
- 运行模式
- 本地模式(Local Mode)
- 远程 Shell 模式(Remote Shell Mode)
- 守护进程模式(Daemon Mode)
- 模式对比
- 注意事项
- 时间问题: 确保各个服务器时间一致
- 权限拒绝:确保目标路径可写(远程需检查 SSH 或 rsync 守护进程权限)。
- 路径斜杠:源路径末尾加 / 同步目录内容,不加则同步目录本身。
- 带宽限制:用 `--bwlimit`(单位 KB/s)避免占满网络。
- 保留文件属性
- 删除目标多余文件(`--delete`)
- 排除不需要的文件(`--exclude`)
- 备份一致性校验
- 性能优化
- 特殊场景处理
- 自动化与定时备份
- 备份验证与监控
rsync 备份(理论篇)
概述
rsync 是一款强大的文件同步和传输工具,以其高效的增量传输和灵活性闻名,广泛用于备份、镜像和系统迁移等场景。以下是它的核心特性和用法详解:
核心特性
- 增量传输
仅传输源与目标之间差异的部分,大幅减少数据传输量,尤其适合大文件或频繁更新的场景。 - 保留文件属性
可保持文件的权限、时间戳、所有者、符号链接等元数据(通过 -a 参数实现)。 - 支持多种传输协议
除本地文件系统外,可通过 SSH(默认)、rsync守护进程(TCP 873端口)等方式远程同步。 - 压缩传输
使用 -z 选项压缩数据,节省带宽(对慢速网络特别有用)。 - 递归同步
自动同步目录及其子目录内容(-r 或 -a 已包含递归)。
基础语法
rsync [选项] 源路径 目标路径
常用选项
-a 归档模式(保留所有属性,等价于 -rlptgoD)
-v 显示详细输出(可叠加 -vv 更详细)
-z 压缩传输数据
-h 以人类可读格式输出
--delete 删除目标中源没有的文件(保持严格同步)
--exclude 排除指定文件/目录(如 --exclude="*.tmp")
-p 显示复制过程,保持文件属性
-P 显示进度 + 断点续传(等价于 --partial --progress)
-n 模拟运行(dry-run),不实际传输
跟多使用rsync --version 查看
运行模式
本地模式(Local Mode)
- 功能:在本地文件系统之间同步文件。
- 语法:
rsync [选项] 源路径 目标路径
- 示例:
# 同步本地目录(保留属性)
rsync -av /data/backup/ /backup/
# 同步时排除某些文件
rsync -av --exclude='*.tmp' /src/ /dest/
- 特点:
- 无需网络,纯本地操作。
- 路径可以是绝对路径或相对路径。
远程 Shell 模式(Remote Shell Mode)
功能:通过 SSH 协议在本地与远程主机之间同步文件(默认加密传输)。
- 语法:
rsync [选项] -e ssh 源路径 目标路径
- 示例:
# 本地 → 远程(推文件)
rsync -avz -e ssh /local/path/ user@remote:/remote/path/
# 远程 → 本地(拉文件)
rsync -avz -e ssh user@remote:/remote/path/ /local/path/
# 指定SSH端口(如2222)
rsync -avz -e "ssh -p 2222" /local/ user@remote:/remote/
-
特点:
-
默认使用 SSH 加密,安全性高。
-
需配置 SSH 免密登录(密钥认证)以简化操作。
-
适合点对点同步。
-
守护进程模式(Daemon Mode)
-
功能:通过 rsync 自带的守护进程(TCP 873端口)实现高效同步,支持多客户端访问和模块化配置。
-
配置步骤:
-
服务端配置
编辑 /etc/rsyncd.conf,定义模块(共享目录):
[backup]
path = /data/backup
comment = Backup Directory
read only = no # 允许写入
auth users = rsync_user
secrets file = /etc/rsyncd.secrets
- 创建密码文件并设置权限:
echo "rsync_user:password123" > /etc/rsyncd.secrets
chmod 600 /etc/rsyncd.secrets
- 启动 rsync 守护进程:
rsync --daemon # 或 systemctl start rsyncd(取决于系统)
- 客户端同步
# 从守护进程拉取文件
rsync -av rsync_user@remote::backup /local/path/
# 推送文件到守护进程
rsync -av /local/path/ rsync_user@remote::backup/
# 指定密码文件(避免交互输入)
rsync -av --password-file=/path/to/passwd_file /local/ rsync_user@remote::module/
模式对比
模式 | 协议/端口 | 安全性 | 适用场景 |
---|---|---|---|
本地模式 | 本地文件系统 | 无网络风险 | 单机备份、目录同步 |
远程Shell | SSH(默认22) | 高(加密) | 点对点远程同步(如VPS备份) |
守护进程 | rsync(TCP 873) | 中(依赖配置) | 多客户端集中备份/分发 |
注意事项
时间问题: 确保各个服务器时间一致
-
常见问题
-
文件覆盖逻辑错误
rsync 默认通过 修改时间(mtime) 和 文件大小 判断是否需要同步。若服务器时间不同步:-
源文件比目标文件“旧”(时间戳更早)→ 可能错误跳过同步。
-
时间戳混乱导致增量备份失效。
-
-
日志与监控异常
备份日志时间戳混乱,难以追踪问题。 -
定时任务失效
cron 等依赖系统时间的任务可能无法按预期执行。
-
-
解决方案
- 方案1:同步服务器时间(推荐)
使用 NTP/Chrony 服务校准时间:
# 安装NTP服务(选其一) sudo apt install ntp # Debian/Ubuntu sudo yum install chrony # CentOS/RHEL # 启动并启用服务 sudo systemctl start ntp sudo systemctl enable ntp # 验证同步状态 ntpq -p # NTP chronyc sources -v # Chrony
-
关键配置:
-
确保所有服务器使用相同的 NTP 服务器(如 pool.ntp.org)。
-
防火墙放行 UDP 123 端口。
-
-
方案2:强制基于校验和同步
若无法立即同步时间,使用 -c 选项基于文件内容校验和(而非时间戳)判断差异:
rsync -avc /source/ user@remote:/target/ # 较耗时,但可靠
-
方案3:手动指定时间判断条件
–size-only:仅比较文件大小(忽略时间)。–ignore-times:强制同步所有文件(即使时间和大小相同)。
rsync -av --size-only /source/ /target/ # 快速但不精确 rsync -av --ignore-times /source/ /target/ # 确保全量同步
- 方案1:同步服务器时间(推荐)
-
时区(Timezone)问题
即使时间已同步,时区不同仍可能导致 date 命令显示不一致:
# 查看和设置时区
timedatectl # 显示当前时区
sudo timedatectl set-timezone Asia/Shanghai # 设置为上海时区
- 特殊场景:修改时间(mtime)保护
若需保留文件的原始时间戳(如备份归档),使用 -t 选项:
rsync -avt /source/ /target/ # 同步并保留mtime
权限拒绝:确保目标路径可写(远程需检查 SSH 或 rsync 守护进程权限)。
- SSH 加密:默认通过 SSH 传输,确保安全。
推荐配置免密登录(SSH 密钥对):
ssh-keygen -t ed25519
ssh-copy-id user@remote_host
- 指定非默认 SSH 端口:
rsync -av -e 'ssh -p 2222' /source/ user@remote:/target/
-
rsync 守护进程模式:
-
限制可访问 IP(
hosts allow
配置)。 -
使用密码文件(
secrets file
)并设置600
权限。
-
路径斜杠:源路径末尾加 / 同步目录内容,不加则同步目录本身。
- 示例:行为差异
rsync -av /data/backup/ /backup/ # 将 backup/* 同步到 /backup/
rsync -av /data/backup /backup/ # 将 backup 目录同步到 /backup/backup/
带宽限制:用 --bwlimit
(单位 KB/s)避免占满网络。
rsync 默认会尽可能占用所有可用带宽进行传输。在以下场景中可能引发问题:
-
生产网络拥塞:备份任务占满带宽,导致业务请求延迟或超时。
-
多任务竞争:同一时间有其他服务(如数据库同步、视频会议)需要带宽。
-
按流量计费环境:突发高速传输可能导致额外费用。
保留文件属性
-
使用
-a
(归档模式)保留权限、时间戳等,但需注意:-
超级用户权限:同步保留所有者(
owner/group
)需root
权限(建议加-r
或 sudo)。 -
特殊文件:-a 包含 -D 选项,可同步设备文件等(需谨慎)。
-
删除目标多余文件(--delete
)
-
风险:
--delete
会删除目标端源端不存在的文件,可能导致数据丢失。-
防护措施:
- 首次使用前先加
--dry-run
(-n
)模拟运行,检查哪些文件会被删除。
rsync -avn --delete /source/ /target/ # 模拟删除操作
结合
--backup-dir
备份被删除的文件:rsync -av --delete --backup --backup-dir=/path/to/backup /source/ /target/
- 首次使用前先加
-
排除不需要的文件(--exclude
)
- 避免备份临时文件、日志等无用内容:
rsync -av --exclude='*.log' --exclude='tmp/' /source/ /target/
- 排除列表文件:若排除规则复杂,使用
--exclude-from=file
:
echo '*.tmp' > exclude.txt
echo 'cache/*' >> exclude.txt
rsync -av --exclude-from=exclude.txt /source/ /target/
备份一致性校验
- 校验文件完整性:同步后可通过
checksum
验证(但耗时):
rsync -avc /source/ /target/ # -c 基于校验和比对
- 日志记录:保存备份日志便于审计:
rsync -av --log-file=/var/log/rsync.log /source/ /target/
性能优化
-
压缩传输(
-z
):适合低速网络,但可能增加 CPU 负载。 -
带宽限制(
--bwlimit
):避免影响其他服务:
rsync -avz --bwlimit=1000 /source/ user@remote:/target/ # 限速 1000KB/s
- 增量备份策略:结合 --link-dest 硬链接实现快照式备份(类似 Time Machine):
rsync -av --link-dest=/path/to/previous_backup /source/ /new_backup/
特殊场景处理
-
大文件或网络不稳定:
-
使用
--partial
保留部分传输的文件,支持断点续传。 -
添加
-P
(等价于--progress --partial
)显示进度。
-
-
符号链接:
-a
包含-l
(保留符号链接),若需跟随链接(复制目标文件)用 -L。
-
稀疏文件(如虚拟机磁盘):
- 使用
-S
选项高效处理。
- 使用
自动化与定时备份
- cron 定时任务:
# 每天凌晨3点同步
0 3 * * * /usr/bin/rsync -avz --delete /source/ user@remote:/target/
- 建议将命令写入脚本,并重定向日志:
# backup.sh
rsync -avz --delete /source/ user@remote:/target/ >> /var/log/backup.log 2>&1
备份验证与监控
- 检查退出状态:
rsync -av /source/ /target/
if [ $? -eq 0 ]; then
echo "Backup succeeded"
else
echo "Backup failed!" | mail -s "Alert" admin@example.com
fi
- 文件数量/大小校验:
# 对比源和目标文件数
find /source/ -type f | wc -l
find /target/ -type f | wc -l