用 rsync + cron 给服务器数据搭一套无感自动备份方案
上个月差点因为误操作把 Docker 数据卷目录删掉了,虽然最后靠回收站找回来了,但这件事让我意识到一直没有认真对待数据备份。之前的"方案"就是偶尔手动压缩一个 tar 包扔到 NAS 上,频率完全随心情,根本谈不上可靠。
研究了一圈之后,决定用最朴素的 rsync + cron 组合来解决问题。不引入额外的备份软件,逻辑清晰,出问题也好排查。核心思路是:每天凌晨把需要保留的目录增量同步到另一块磁盘(或 NAS),同时保留最近 7 个版本的快照。
rsync 增量同步
rsync 的 --link-dest 参数可以实现"硬链接快照":每次备份都是一个独立目录,未变化的文件只占用硬链接而不复制实体,磁盘利用率非常高。核心命令如下:
rsync -avz --delete \
--link-dest=/backup/snapshots/latest \
/data/docker-volumes/ \
/backup/snapshots/$(date +%Y%m%d)/
--link-dest=/backup/snapshots/latest \
/data/docker-volumes/ \
/backup/snapshots/$(date +%Y%m%d)/
跑完之后再把 latest 软链接更新到最新快照目录,下次备份就能以此为基准做增量对比,速度很快,通常几秒钟就完成了。
cron 定时调度与告警
把上面的命令封装成一个 shell 脚本,通过 crontab -e 设置为每天凌晨 3 点执行。脚本末尾加了一段判断:如果 rsync 的退出码不为 0,就调用之前配好的 Webhook 接口推送一条告警消息。这样即使备份静默失败,第二天也能第一时间发现。
跑了一个多月下来,备份目录里整整齐齐地躺着每天的快照,看着就安心。下一步打算再加一个定期把旧快照归档到对象存储的脚本,实现本地 + 云端双重冗余。