Skip to content

Add backup option: wal-g #7

Description

@mfa777

wal-g 基于 WAL 文件进行归档,增量备份机制在大数据量下可以显著节省每日备份时间。

优点

  • 能增量备份,显著减轻每日全量备份的压力,对大数据量很友好
  • 接近于实时备份,可恢复到任意时间点(能灵活应对脏数据污染的情况,这时候不仅仅是要恢复到停机之前状态,要更久)
  • 比起每日全量备份 SQL 不会丢失日间数据
  • 有命令可以删除老旧的基础备份和 WAL 文件,不会撑破备份空间(但需要配合 cron 执行 script 来实现)

缺点

  • 恢复过程看起来比较复杂,没有 psql backup.sql 那么暴力直接
  • 配置起来也复杂,需要把 wal-g 执行文件嵌入到 PostgreSQL 镜像用于 wal 持续备份,还需要一个用于基础备份的 wal-g。并且这两个角色要共享远程备份仓库配置。
  • 需要执行 cron script 配合

角色

wal-g (以及其他类似工具) 的设计就是为了完美适配 PostgreSQL 的这种 “基础备份 + 连续日志归档” 的内置机制。

  • backup-push 定期执行,是为了创建恢复的基准点。(定期的快照员)
  • wal-push 持续执行,是为了捕获两个基准点之间的所有变化,从而实现精细到秒级的时间点恢复。(持续的归档员)

这两者缺一不可,共同构成了一个健壮、可靠的生产级数据库备份与恢复系统。

wal-g wal-push

专职于持续归档 WAL 文件,它是一个被动、简单、高效的“搬运工”。唯一任务就是把指定的 WAL 文件压缩并上传到远程存储。它不关心基础备份,也不关心删除策略,职责非常单一。

wal-g backup-push

只负责创建基础备份。它的任务是创建数据库数据文件基础备份。无论是全量(Full)还是增量(Delta),它处理的都是 PostgreSQL 数据目录中的核心数据文件。它为 PITR “画下了一条起跑线”,但它本身不直接操作或管理正在持续归档的 WAL 文件流。

wal-g delete

此命令会同时智能地清理不再需要的基础备份和与之相关的 WAL 文件。它在删除旧的基础备份时,会一并清除所有不再被任何“保留的备份”所依赖的、更早的 WAL 文件,从而安全地回收空间,防止备份存储无限增长。

TODO

  • 重新 build 一个 PostgreSQL 镜像,把 wal-g 嵌入并预留外部云备份空间环境变量
  • 新建共享的变量文件,存储外部备份空间相关的变量
  • backup 服务嵌入 wal-g 命令行
  • 增加一个 wal-g-runner.sh,使用 wal-g backup-push 来做每日 Delta 备份。
  • 配置文件增加选项 backup_mode 可以设置 sql 或者 wal。分别代表 sql 导出(当前机制)或 wal 增量备份。

参考资料

https://github.com/wal-g/wal-g/blob/master/docs/PostgreSQL.md
https://github.com/stephane-klein/playground-postgresql-walg/blob/ff6a505fa5a3590e0feeb2792b941ffc6a9ddc65/docker-image/postgres-with-wal-g/Dockerfile

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions