内容提要
作者在PGDay UK 2026演讲中介绍了pgSafe,这是一个用Go重写的Postgres备份工具,旨在替代失去资助的pgBackRest。pgSafe遵循十条不变规则,强调顺序与持久性,支持多存储后端,采用标准库和云SDK,并避免在数据库主机上存储凭证。代码从96,000行C减少到18,000行Go,测试完善,目前为alpha版,欢迎贡献。
延伸解读
重写背后的动机
pgBackRest在2026年4月因失去企业资助而短暂归档,凸显了关键基础设施依赖少数维护者的风险。pgSafe的诞生正是为了提供更易维护的替代方案,通过用Go重写,将代码量从96,000行C减少到18,000行Go,降低了维护门槛。
设计原则的实践
pgSafe遵循十条不变规则,强调顺序与持久性,例如先确保文件持久化再写清单,以及基于校验和而非时间戳恢复。这些规则源自pgBackRest的教训,并通过故障注入测试验证,确保备份的可靠性。
技术选型的优势
Go的标准库和云SDK替代了C中手写的HTTP、TLS、加密等基础设施,减少了约51,000行非备份逻辑代码。同时,利用Postgres原生工具如backup_manifest和pg_combinebackup,简化了备份验证和增量恢复流程。
当前局限与未来方向
pgSafe目前为alpha版,不支持异步WAL归档、增量备份仅限PG17+简单模式,且WAL归档尚未加密压缩。项目欢迎社区贡献,特别是测试云后端和审查代码,以加速功能完善。
Q&A
pgSafe是什么?它为什么被开发?
pgSafe是一个用Go语言从零开始编写的Postgres备份工具,旨在替代失去企业资助的pgBackRest。pgBackRest在2026年4月暂时失去维护,虽然几周后恢复,但事件暴露了其代码复杂、维护者少的问题。pgSafe的目标是提供功能对等,同时让代码更易理解和维护。
pgSafe遵循哪些核心设计原则?
pgSafe遵循三条设计原则:1) Postgres永远不知道pgSafe的存在,不使用扩展或钩子,通过archive_command归档WAL;2) 优先使用标准和库,如Postgres原生的backup_manifest、PG17的WAL summarizer、云厂商SDK和Go标准库;3) 不在数据库主机上存储凭证,而是通过短期、窄权限的凭证进行备份。
pgSafe的十条不变规则是什么?
pgSafe的十条不变规则包括:1) 顺序:先停止备份,等待WAL段归档,再写manifest;2) 基于校验和而非时间戳恢复;3) 保留策略不能删除正在运行的备份所依赖的备份;4) 开始前探测WAL归档;5) POSIX文件系统上的fsync顺序;6) 对象存储上使用条件复制代替原子重命名;7) 重新推送WAL段时,相同字节为无操作,不同字节为错误;8) 仅当备用服务器确实从主服务器重放时才从备用服务器备份;9) 备份中加密接收者一致;10) 多存储时,至少一个后端提交才算完成。
pgSafe支持哪些存储后端和Postgres版本?
pgSafe支持五种存储后端:POSIX、S3、Azure Blob、GCS和SFTP。支持PostgreSQL 13到18版本。
pgSafe的三种操作模式是什么?它们有何区别?
pgSafe有三种操作模式:1) PG-native(无worker):使用pg_basebackup的tar流,通过复制连接;2) remote-parallel:多个连接调用pg_read_binary_file(),在客户端验证页校验和;3) pgSafe模式(有worker):在数据库主机上运行worker进程,直接通过系统调用读取$PGDATA,并行流式传输到存储。区别在于是否有worker在数据库主机上,以及凭证处理方式。
pgSafe相比pgBackRest在代码量上有何优势?
pgBackRest约有96,000行C代码和80,000行测试代码,而pgSafe只有18,000行Go代码和15,000行测试代码。这主要是因为Go标准库和云SDK替代了C中手写的HTTP、TLS、加密等基础设施,以及Postgres原生功能(如WAL summarizer、backup_manifest)替代了自定义实现。
pgSafe目前有哪些功能尚未实现?
pgSafe尚未实现的功能包括:异步和并行WAL归档(目前是同步的)、增量恢复、文件捆绑、PG17+以外的增量备份(仅支持PG17+且仅限简单模式)、WAL归档的加密和压缩(计划中)。完整列表见FUNCTIONALITY_GAPS.md。
pgSafe如何确保备份的可靠性?
pgSafe通过以下方式确保可靠性:遵循十条不变规则,每条规则都有命名测试;采用故障注入测试,在每个步骤注入失败并检查磁盘状态;进行单元、集成和端到端测试(使用真实PG13-18容器);不信任状态标志和退出码;强调恢复测试,因为未恢复的备份不是备份。