定时备份与实时同步落地:cron + rsync + sersync

上一篇配好了 rsync 备份通道,但”能传”不等于”可靠”。真正的企业备份要有三件事:定时自动跑、校验完整性、失败要告警。这篇把备份闭环补完,再加一份”实时同步”方案。

一、定时备份:一个完整的客户端脚本

脚本职责:打包要备份的内容 → 携带 md5 校验信息 → 推送到备份服务器 → 本地只留最近 7 天。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
# 客户端备份脚本:/server/scripts/client_rsync_backup.sh
# 1. 定义变量
BACKUP_SERVER="backup-server"
BACKUP_MODULE="web01"
SRC_DIR="/server/scripts /etc/nginx /var/www"
DST="/backup"
TS=$(date +%F)

# 2. 创建备份目录
mkdir -p $DST/$TS

# 3. 打包对应文件(已存在不重复打包)
cd $SRC_DIR_ROOT 2>/dev/null
[ -f $DST/$TS/scripts.tar.gz ] || tar zcf $DST/$TS/scripts.tar.gz -C /server scripts

# 4. 携带 md5 校验信息
find $DST/$TS -type f -name "*.tar.gz" | xargs md5sum > $DST/$TS/md5_$TS.txt

# 5. 推送至备份服务器
rsync -av --password-file=/etc/rsync.pass $DST/ rsync://$BACKUP_SERVER::$BACKUP_MODULE/

# 6. 本地保留最近 7 天
find $DST -mtime +7 -exec rm -rf {} \;
1
2
# 每天 01:00 执行
0 1 * * * /server/scripts/client_rsync_backup.sh >> /var/log/backup.log 2>&1

二、校验 + 邮件告警(服务端)

备份传完不算完,还得确认备份是完整的。服务端每天对账:用客户端留下的 md5 文件校验落盘数据,结果发邮件给管理员。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
# 服务端校验脚本:/server/scripts/check_backup.sh
# 1. 定义变量
BACKUP_DIR="/backup/web01"
TS=$(date +%F)
MAIL_TO="ops@example.com"

# 2. 用 flag 文件做 md5 校验,结果存 result_日期
cd $BACKUP_DIR
[ -f $TS/md5_$TS.txt ] || exit 1
md5sum -c $TS/md5_$TS.txt > result_$TS.txt 2>&1

# 3. 把校验结果发给管理员
mailx -s "web01 备份校验 $(date +%F)" $MAIL_TO < result_$TS.txt

# 4. 清理:删除超过 7 天的校验结果、超过 180 天的备份数据
find $BACKUP_DIR -name "result_*" -mtime +7 -delete
find $BACKUP_DIR -type d -mtime +180 -exec rm -rf {} \;
1
2
# 每天 05:00 执行校验(备份 01:00 完成后,留足传输时间)
0 5 * * * /server/scripts/check_backup.sh

没有变量的备份是”假备份”,而这个闭环是:传完即校验、校验完即告警、告警完留痕

三、实时同步:sersync(rsync + inotify)

定时任务有延迟——文件刚被篡改、或者业务要求秒级同步时,要用 inotify 监听目录变化,变化即触发 rsync。sersync 是最成熟的封装(原生 inotify-tools 脚本易漏事件)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 1. 服务端(目标机)装 rsync 并配好多模块(同上篇 rsyncd.conf)
# 2. 客户端装 sersync(依赖 inotify 和 rsync)
wget https://example.com/sersync.tar.gz
tar zxf sersync.tar.gz -C /usr/local && cd /usr/local/sersync

# 3. 配置 confxml.xml 关键项(先备份再改)
# <fileSystem xfs="true"/>
# <filter start="false"> 排除不想同步的文件(按需开启)
# <exclude expression="(.*)\.svn"/>
# </filter>
# <inotify>
# <delete start="true"/>
# <createFolder start="true"/>
# <createFile start="true"/>
# <closeWrite start="true"/>
# <moveFrom start="true"/>
# <moveTo start="true"/>
# <attrib start="false"/>
# </inotify>
# <localpath watch="/data/www"> 监控目录
# <remote ip="10.0.8.41" name="data"/>
# </localpath>
# <rsync>
# <commonParams params="-az"/>
# <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.pass"/>
# </rsync>
# <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/> 失败每 60 分钟重试

# 4. 启动(-d 守护;-r 启动前先全量同步一次)
/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/confxml.xml

坑位提醒:同步多个目录需要多份 confxml + 多进程,一份配置管一个目录;海量文件场景先调大 inotify 上限:

1
sysctl -w fs.inotify.max_user_watches=524288

四、NFS 高可用演练(故障切换)

实时同步的终极用途:NFS 主备切换。两台机器保持目录一致(用上面的实时同步),主 NFS 挂了就切备机:

1
2
3
4
5
6
# 1. nfs 与 backup 两台服务配置保持一致(共享目录、权限、运行身份 www/666)
# 2. 平时用 rsync(ersync) 把主机的 /data 实时同步到备机
# 3. 模拟故障:主 NFS 宕机
# 4. web 节点强制卸载主 NFS,改挂备 NFS(业务侧一条命令切换)
umount -lf /data
mount -t nfs 10.0.8.41:/data /data

生产里这套再配个脚本或让业务侧感知主备地址(虚拟 IP 更好),切换时间从”小时级”降到”分钟级”。

小结

备份体系的完整形态:cron 定时 + rsync 传输 + md5 校验 + 邮件告警 + sersync 实时兜底。工具都是现成的,架构和脚本规范才是沉淀下来的资产——这套脚本模板之后每接一个新服务,改几个变量就能复用。