备份与灾难恢复
1. 结论
采用 PostgreSQL 基础备份 + WAL 持续归档 + Cloudflare R2 异地对象存储 + 广州 N100 或 NAS 拉取副本。NAS 可以成为第三份副本,但不替代 R2;RAID、同一 VPS 内的 Docker 卷副本和同一块硬盘上的压缩包均不构成独立灾难恢复能力。
2. 为什么不能只备份 Docker 卷
直接复制正在运行的 PostgreSQL 数据目录可能得到时间点不一致的文件集合,恢复时无法保证可启动或事务完整。正确方式是:
- 使用 WAL-G 或 pgBackRest 创建一致性的物理基础备份。
- 持续归档 WAL,支持时间点恢复。
- 额外保留
pg_dump逻辑备份,用于表级恢复和跨版本迁移。 - 备份成功后必须执行恢复演练;“上传成功”不等于“可以恢复”。
PostgreSQL 官方文档:Continuous Archiving and Point-in-Time Recovery。
3. 三层副本
flowchart LR Primary["生产 PostgreSQL"] --> Physical["基础备份与 WAL"] Physical --> R2["Cloudflare R2<br/>异地对象存储"] R2 --> Local["广州 N100 或 NAS<br/>只读拉取"] Primary --> Logical["定期 pg_dump"] Logical --> R2 R2 --> Drill["季度恢复演练"]
| 层级 | 位置 | 防护目标 | 注意事项 |
|---|---|---|---|
| 生产层 | VPS 或主机本地磁盘 | 快速读写和短期恢复 | 不把本机副本算作异地备份 |
| 异地层 | Cloudflare R2 | 防 VPS 丢失、磁盘损坏和机房故障 | 使用最小权限密钥与生命周期规则 |
| 本地层 | 广州 N100 或 NAS | 防云账号、桶配置和批量删除风险 | 只读拉取、快照、SMART、UPS、定期离线 |
4. Cloudflare R2 成本
按 Cloudflare 当前公开定价:
- Standard 存储:
0.015 美元/GB·月,每月前 10 GB 免费。 - Standard Class A:每月前 100 万次免费,超出后
4.50 美元/百万次。 - Standard Class B:每月前 1000 万次免费,超出后
0.36 美元/百万次。 - 公网出口流量免费。
- Infrequent Access 存储:
0.01 美元/GB·月,但没有免费层,并有读取、取回和最短 30 天存储成本。
官方来源:Cloudflare R2 Pricing。
4.1 小型项目的估算
若保留 194.5 GB 备份数据,Standard 月存储费约为:
(194.5 GB - 10 GB 免费额度) × 0.015 美元 ≈ 2.77 美元/月备份通常是低操作次数工作负载,Class A 和 Class B 请求大多仍在免费额度内。对小规模数据库,R2 Standard 往往比自购 NAS 更早产生正向边际收益:几美元即可获得异地位置、无需磁盘更换、无需家庭上行带宽,也不受本地停电影响。
4.2 Standard 与 Infrequent Access
Infrequent Access 每 GB 每月只便宜 0.005 美元,但会增加请求和数据取回成本,并要求最短 30 天。对于备份量不大、会频繁写入 WAL 且需要定期恢复演练的项目,优先使用 Standard。只有在长期保留量达到 TB 级、对象稳定超过 30 天、恢复极少时,再重新计算 Infrequent Access。
R2 生命周期规则可自动删除过期对象,官方说明:Object lifecycles。
5. 建议的保留策略
早期目标:RPO 5 至 15 分钟,RTO 1 至 4 小时。它是工程目标,必须通过恢复演练确认。
- WAL:持续上传,保留 14 天。
- 物理基础备份:每周一次,保留最近 4 份。
- 月度基础备份:保留 12 个月。
- 逻辑备份:每周一次,关键发布或迁移前额外执行。
- 本地拉取:N100 或 NAS 每日同步元数据,每周拉取最近完整备份。
- 恢复演练:每季度至少一次;重大数据库升级前后各一次。
实际保留量应根据数据库增量、WAL 产生速度、合规要求和 RTO 重新计算,不机械照搬固定天数。
6. NAS 是否值得购买
6.1 早期
当前已有广州 N100 及 1 TB 存储时,先把它作为 R2 的只读拉取节点,新增硬件边际收益通常低于新增成本。前提是生产主库不在同一块硬盘;若 N100 同时承载主库,则必须使用独立磁盘、独立 NAS 或继续保留 R2 异地副本。
6.2 购买 NAS 的触发条件
以下条件同时出现时,NAS 的边际收益才明显提高:
- 需要备份的数据达到数 TB,并持续增长。
- 除数据库外,还要备份源码制品、照片、视频或大模型文件。
- 需要本地快速恢复,互联网下载时间成为 RTO 瓶颈。
- 能承担硬盘、UPS、电费、坏盘更换和日常维护。
NAS 的 RAID 主要提高可用性,不防误删、勒索、控制器故障或整机损坏。应启用不可变快照或版本保留,并周期性离线一份副本。
7. 安全控制
- R2 备份写入凭证只允许写指定桶或前缀,不允许管理其他生产桶。
- 生产服务器与本地拉取节点使用不同凭证;本地节点优先只读。
- 密钥不写入镜像、GitHub 仓库或日志,使用服务器 Secret 文件或 CI Secret。
- 备份在上传前加密,密钥与备份分开保存。
- NAS 不开放公网管理端口,通过 Tailscale 或内网访问。
- 删除策略需要延迟生效或保留对象版本,防止入侵者同时删除生产和备份。
- 恢复演练使用隔离数据库,验证校验和、时间点、账号权限和应用兼容性。
8. 验收清单
- 已成功恢复最近一份物理基础备份。
- 已成功回放 WAL 到指定时间点。
- 已验证
pg_dump可导入目标 PostgreSQL 版本。 - 已验证 R2 生命周期规则不会提前删除恢复所需 WAL。
- 已记录实际 RPO、RTO 和恢复命令。
- 已模拟生产 VPS 完全丢失后的重建流程。
- 已验证本地 N100 或 NAS 副本在云账号不可用时仍可读取。