自建服务的备份策略:3-2-1 法则实践
一块硬盘挂掉之后
一块用了四年的 4TB 机械盘,SMART 报 Reallocated Sector Count 飙到 200+,读写开始出现间歇性卡顿。这种事不是”会不会发生”的问题,是”什么时候发生”的问题。
如果你的 Homelab 跑着 Nextcloud、Vaultwarden、Gitea、家庭照片库,那这块盘一挂,损失的不只是数据,还有你花在配置上的几十个小时。
3-2-1 法则到底说了什么
三句话:
- 3 份数据副本(包括原始数据)
- 2 种不同的存储介质
- 1 份放在异地
拆解到具体操作
第一份:本地原始数据
就是你服务器上正在跑的那些东西。Docker 容器的 volume、数据库文件、配置文件。这是第零步,不算备份。
第二份:本地另一块盘
最基础的做法——用一块独立的硬盘做定时备份。rsync 配合 cron 就够了:
1 | |
数据库别直接拷文件。先 dump 再备份:
1 | |
这里已经满足了”2 种介质”——如果你的主存储是 SSD,备份盘用机械盘,介质就不同了。两块一样的盘也行,至少物理上是独立故障域。
第三份:异地
这是大多数人缺的一环。本地再怎么冗余,一场意外(断电烧主板、进水、被盗)全没了。
几个可行方案:
- 对象存储:各家云厂商都有,按量计费,几十 GB 的备份数据一个月几块钱。用
rclone同步非常方便。 - 另一个物理位置的机器:如果你在朋友家放了台小主机,互相做异地备份,成本几乎为零。
- 加密后传到网盘:用
age或gpg加密,再传到任意网盘。数据安全由加密保证,不依赖网盘的隐私承诺。
1 | |
异地备份一定要加密。不加密等于把数据交给别人。
容易忽略的细节
备份要验证。 从没恢复测试过的备份,不算备份。每隔一段时间,拉一份备份下来,试着恢复,确认数据完整、服务能起来。
版本保留。 --delete 同步虽然省空间,但如果源数据被误删或损坏,备份也跟着坏了。保留最近 7 天的快照,或者用 restic、borgbackup 这类支持增量和版本管理的工具。
1 | |
备份范围要想清楚。 不是所有数据都值得备份。容器镜像可以重新拉,配置可以用 docker-compose 重建。真正不可替代的是用户数据、数据库、证书密钥。把这些梳理清楚,备份体积会小很多。
下一步
3-2-1 解决的是”数据丢不丢”的问题。但还有一个同样重要的问题:恢复要多久? 如果异地备份有 50GB,下载回来要半天,这段时间服务全挂着。灾难恢复的时间目标(RTO),可能是下一个值得研究的方向。