如何使用 Rsync 实现服务器与网站数据的增量同步备份?
使用 rsync实现服务器与网站数据的增量同步备份,核心思路是利用其高效的增量算法,通过 SSH 或 rsync daemon 模式进行数据同步。以下是两种主流方案的详细步骤。
💡 核心思路
-
增量同步原理:
rsync通过对比源和目标文件的修改时间、大小等信息,仅传输差异部分,极大节省带宽和时间。首次备份为全量,后续均为增量。 -
两种主流方式:
-
SSH 模式:通过 SSH 协议传输,配置简单,安全性高,是大多数场景的首选。
-
Rsync Daemon 模式:目标服务器运行
rsync服务,通过rsync://协议同步,适合多客户端备份到同一服务器的场景。
-
🔧 方案一:通过 SSH 实现增量同步 (推荐)
此方案适用于将网站数据从生产服务器增量备份到另一台备份服务器或本地机器。
1. 环境准备
-
两台 Linux 服务器:一台作为源服务器(网站所在),一台作为备份服务器。
-
SSH 互通:确保两台服务器之间可以通过 SSH 免密登录。
配置 SSH 免密登录 (在源服务器执行):
bash
生成密钥对(若已存在可跳过)
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
将公钥复制到备份服务器
ssh-copy-id backupuser@BACKUP_SERVER_IP
测试免密登录
ssh backupuser@BACKUP_SERVER_IP "echo 'SSH 免密登录测试成功'"
2. 执行增量同步
基础命令:
bash
rsync -avz -e "ssh -p 22" \
--delete \
--exclude='*.log' \
--exclude='cache/' \
/var/www/html/ \
backupuser@BACKUP_SERVER_IP:/backup/website/
参数解析:
-
-a: 归档模式,保留文件权限、时间戳等所有属性,是增量备份的基础。 -
-v: 显示详细过程。 -
-z: 传输时压缩数据,节省带宽。 -
-e "ssh -p 22": 指定使用 SSH 协议及端口。 -
--delete: 镜像同步。删除目标端存在而源端已不存在的文件。请谨慎使用,建议先用--dry-run测试。 -
--exclude: 排除不需要备份的文件或目录,如日志、缓存等。 -
路径注意: 源路径末尾的
/表示同步目录内的内容,而不是目录本身。
首次备份建议:
在正式运行前,强烈建议先使用 --dry-run参数进行模拟,检查将要执行的操作是否正确。
bash
rsync -avz -e "ssh -p 22" \
--delete --dry-run \
--exclude='*.log' \
/var/www/html/ \
backupuser@BACKUP_SERVER_IP:/backup/website/
确认无误后,去掉 --dry-run执行真实备份。
3. 自动化定时备份
使用 crontab将同步任务设置为定时执行。
编辑定时任务:
bash
crontab -e
添加以下内容(示例为每天凌晨 2 点执行):
text
0 2 * * * /usr/bin/rsync -az -e "ssh -p 22" --delete --exclude='*.log' --exclude='cache/' /var/www/html/ backupuser@BACKUP_SERVER_IP:/backup/website/ >> /var/log/rsync_website.log 2>&1
参数解析:
-
0 2 * * *: cron 时间表达式,代表每天 02:00 执行。 -
>> /var/log/rsync_website.log 2>&1: 将标准输出和错误输出都追加到日志文件,便于排查问题。
⚙️ 方案二:通过 Rsync Daemon 实现
此方案适用于将多台服务器的数据统一备份到一台专用的备份服务器。
1. 在备份服务器上配置 Rsync Daemon
① 安装 rsync (若未安装):
bash
CentOS/RHEL
yum install -y rsync xinetd
Ubuntu/Debian
apt update && apt install -y rsync
② 创建配置文件 /etc/rsyncd.conf:
ini
uid = root
gid = root
use chroot = no
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
定义一个名为 "website" 的备份模块
[website]
path = /backup/website/ # 备份目标目录
comment = Web Site Backup
read only = no # 允许写入
list = no
hosts allow = SOURCE_SERVER_IP # 允许连接的源服务器IP
auth users = rsyncuser # 认证用户名
secrets file = /etc/rsync.passwd # 密码文件
③ 创建密码文件 /etc/rsync.passwd:
text
rsyncuser:YourStrongPassword
④ 设置权限并启动服务:
bash
chmod 600 /etc/rsync.passwd
若使用 xinetd 管理
sed -i 's/disable.=.yes/disable = no/' /etc/xinetd.d/rsync
service xinetd restart
或直接作为守护进程启动
rsync --daemon --config=/etc/rsyncd.conf
2. 在源服务器上执行同步
① 创建密码文件 /etc/rsync.pass(仅含密码):
text
YourStrongPassword
② 设置权限:
bash
chmod 600 /etc/rsync.pass
③ 执行同步命令:
bash
rsync -avz --delete \
--password-file=/etc/rsync.pass \
/var/www/html/ \
rsyncuser@BACKUP_SERVER_IP::website/
此命令的格式为 rsync [选项] 源路径 用户名@服务器IP::模块名。
🗄️ 数据库备份策略
rsync适用于同步文件,但数据库备份有其特殊性,推荐结合使用 mysqldump或 xtrabackup。
推荐流程:
-
在源服务器上:使用
mysqldump导出数据库为 SQL 文件。bash
mysqldump -u dbuser -p'dbpass' --single-transaction --routines --triggers dbname > /backup/db_$(date +%F).sql
-
使用 rsync 同步:将生成的 SQL 备份文件同步到备份服务器。
bash
rsync -avz /backup/db_*.sql backupuser@BACKUP_SERVER_IP:/backup/database/
✅ 关键注意事项
-
先测试,再同步:始终先用
--dry-run和少量数据测试命令,特别是使用--delete参数时,避免误删数据。 -
保护敏感信息:妥善保管 SSH 私钥和 rsync 密码文件,权限设为
600。 -
保留历史版本:
rsync --delete是镜像备份。如需保留历史版本,可结合cp -al或rsync的--link-dest参数实现快照式备份,或定期将备份目录打包归档。 -
监控与告警:检查
cron任务的执行日志,确保备份成功。可设置脚本在失败时通过邮件等方式告警。

浙公网安备 33010602011771号