pgBackRest 起死回生:PostgreSQL 备份工具获多方资助继续维护

2026-05-20 23 预计阅读时间:1 分钟
来源:oschina.net AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:9 分钟

今年 4 月 27 日,pgBackRest 作者 David Steele 发了一条让 PostgreSQL 社区震动的公告:这个项目不再维护了。原因很现实——Crunchy Data 被出售后,他一直在独自扛项目、同时找能继续做这份工作的职位,但始终没有成功。赞助寻求也未果。一个被大量生产环境依赖的备份恢复工具,就这样突然面临停摆。

一个多月后,情况反转。Steele 宣布 pgBackRest 将继续维护开发,背后是多方资助到位。项目没死,但这段动荡本身值得每个依赖开源工具的团队认真想想。

pgBackRest 为什么重要

PostgreSQL 自带的 pg_dumppg_basebackup 能覆盖基本场景,但面对生产级需求时短板明显:增量备份、异地容灾、备份保留策略、多仓库管理、并行备份与恢复——这些能力 pg_basebackup 都不提供。pgBackRest 填的就是这个空缺。

它的核心能力包括:

  • 增量与差异备份:基于页级变化检测,不必每次全量拷贝,大幅缩短备份窗口和存储开销。
  • 多备份仓库:可同时将备份推到本地和 S3 等远程存储,一份配置搞定异地容灾。
  • 并行操作:备份和恢复都支持多线程压缩与传输,大数据库场景下速度差距显著。
  • 备份保留与轮转:按策略自动清理过期备份,不需要自己写 cron 脚本拼逻辑。
  • 完整性验证:备份完成后自动校验 checksum,恢复前也能先验证,避免"备份写了但数据坏了"的隐蔽灾难。

在 PostgreSQL 生态里,能做到这一层且久经生产验证的开源工具,pgBackRest 凟然大物。它被 Crunchy Data、EDB 以及大量企业用户用在关键业务上,停维护的消息一出,社区反应激烈,正是因为替代选项要么功能覆盖不足,要么成熟度远不及它。

动荡与资助:发生了什么

Steele 在公告中坦率说了困境:Crunchy Data 出售后,他失去了公司支撑,独自维护一个被广泛依赖的项目,同时还要解决自己的就业问题。赞助渠道也没能及时补位。这不是"作者不想做了",而是"作者没法继续做了"——典型的单点维护者风险。

一个多月后,多方资助到位,项目继续。具体资助方和金额细节在原文中有更完整说明,但关键信号是:这不是单一公司接盘,而是多家联合出资。这种模式比"一家独揽"更健康——单一公司随时可能因战略调整再次放弃,多方分担则让项目命运不绑定于任何一家的商业周期。

实操:从零配置 pgBackRest 全量 + 增量备份

下面是一个可以在本地直接跑起来的最小配置示例,适合测试和学习。生产环境需要调整仓库路径、压缩算法和保留策略。

安装(Ubuntu/Debian)

# 添加 pgBackRest 官方 APT 源
sudo apt-get install -y curl
curl -fsSL https://www.pgbackrest.org/release.key | sudo gpg --dearmor -o /usr/share/keyrings/pgbackrest-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/pgbackrest-archive-keyring.gpg] https://apt.pgbackrest.org $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/pgbackrest.list
sudo apt-get update
sudo apt-get install -y pgbackrest

创建配置和备份仓库

# 创建备份仓库目录
sudo mkdir -p /var/lib/pgbackrest
sudo chown postgres:postgres /var/lib/pgbackrest

# 创建配置文件
sudo mkdir -p /etc/pgbackrest
sudo tee /etc/pgbackrest/pgbackrest.conf <<'EOF'
[global]
repo1-type=posix
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2
repo1-retention-diff=3
process-max=2
log-level-console=info
log-level-file=detail

[mydb]
pg1-path=/var/lib/postgresql/16/main
EOF

sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf

PostgreSQL 需要开启 archive_mode

# 修改 postgresql.conf(路径根据你的版本调整)
sudo tee -a /etc/postgresql/16/main/postgresql.conf <<'EOF'
wal_level=replica
archive_mode=on
archive_command='pgbackrest --stanza=mydb archive-push %p'
EOF

# 重启 PostgreSQL
sudo systemctl restart postgresql

初始化 stanza 并执行首次全量备份

# 创建 stanza(检查配置并初始化仓库结构)
sudo -u postgres pgbackrest --stanza=mydb stanza-create

# 执行全量备份
sudo -u postgres pgbackrest --stanza=mydb --type=full backup

# 查看备份信息
sudo -u postgres pgbackrest --stanza=mydb info

执行增量备份

# 差异备份(基于最近一次全量)
sudo -u postgres pgbackrest --stanza=mydb --type=diff backup

# 增量备份(基于最近一次差异或增量)
sudo -u postgres pgbackrest --stanza=mydb --type=incr backup

模拟恢复

# 停掉 PostgreSQL
sudo systemctl stop postgresql

# 清空数据目录(模拟灾难)
sudo -u postgres rm -rf /var/lib/postgresql/16/main/*

# 恢复到最新状态
sudo -u postgres pgbackrest --stanza=mydb --type=immediate restore

# 启动 PostgreSQL
sudo systemctl start postgresql

注意:以上示例在单机本地仓库上运行。生产环境建议至少配置一个 S3 远程仓库(repo2-type=s3),并调整 repo1-retention-full 保留足够多的全量备份周期。恢复时如果需要时间点恢复(PITR),用 --type=time --target="2024-06-01 12:30:00" 替代 --type=immediate

这次事件给团队的提醒

pgBackRest 活过来了,但这段插曲暴露的问题不会因为结局好就消失:

  1. 单点维护者是最脆弱的架构。一个被成千上万生产环境依赖的工具,维护者只有一个人,公司撤手后项目立刻停摆。评估你依赖的开源工具时,看维护者数量和资金来源比看 GitHub star 更重要。
  2. 多方资助比单一公司更抗风险。这次多方联合出资的模式值得注意——任何一家退出,项目不会立刻断粮。如果你所在公司重度依赖某个开源项目,参与联合资助是成本远低于"项目死了再迁移"的保险。
  3. 备份工具的选型要考虑生态韧性。pgBackRest 现在安全了,但下次呢?配置备份方案时,确保你的恢复流程不深度绑定工具的独有格式。pgBackRest 的备份输出是标准 PostgreSQL WAL + 数据文件,这意味着即使工具本身出问题,你仍然可以手动拼恢复路径——这是选型时容易被忽略但极其关键的属性。
  4. 定期验证备份可恢复性。工具活着不代表你的备份有效。pgBackRest 的 verify 命令和定期恢复测试应该写在运维 checklist 里,而不是只在出事时才想起来。

pgBackRest 的故事结局不错,但它提醒了一件事:你每天跑的备份命令背后,是一个人在撑。让那个人撑得住,是整个生态的责任。


相关推荐