3. 备份策略设计

备份策略设计的本质,是在“可恢复性、存储成本、备份耗时、对生产影响”四者之间找到可接受的平衡点。GitLab 的备份对象包括 PostgreSQL 数据库、Git 仓库数据、对象存储(如 LFS、附件、制品)、配置文件(/etc/gitlab)以及密钥文件(/etc/gitlab/gitlab-secrets.json)。这些对象的体积、变化速率和恢复优先级并不相同,因此策略设计不能只回答“多久备份一次”,而要回答“哪些数据用什么方式、以什么频率、保留多久、在什么时间窗口内完成”。

全量备份与增量备份的取舍

GitLab 官方提供的 gitlab-backup create 命令生成的是全量备份:每次执行都会把数据库、仓库和对象存储打包成一个归档。它的优点是恢复路径简单、依赖少、完整性容易验证;缺点是耗时和占用空间随数据量线性增长。对于 100 GB 级别的实例,一次全量备份在中等磁盘性能下可能需要 30~90 分钟,且会明显消耗 CPU、磁盘 IO 和网络带宽。

GitLab 本身没有原生的“块级增量备份”命令,增量能力通常来自底层存储或数据库层:PostgreSQL 使用 WAL 归档配合基础备份实现时间点恢复(PITR),文件系统或对象存储使用快照(如 LVM 快照、ZFS 快照、云盘快照)实现差异捕获。因此实际策略往往是“周期性全量 + 高频增量”的组合:

  • 全量备份:每周一次,作为恢复基线,保证归档自包含。
  • 增量/快照:每日或每小时一次,缩短 RPO,但必须与全量基线配套使用。
  • WAL 归档:若要求 RPO 在分钟级,必须开启 PostgreSQL WAL 持续归档,否则只能恢复到最近一次全量或快照点。
判断依据:如果业务能接受“丢失一天数据”,每日全量即可;如果只能接受“丢失 15 分钟数据”,就必须引入 WAL 归档或高频快照,而不能只靠提高全量频率——全量频率过高会拖垮生产实例。

备份频率与保留周期

频率由 RPO 决定,保留周期由合规要求、恢复场景和存储预算共同决定。一个常见的分层保留模型是:

层级频率保留周期用途
小时级增量每 1 小时48 小时误删、误改后的快速回退
每日全量每天 1 次14 天日常恢复主力
每周全量每周 1 次8 周跨周恢复、版本回溯
每月归档每月 1 次12 个月合规审计、长期留存

保留周期不是越长越好。每多保留一份全量,就多一份存储和校验成本;同时旧备份的恢复演练频率低,容易在真正需要时才发现损坏。建议对超过 30 天的归档执行定期校验(如校验归档大小、解包测试、恢复演练),并明确“过期即删除”的自动化规则,避免备份目录无限膨胀。

RPO 与 RTO 目标设定

RPO(Recovery Point Objective)是“能容忍丢失多少数据”,对应备份频率;RTO(Recovery Time Objective)是“能容忍停机多久”,对应恢复速度。两者必须一起定义,否则会出现“备份很频繁但恢复要 8 小时”的错配。

以某研发团队为例,其 GitLab 实例约 200 GB,包含 3000 个仓库。业务方要求:代码丢失不超过 1 小时,故障后 4 小时内恢复服务。据此可推导:

  • RPO = 1 小时 → 需要每小时一次增量或 WAL 归档,不能只做每日全量。
  • RTO = 4 小时 → 恢复流程必须包含:准备目标机、安装同版本 GitLab、恢复 secrets 与配置、恢复数据库与仓库、启动并验证。按经验,200 GB 数据恢复约需 1.5~2.5 小时,加上环境准备,4 小时是可行但偏紧的目标。

RTO 的估算不能凭感觉,应通过恢复演练测量。建议记录每次演练的“开始时间、数据恢复完成时间、服务可用时间”,形成实际 RTO 基线。如果实测 RTO 超过目标,优先优化恢复流程(如预装同版本、使用更快的存储、并行恢复),而不是盲目增加备份频率。

备份窗口规划

备份窗口是备份任务允许运行的时间段,必须避开业务高峰和 GitLab 自身的维护任务(如 gitlab-rake gitlab:cleanup、容器镜像清理、日志轮转)。规划时考虑三点:

  1. 业务低峰:多数团队的低峰在凌晨 1:00~5:00,此时推送、CI 任务最少。
  2. 任务时长:全量备份耗时必须小于窗口长度,并预留 20% 余量。若全量需 90 分钟,窗口至少 2 小时。
  3. 任务错峰:全量、增量、WAL 归档、对象存储同步不要同时启动,避免 IO 争抢导致全部超时。

下面这张图展示了一个典型的备份策略在时间轴上的排布关系,以及 RPO/RTO 与备份频率、恢复流程之间的对应逻辑:

备份策略时间轴与 RPO / RTO 对应关系 时间 00:00 02:00 04:00 06:00 08:00 10:00 全量备份窗口 01:00–03:00 增量 增量 增量 增量 增量 增量 增量 增量 增量 PostgreSQL WAL 持续归档(分钟级 RPO) RPO ≤ 1h 恢复流程与 RTO 构成(示例:目标 RTO ≤ 4h) ① 环境准备 约 30 min ② 恢复 secrets 约 10 min ③ 恢复数据 约 90–150 min ④ 启动验证 约 30 min 注:时长为示例估算,实际 RTO 应以恢复演练实测为准

从图中可以看出,RPO 由增量/WAL 的频率决定,RTO 由恢复流程各阶段耗时累加决定。两者不是同一个维度:提高备份频率能改善 RPO,但不会自动缩短 RTO;要缩短 RTO,必须优化恢复步骤、准备同版本环境、使用更快的存储,并定期演练。

策略落地建议

综合以上分析,一个可执行的 GitLab 备份策略应至少明确以下内容:备份对象清单(数据库、仓库、对象存储、配置、secrets)、全量与增量的组合方式、各层保留周期、RPO 与 RTO 目标值、备份窗口起止时间、失败告警方式、恢复演练频率。建议将策略写入运维文档,并在每次架构变更(如扩容、迁移对象存储)后重新评估,因为数据量和恢复路径的变化会直接影响 RPO 与 RTO 的达成情况。

常见误区:只配置了每日全量备份,却对外承诺“最多丢 1 小时数据”;或者保留了 90 天备份,却从未做过一次恢复演练。备份策略的有效性不取决于备份任务是否成功,而取决于在真实故障场景下能否在 RTO 内恢复到 RPO 要求的数据点。