pgBackRest 是 PostgreSQL 生态中最受信任的备份恢复方案,过去十年间由 David Steele 一人主导维护,支撑了全球大量企业的核心数据保护。当这个项目的未来突然变得不确定时,整个生态的反应速度和协作方式,值得每一个依赖开源基础设施的团队认真审视。
一个维护者撑起的关键项目
pgBackRest 的定位很明确:为 PostgreSQL 提供可靠、高性能的备份与恢复。它支持全量、增量、差异备份,支持异地存储(S3、Azure 等),支持并行处理和备份加密。在 PostgreSQL 生产环境中,pgBackRest 几乎是备份方案的默认选择。
但"默认选择"背后是一个长期隐患——项目高度依赖单一维护者。David Steele 用超过十年时间把 pgBackRest 打造成了生态中最受信任的工具,但维持关键基础设施的持续运转,需要的不仅是技术能力,更是可持续的资源和组织支撑。当维护者面临现实压力时,项目的未来就会瞬间变得不确定。
不换项目,换支撑方式
pgBackRest 的危机暴露后,Percona 的核心判断是:最重要的问题不是"用什么替代 pgBackRest",而是"怎样让 pgBackRest 保持健康、可持续、对所有人开放"。
这个判断背后有清晰的逻辑:
- pgBackRest 是关键基础设施,承载着企业最重要的数据保护职责。
- 替换它意味着迁移风险、验证成本和新的不确定性。
- 分叉或封闭替代方案只会制造生态碎片化,不会让任何一方真正受益。
Percona 选择的是"延续"而非"分裂"——通过协调资金、贡献工程资源、扩大维护者基数、鼓励多组织参与,来强化项目本身。目标从来不是控制项目,而是确保 pgBackRest 对整个 PostgreSQL 社区保持开放和健康。
社区协作已经在产生结果
这些努力已经见效。多个维护者、贡献者和公司正在联合行动,资金讨论、工程支持和长期可持续性规划现在是在整个生态中协作进行的。David Steele 对项目可持续性问题的公开揭示,是这一切得以发生的催化剂——超过十年的信任积累,让社区在关键时刻愿意站出来。
这不是某一家公司"拯救"项目的故事,而是 PostgreSQL 生态共同支撑关键基础设施的故事。
实践:pgBackRest 配置与日常备份恢复
理解了项目背景之后,回到日常使用。以下是一个典型的 pgBackRest 配置和操作流程,可以直接在生产环境中改造使用。
配置 pgBackRest
在 PostgreSQL 服务器上创建配置文件 /etc/pgbackrest/pgbackrest.conf:
[global]
repo1-type=s3
repo1-s3-bucket=my-pgbackrest-bucket
repo1-s3-endpoint=s3.amazonaws.com
repo1-s3-region=us-east-1
repo1-s3-key=<YOUR-AWS-ACCESS-KEY>
repo1-s3-key-secret=<YOUR-AWS-SECRET-KEY>
repo1-retention-full=7
repo1-retention-diff=4
repo1-cipher-type=aes-256-cbc
repo1-cipher-pass=<YOUR-ENCRYPTION-PASSWORD>
process-max=4
log-level-console=info
log-level-file=detail
[mydb]
pg1-path=/var/lib/postgresql/16/main
pg1-port=5432
pg1-user=postgres
关键参数说明:
repo1-retention-full=7:保留最近 7 个全量备份,超出自动清理。repo1-retention-diff=4:每个全量备份保留最多 4 个差异备份。repo1-cipher-type=aes-256-cbc:备份数据加密,生产环境务必开启。process-max=4:并行线程数,根据 CPU 核数调整。
初始化存储仓库并执行首次全量备份
# 创建存储仓库
pgbackrest --stanza=mydb repo-create
# 验证配置与 PostgreSQL 连接
pgbackrest --stanza=mydb check
# 执行全量备份
pgbackrest --stanza=mydb --type=full backup
定期增量与差异备份
# 差异备份(基于最近一次全量备份)
pgbackrest --stanza=mydb --type=diff backup
# 增量备份(基于最近一次差异或增量备份)
pgbackrest --stanza=mydb --type=incr backup
恢复操作
# 查看可用备份
pgbackrest --stanza=mydb info
# 恢复到最新状态(停掉 PostgreSQL 后执行)
pgbackrest --stanza=mydb restore
# 恢复到指定时间点
pgbackrest --stanza=mydb --type=time --target="2024-06-15 14:30:00" \
--target-action=promote restore
注意: 恢复操作前必须停止 PostgreSQL 服务。
--target-action=promote表示恢复完成后自动 promote,使集群正常提供服务;如果只想查看数据而不切回生产,可以用--target-action=pause。
用 cron 建立备份节奏
# /etc/cron.d/pgbackrest
# 每周日 02:00 全量备份
0 2 * * 0 postgres pgbackrest --stanza=mydb --type=full backup
# 每周三 02:00 差异备份
0 2 * * 3 postgres pgbackrest --stanza=mydb --type=diff backup
# 每天除周日、周三外 02:00 增量备份
0 2 * * 1,2,4,5,6 postgres pgbackrest --stanza=mydb --type=incr backup
关键开源基础设施的可持续性清单
pgBackRest 的经历不是孤例。任何依赖关键开源项目的团队,都应该提前思考以下问题:
- 维护者结构——项目是否依赖单一维护者?是否有多个组织参与贡献和决策?
- 资金透明度——项目是否有明确的资金来源和可持续计划?资金讨论是否公开?
- 分叉风险——如果项目遇到危机,社区的反应是分裂还是延续?是否有机制防止碎片化?
- 供应商中立——项目是否保持 vendor neutral,不被单一公司控制方向?
- 生态治理——PostgreSQL 生态是否需要更正式的基金会或协作模型来支撑关键基础设施?
Percona 在文章末尾提出了一个更深层的问题:PostgreSQL 生态需要更强的长期可持续性结构来保护关键社区基础设施。无论是基金会形式还是其他协作模型,目标应该一致——确保企业依赖的项目保持健康、可信、可持续维护。
pgBackRest 的故事证明了一件事:健康的开源生态不是靠某一家公司拯救,而是靠整个社区在关键时刻站出来共同支撑。 但更好的做法是,不要等到危机出现才站出来。