暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

pgBackRest 生产部署

原创 南帝 5天前
100

一、pgBackRest 核心概念

1.1 工具定位

pgBackRest 是 PostgreSQL 生态工业级第三方开源备份工具,非官方内置工具,完美弥补原生 pg_basebackup 仅支持全量备份的短板。支持全量、差异、增量物理备份,内置 WAL 自动归档、PITR 时间点恢复、备份校验、过期清理、从库备份、集群切换自动适配等企业级能力,是生产大集群、TB级数据的标准备份方案。

Repo 是物理存储载体,用于统一存放备份数据、归档 WAL、备份元数据,支持三种存储模式:本地磁盘、远端 SSH 服务器、S3/OSS 对象存储。

仓库核心存储结构:

  • archive 目录:存放所有归档 WAL 日志,是 PITR 时间点恢复的核心依赖

  • backup 目录:存放全量、增量、差异物理备份集

  • 元数据文件:记录备份链、校验和、时间线、节点信息,保障备份完整性

核心特性:单仓库可容纳多套数据库集群备份,通过 Stanza 逻辑隔离,自动清理过期备份、自动校验文件完整性。

1.2.2 Stanza(备份集)

Stanza 是逻辑隔离单元,是 pgBackRest 的核心业务标识。一套 PostgreSQL 主备集群(一主多从)仅对应一个 Stanza,不同业务、不同实例集群需配置独立 Stanza。

核心作用:

  • 隔离多集群备份数据,避免备份、恢复误操作串库

  • 绑定集群所有节点信息,实现主备角色自动识别

  • 独立管理备份生命周期、保留策略、归档链路

1.3 核心优势(对比原生工具)

  • 原生 pg_basebackup 仅支持全量备份,pgBackRest 支持全量/差异/增量三级备份,大幅降低备份 IO 和存储开销

  • 内置 WAL 自动归档、备份校验、过期清理,无需手写复杂 Shell 脚本

  • 支持从备库备份,彻底规避主库备份 IO 压力

  • 主备切换自动适配,无需修改配置文件

  • 支持并行备份恢复、压缩、断点续传、对象存储异地灾备

二、pgBackRest 生产安装与环境初始化

2.1 安装部署

CentOS/RHEL 系统

yum install -y epel-release yum install -y pgbackrest postgresql15-contrib

Ubuntu/Debian 系统

apt update apt install -y pgbackrest postgresql-15-contrib

2.2 目录初始化与权限配置

所有目录必须归属 postgres 用户,权限 700,否则备份、归档报错。

# 创建备份仓库、日志目录 mkdir -p /pg_backup/repo mkdir -p /var/log/pgbackrest # 权限统一配置 chown -R postgres:postgres /pg_backup /var/log/pgbackrest chmod 700 /pg_backup/repo

2.3 集群节点免密互通(必备)

从库备份、跨节点探测角色依赖 SSH 免密互通,所有主备节点需双向免密。

su - postgres # 生成密钥 ssh-keygen -t ed25519 -N "" # 推送公钥至所有集群节点(示例备库IP) ssh-copy-id postgres@192.168.10.11

三、主备集群完整配置(支持从库备份+切换自动适配)

3.1 环境规划

  • 主节点 pg1:192.168.10.10

  • 备节点 pg2:192.168.10.11

  • Stanza 名称:pg_cluster

  • 备份仓库:/pg_backup/repo

3.2 全局+集群配置文件 /etc/pgbackrest/pgbackrest.conf

[global] # 备份仓库路径 repo1-path=/pg_backup/repo # 保留2份全量备份,自动清理过期备份链 repo1-retention-full=2 # 压缩策略 compress-type=zstd compress-level=3 # 开启备库备份(核心参数) backup-standby=y # 并行备份加速 process-max=4 # 日志配置 log-path=/var/log/pgbackrest log-level-file=info # 集群备份集:包含所有主备节点,不固定主备角色 [pg_cluster] # 节点1 pg1-host=192.168.10.10 pg1-host-user=postgres pg1-path=/var/lib/postgresql/15/main pg1-port=5432 pg1-user=postgres # 节点2 pg2-host=192.168.10.11 pg2-host-user=postgres pg2-path=/var/lib/postgresql/15/main pg2-port=5432 pg2-user=postgres

3.3 数据库 WAL 归档配置(仅主库)

备库无需配置归档,仅主库产生 WAL 并推送至备份仓库。编辑 postgresql.conf:

wal_level = replica archive_mode = on archive_command = 'pgbackrest --stanza=pg_cluster archive-push %p' max_wal_senders = 10 wal_log_hints = on

重启数据库生效:

systemctl restart postgresql@15-main

3.4 仓库与备份集初始化

su - postgres # 创建备份集,生成仓库目录结构 pgbackrest --stanza=pg_cluster stanza-create # 全局校验:节点连通性、归档、权限、角色探测 pgbackrest --stanza=pg_cluster check

无报错即为配置正常,支持从库备份与自动角色识别。

四、备份操作(自动优先备库,切换无感知)

4.1 日常自动备份(生产推荐)

自动判断备份类型:距离全量备份过期则执行 full 全量,否则执行 incr 增量,优先备库备份,备库故障自动降级主库。

pgbackrest --stanza=pg_cluster backup

4.2 手动指定备份类型

# 强制全量备份 pgbackrest --stanza=pg_cluster --type=full backup # 强制差异备份 pgbackrest --stanza=pg_cluster --type=diff backup

4.3 备份状态查看与运维命令

# 查看所有备份集信息 pgbackrest --stanza=pg_cluster info # 手动触发过期备份清理 pgbackrest --stanza=pg_cluster expire # 校验备份与 WAL 完整性 pgbackrest --stanza=pg_cluster check # 查看归档 WAL 状态 pgbackrest --stanza=pg_cluster archive-info

五、定时自动备份配置

使用 crontab 定时触发,无需复杂脚本,适配所有主备切换场景。postgres 用户定时任务:

crontab -e # 每日凌晨2点自动备份 0 2 * * * pgbackrest --stanza=pg_cluster backup >> /var/log/pgbackrest/cron_backup.log 2>&1 # 每10分钟校验归档状态 */10 * * * * pgbackrest --stanza=pg_cluster archive-check

六、主备切换自动适配原理(核心重点)

6.1 自动识别机制

pgBackRest 不固化主备角色,每次备份前实时探测集群所有节点角色:

  • 执行 pg_is_in_recovery() 判断节点状态

  • 返回 false = 主库(可读写)

  • 返回 true = 备库(只读)

备份优先级:优先在线备库 > 所有备库离线则降级主库。

6.2 两种切换场景适配

场景1:计划切换(Switchover)

原主停机、备库提升为新主,原主修复后变为新备库。pgBackRest 无需修改任何配置,下次备份自动识别新备库,继续从备库执行备份。

场景2:故障切换(Failover)

原主崩溃,备库强制升主。备份任务自动检测备库全部离线,临时降级新主备份;待旧主修复加入集群变为备库后,自动切回备库备份,全程备份不中断。

6.3 切换后 WAL 归档适配

  • 仅当前主库执行 archive-push 推送 WAL

  • 切换后新主自动接管归档任务

  • 旧主变为备库后自动停止归档,避免重复推送、归档错乱

七、恢复操作完整示例

7.1 恢复前置操作(必做)

停止数据库、迁移旧数据、清空目录,避免数据冲突。

systemctl stop postgresql@15-main mv /var/lib/postgresql/15/main /var/lib/postgresql/15/main.bak mkdir /var/lib/postgresql/15/main chown postgres:postgres /var/lib/postgresql/15/main

7.2 三种恢复场景

场景1:恢复至最新状态

pgbackrest --stanza=pg_cluster restore

场景2:PITR 时间点恢复

pgbackrest --stanza=pg_cluster --type=time --time="2026-06-24 10:30:00" restore

场景3:恢复至指定备份集

pgbackrest --stanza=pg_cluster --set=20260624-020000F restore

恢复完成后启动数据库即可正常对外提供服务。

八、生产核心注意事项

  • 节点配置规范:一个 Stanza 必须录入集群所有主备节点,仅配置单节点会导致切换后无法识别备库。

  • 免密互通必备:所有集群节点 postgres 用户双向 SSH 免密,否则无法远程读取备库数据、探测节点角色。

  • 表空间一致性:主备集群所有节点表空间挂载路径必须完全一致,否则备份、恢复、rewind 操作报错。

  • 归档唯一性:仅主库开启 archive_command,备库禁止配置,防止 WAL 重复推送导致归档异常。

  • 脑裂防护:集群出现双主时,pgBackRest 会检测到多个主库,直接终止备份,保护备份链一致性。

  • 权限严格管控:仓库、日志、数据目录必须归属 postgres:postgres,权限 700,权限过宽会导致备份失败。

  • 备份链完整性:增量、差异备份依赖基础全量备份,禁止手动删除仓库内任意备份文件,否则整条备份链失效。


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论