pgBackRest 突然宣告停维,PostgreSQL 备份生态怎么了

2026-05-19 25 预计阅读时间:1 分钟
来源:postgr.es AI 摘要 原文链接

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

预计阅读时间:9 分钟

2026 年 4 月 27 日,一条消息出现在 pgBackRest 项目仓库:项目即将归档,主动维护终止。对于大量依赖 pgBackRest 做 PostgreSQL 备份与恢复的生产环境来说,这几乎是一声闷雷——十年来最广泛使用的备份工具,突然被贴上 "dead"、"EOL"、"abandoned" 的标签。

导火索并不复杂:长期维护者在超过十年的无偿投入后,明确表示没有可持续资金就无法继续,选择归档仓库。消息传得快,解读传得更快。

pgBackRest 为什么重要

pgBackRest 不是一个小众工具。在 PostgreSQL 生态里,它和 Barman 一起构成了企业级备份的两大主流方案。它的核心能力:

  • 全量 + 增量 + 差异备份,支持多备份仓库(repo),可同时写本地和 S3 等远程存储
  • 逐文件压缩与并行传输,大数据库备份时间可压缩到原来的几分之一
  • 时间点恢复(PITR),配合 WAL 归档可恢复到任意秒级时间点
  • 备份保留策略,按全量备份轮转自动清理增量,避免存储膨胀
  • 加密备份,repo 级别 AES-256 加密

大量企业把 pgBackRest 嵌进了 Ansible/Terraform 部署流水线、Kubernetes Operator(如 Patroni + pgBackRest 组合),甚至云厂商的托管服务底层也在用它。这意味着——它停维,不是换一个工具就能了事的事。

停维的真实含义

"归档仓库"和"彻底不可用"不是同一件事。归档后:

  • 代码仍然可读、可 clone、可自行编译
  • 已有 release 不会消失
  • Issue 和 PR 不再接受,安全漏洞不会再有人主动修
  • 新版 PostgreSQL 的兼容性不会再有人跟进

所以更准确的定位是:pgBackRest 进入无人维护的冻结状态。对于已经稳定运行、不打算升级 PostgreSQL 大版本的场景,短期内风险可控;但对于需要长期演进、安全合规、或计划升级到 PostgreSQL 18+ 的团队,风险在时间轴上持续累积。

根本问题:开源维护的可持续性

pgBackRest 的维护者不是"不想干了",而是干了十年,没有可持续收入。这不是个例——过去几年里,从 log4j 到 core-js,类似的故事反复上演:

  • 单人维护、企业级依赖、零资金支持
  • 用户免费享受成果,直到某一天维护者退出才意识到风险
  • 社区反应总是"震惊",但维护者的疲惫往往已经持续数年

pgBackRest 的案例再次证明一个硬事实:生产级开源工具必须有可持续的资金模型,否则"免费"只是延迟付款。

当前该怎么办:实用检查与替代方案

如果你的生产环境正在用 pgBackRest,现在需要做两件事:评估短期风险,准备中长期替代。

第一步:盘点现有依赖

# 检查当前 pgBackRest 版本
pgbackrest --version

# 查看所有配置的备份仓库
pgbackrest info

# 检查最近一次备份是否成功完成
pgbackrest info --output=json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for repo in data:
    for backup in repo.get('backup', []):
        print(f\"备份 {backup['label']}  状态: {backup['status']['code']}  "
              f\"时间: {backup['timestamp']['start']}  "
              f\"类型: {backup['type']}\")
"

# 确认 WAL 归档是否正常推送
pgbackrest stanza-list

把以上输出记录下来。如果最近备份状态码不是 0(完成),立刻修复——停维之后不会再有 bugfix,现有功能必须确保稳定运行。

第二步:锁定版本,冻结配置

# 在部署流水线中锁定 pgBackRest 版本号,避免意外升级
# 例如在 Ansible playbook 中:
# - name: Install pgbackrest
#   package:
#     name: pgbackrest-2.54  # 锁定具体版本
#     state: present

# 如果用 pip 或源码编译,记录当前 commit hash
cd /path/to/pgbackrest-source
git log -1 --format="%H"
# 输出类似: a1b2c3d4e5f6...  将此 hash 写入部署文档

第三步:评估替代方案

目前 PostgreSQL 生态中可考虑的备份工具:

工具 特点 适合场景
Barman 企业级备份,支持 PITR、并行、SSH/Rsync 传输 已有 Barman 经验的团队
pg_basebackup PostgreSQL 自带,简单可靠 小规模、不需要增量备份
WAL-G 云原生风格,支持 S3/GCS/Azure,增量备份 Kubernetes / 云环境
自定义脚本 + pg_basebackup + WAL 归档 最灵活,维护成本最高 有专职 DBA 团队

以 WAL-G 为例,一个最小化切换配置:

# 安装 WAL-G(Go 实现,单二进制文件)
curl -L https://github.com/wal-g/wal-g/releases/download/v1.1.0/wal-g-linux-amd64 \
  -o /usr/local/bin/wal-g
chmod +x /usr/local/bin/wal-g

# 配置 S3 存储
export WALG_S3_PREFIX="s3://my-pg-backup-bucket/cluster-x"
export AWS_ACCESS_KEY_ID="AKIA..."
export AWS_SECRET_ACCESS_KEY="..."
export AWS_REGION="us-east-1"

# 配置 PostgreSQL WAL 归档到 WAL-G
# 在 postgresql.conf 中设置:
# wal_level = replica
# archive_mode = on
# archive_command = 'wal-g wal-push %p'

# 执行一次全量备份
wal-g backup-push /var/lib/postgresql/17/main

# 验证备份列表
wal-g backup-list

注意:WAL-G 的增量备份需要先启用 wal-g backup-push 的 delta 模式,具体参数见其文档。切换期间建议 pgBackRest 和 WAL-G 并行运行一段时间,确认新工具备份可恢复后再退役旧方案。

第四步:验证恢复能力

无论用什么工具,没有验证过的备份等于没有备份。定期做恢复演练:

# 用 pgBackRest 做一次时间点恢复验证(停维前仍可用)
# 1. 停止目标恢复实例
pg_ctlcluster 17 main stop

# 2. 清空数据目录
rm -rf /var/lib/postgresql/17/main/*

# 3. 恢复到指定时间点
pgbackrest restore --stanza=main \
  --type=time "--target=2026-05-01 14:30:00" \
  --target-action=promote

# 4. 启动并验证数据完整性
pg_ctlcluster 17 main start
psql -c "SELECT count(*) FROM critical_table;"

# 切换到 WAL-G 后的恢复验证:
# wal-g backup-fetch /var/lib/postgresql/17/main LATEST
# 然后配置 recovery.conf / restore_command 指向 wal-g wal-fetch

短期行动清单

优先级 动作 时间窗口
P0 确认最近 pgBackRest 备份全部成功 本周
P0 锁定 pgBackRest 版本,冻结部署 本周
P1 评估替代工具,选定方向 2-4 周
P1 建立并行备份(新旧工具同时运行) 1 个月内
P2 完成恢复演练,确认新工具可用 2 个月内
P2 退役 pgBackRest,切换到新方案 3-6 个月内
P3 关注社区是否有人 fork 或接手 pgBackRest 持续

pgBackRest 的停维不是终点——代码还在,社区还在。如果后续有组织或基金会提供资金让维护者回归,或有人 fork 出新项目,情况可能逆转。但作为生产环境负责人,不能把希望押在"也许有人会接手"上。现在盘点、锁定、准备替代,才是对业务负责的做法。


相关推荐