运维圈流传一句话:「数据丢失只有两种人——没备份的,和没验证过恢复的。」备份是系列文章的最后一篇,因为它是所有操作的底线:配置可以重建,系统可以重装,唯独数据丢了就是丢了。
先纠正一个致命误区:备份 ≠ 同步
很多人用「网盘同步」「RAID 1」「rsync 镜像」当备份,这些方案有一个共同的盲区:它们忠实地复制错误。
- 误删一个文件,同步工具立刻把副本也删了。
- 勒索软件加密了数据,RAID 的两块盘一起变成密文。
- 数据库写入了脏数据,镜像忠实复制了脏数据。
真正的备份必须能回答:「我想回到三天前的那个版本」——这需要历史版本和不可变性,是同步类方案给不了的。
3-2-1 原则
经典的备份策略只有一句话:
- 3 份数据副本(生产数据 + 2 份备份)
- 2 种不同介质(如服务器磁盘 + 对象存储)
- 1 份在异地(防火灾、机房故障、云账号被封)
对一台个人云服务器,可落地的组合是:本地快照(快速恢复)+ 异地对象存储(灾难恢复)。成本不过每月几元,换来的是睡得着觉。
工具一:rsync 做本地快照
rsync 是增量传输的瑞士军刀,适合做本机或内网的快速备份层:
rsync -avz --delete \ --exclude={'/dev/*','/proc/*','/sys/*','/tmp/*'} \ /var/www/ /backup/www-$(date +%F)/关键参数:
-a归档模式(保留权限、时间戳、软链)-v -z显示过程、传输压缩--delete让目标与源一致(用前想清楚:源目录误删会同步到备份,这就是它只能算「快照」不能算唯一备份的原因)
配合 --link-dest 可以实现「占空间很小的每日全量快照」:未变化的文件用硬链接共享同一份数据,每天一个目录却几乎不占额外空间。
数据库备份注意:不能直接 rsync 数据目录——运行中的数据库文件处于不一致状态。正确顺序是先导出逻辑备份:
# PostgreSQLpg_dump -U myapp myapp | gzip > /backup/db/myapp-$(date +%F).sql.gz
# MySQLmysqldump --single-transaction -u myapp -p myapp | gzip > /backup/db/myapp-$(date +%F).sql.gz(--single-transaction 对 InnoDB 做一致性快照导出,不锁表。)
工具二:restic 做加密、去重、版本化备份
restic 是现代备份工具的代表:增量去重、端到端加密、支持 S3 兼容存储,一份数据加密后才离开服务器——就算存储端被攻破,攻击者拿到的也是密文。
初始化仓库(以 S3 兼容对象存储为例):
export AWS_ACCESS_KEY_ID=xxxexport AWS_SECRET_ACCESS_KEY=xxxexport RESTIC_PASSWORD=备份仓库的加密口令
restic -r s3:https://s3.example.com/mybucket/backups init日常备份一条命令:
restic -r s3:https://s3.example.com/mybucket/backups \ backup /var/www /etc /backup/db \ --exclude-file /etc/restic/excludesrestic 每次备份生成一个快照,自动去重——重复备份 100 GB 数据,第二次只传变化的部分。
保留策略:旧快照不是无限留的,按策略清理:
restic -r s3:... forget --prune \ --keep-daily 7 --keep-weekly 4 --keep-monthly 6保留最近 7 个日备份、4 个周备份、6 个月备份,其余删除并回收空间。
定时化:把备份命令写成脚本,用 cron 或 systemd timer 每天凌晨执行,并把结果输出到日志,纳入监控告警——「备份任务失败」必须是一条会叫醒人的告警,静默失败的备份等于没有备份。
恢复演练:备份的真正验收
没恢复过的备份只能算「愿望」。restic 的恢复:
# 列出快照restic -r s3:... snapshots
# 恢复指定快照到临时目录(先在临时位置验证,别直接覆盖生产)restic -r s3:... restore latest --target /tmp/restore-check
# 只取回单个文件restic -r s3:... dump latest /var/www/config.yml > config.yml建议每季度做一次完整演练:把备份恢复到一台干净的机器,验证应用真的能跑起来。演练会暴露各种想当然——比如备份里漏了某个关键目录、数据库导出脚本早就因为密码轮换而失败。
一张个人服务器备份方案清单
- 每日凌晨:
pg_dump/mysqldump导出数据库到本地目录。 - 随后:restic 把「应用数据 + /etc 配置 + 数据库导出」加密备份到异地对象存储,保留 7 日/4 周/6 月。
- 备份失败 → 触发告警,当天处理。
- 每季度:恢复到测试环境演练一次。
- 加密口令、存储密钥记录在离线的密码管理器里——备份全在,口令丢了,一样是数据丢失。
这套方案全部用开源工具和对象存储搭建,月成本一杯咖啡钱,换的是任何单点事故都不致命的底气。
延伸阅读
分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 1 天
部分内容可能已过时