rsync是CentOS系统下做增量备份最靠谱的工具,没有之一。它通过文件差异算法只传输变化的部分,配合排除规则可以精准控制哪些文件要备份、哪些不要。核心命令就一句话:rsync -avz --delete --exclude='规则' 源目录 目标目录,但真正用好它需要理解增量机制、排除规则写法、以及实际生产中的各种坑。下面我把从安装到实战的全部细节一次性讲透。
一、rsync在CentOS上的安装与基本原理
CentOS 7默认自带rsync,CentOS 8/9同样预装。如果你的系统是最小化安装没带,执行yum install rsync或dnf install rsync即可。安装完验证版本:rsync --version,通常会显示3.x版本,3.1.x以上支持增量传输的完整特性。
rsync的增量备份原理并不复杂。它会对比源文件和目标文件的修改时间和文件大小,如果一致就跳过,不一致才传输。更高级的做法是加上-c参数,通过校验和(checksum)做精确比对,确保文件内容真的没变。生产环境中我建议默认开启-c,虽然会多一次IO读取,但数据准确性更高。
rsync支持本地备份、远程备份(通过SSH)、以及守护进程模式(daemon mode)。CentOS运维中最常用的是SSH远程增量备份,因为不需要额外开放端口,安全性也高。命令格式就是:rsync -avzc -e ssh /data/ user@backup-server:/backup/data/。
二、增量备份的核心参数详解
做增量备份,参数选择直接决定效果。下面逐个拆解最关键的几个:
-a(archive模式):等同于-rlptgoD,递归复制、保留符号链接、权限、时间戳、属主、属组、设备文件。这是备份的基础,几乎每次都要加。
-v(verbose):显示传输过程,方便排查问题。
-z(compress):传输时压缩数据,节省带宽。局域网备份可以不加,跨机房或跨地域必须加。
-c(checksum):通过校验和比对文件内容,而不是只看时间和大小。强烈建议生产环境加上。
--delete:目标端删除源端已经不存在的文件,保持两边完全一致。注意这个参数有风险,如果源目录误删了文件,目标也会跟着删,所以要配合--backup和--backup-dir使用。
--progress:显示每个文件的传输进度,大文件备份时很有用。
一个典型的生产级增量备份命令如下:
rsync -avzc --delete --progress --backup --backup-dir=/backup/deleted_$(date +%Y%m%d) /data/ user@192.168.1.100:/backup/data/
这条命令的意思是:把/data/目录增量同步到远程192.168.1.100的/backup/data/,删除目标多余文件,传输前做内容校验,同时把被删除的文件备份到带日期的目录里防止误删。
三、排除规则的写法与实战技巧
排除规则是rsync最灵活也最容易写错的部分。规则写在--exclude参数后面,支持通配符和相对路径/绝对路径。核心原则就一条:排除规则的路径要和源目录的相对路径保持一致。
假设源目录是/data/,你要排除/data/logs/下所有的.log文件,正确写法是:
rsync -avzc --exclude='logs/*.log' /data/ user@backup:/backup/data/
如果你写成--exclude='/data/logs/*.log'反而会失效,因为rsync在匹配时会自动去掉源目录前缀。这是新手最常踩的坑。
多个排除规则直接多次加--exclude即可:
rsync -avzc --exclude='logs/' --exclude='tmp/' --exclude='*.tmp' --exclude='*.cache' /data/ user@backup:/backup/data/
上面这条排除了logs目录、tmp目录、所有tmp临时文件和cache缓存文件。注意排除目录时末尾要加斜杠/,表示排除整个目录;不加斜杠只排除目录名匹配的文件。
如果排除规则很多,建议用--exclude-from参数从文件读取,这样管理起来更清晰。先创建一个exclude.txt文件:
logs/ tmp/ *.log *.tmp .git/ node_modules/ *.swp .DS_Store
然后命令变成:
rsync -avzc --exclude-from='exclude.txt' /data/ user@backup:/backup/data/
这个方式在生产环境中非常推荐,规则集中管理,版本控制也方便。
四、常见排除场景与最佳实践
CentOS服务器上需要排除的文件类型其实有规律可循,我按场景分类说:
日志类:/var/log/下的大日志文件、应用自己写的logs目录。这些文件增长快、价值低,而且rsync传输大日志很慢。建议用logrotate先切割再备份,或者直接排除。
临时文件:/tmp/、/var/tmp/、应用产生的session文件、上传临时目录。这些文件每次重启都会重建,备份毫无意义。
缓存与编译产物:.git/目录、node_modules/、target/(Java)、__pycache__/(Python)、.cache/。这些都可以从源码重新生成,不需要备份。
系统文件:/proc/、/sys/、/dev/这些虚拟文件系统,rsync根本不应该去碰,加排除规则是双重保险。
数据库文件:正在运行的MySQL/PostgreSQL数据文件直接rsync会得到损坏的备份。正确做法是先用mysqldump导出SQL再备份,或者用xtrabackup做热备后再rsync备份文件。
五、定时备份与自动化脚本
增量备份必须配合crontab定时执行才有意义。编辑crontab -e,添加如下任务每天凌晨2点执行:
0 2 * * * /usr/bin/rsync -avzc --delete --exclude-from=/etc/rsync/exclude.txt /data/ root@backup-server:/backup/data/ >> /var/log/rsync_backup.log 2>&1
注意几点:用绝对路径调用rsync;日志重定向方便排错;建议用root或专用备份用户执行;远程连接建议配置SSH密钥免密登录,否则crontab里无法输入密码会失败。
SSH免密登录配置很简单:在源服务器上执行ssh-keygen -t rsa,然后ssh-copy-id user@backup-server,之后rsync就不需要密码了。
更完善的做法是写一个shell脚本,加上执行前检查、执行后验证、失败告警。比如:
#!/bin/bash
SRC="/data/"
DST="user@backup-server:/backup/data/"
EXCLUDE="/etc/rsync/exclude.txt"
LOG="/var/log/rsync_backup_$(date +%Y%m%d).log"
rsync -avzc --delete --exclude-from=$EXCLUDE $SRC $DST >> $LOG 2>&1
if [ $? -eq 0 ]; then
echo "$(date): Backup success" >> $LOG
else
echo "$(date): Backup FAILED" >> $LOG
# 这里可以加邮件告警或企业微信通知
fi六、增量备份的局限性与应对方案
rsync增量备份不是万能的,必须认清它的边界。第一,它不是真正的增量块级备份,只是文件级增量。如果一个10GB的文件改了1KB,rsync默认会重新传输整个文件(加--partial可以断点续传,但首次还是全量)。对于大文件频繁小改动的场景,建议用rsync配合--inplace参数或者考虑rsync+rdiff-backup组合。
第二,rsync没有内置的版本保留机制。虽然上面提到用--backup-dir保存删除文件,但这不等于历史版本。如果需要保留多个历史快照,可以用rsnapshot工具(基于rsync+硬链接),或者自己写脚本在目标端做 dated snapshots。
第三,rsync在极端情况下可能出现目标文件损坏。建议备份完成后加一步校验,比如对比两边文件数量和总大小:
# 源端统计 find /data/ -type f | wc -l du -sh /data/ # 目标端统计(通过SSH) ssh user@backup-server "find /backup/data/ -type f | wc -l" ssh user@backup-server "du -sh /backup/data/"
第四,大量小文件场景下rsync性能会下降。这时候可以调整参数,比如增大--bwlimit限速避免占满带宽,或者用-W参数整文件传输跳过增量比对来提速(适合信任目标端已有基础备份的情况)。
七、总结与建议
rsync在CentOS上做增量备份,核心就是三件事:参数选对(-avzc --delete)、排除规则写准(相对路径、用文件管理)、自动化跑起来(crontab+免密+脚本+告警)。不要指望一条命令解决所有问题,生产环境要考虑备份验证、历史保留、故障告警、带宽控制。把这些环节都串起来,rsync就是CentOS运维中最轻量、最高效的备份方案之一。数据无价,备份先行,这句话永远不过时。
