PostgreSQL + Pgpool + Barman WAL Streaming 到 S3 SOP
1. 背景与目标
- 现状:生产环境使用 pgpool 管理 PostgreSQL 高可用(主从切换由 pgpool 决策)。
- 目标:在不调整任何 PostgreSQL 或 pgpool 配置的前提下,新增 Barman,使用 WAL Streaming 持续备份到本地,并将备份仓库近实时同步到 S3;提供可操作的 SOP,支持点时间恢复(PITR)。
- 原理要点:
- WAL Streaming 提供低延迟、持续复制能力,适合高可用场景。
- 将 Barman 仓库同步到 S3 提供异地冗余与时间点恢复能力。
- 不启用 archive_command;通过流式拉取实现冗余与补齐。
2. 架构概览
- 组件:
- barman:拉取 WAL、管理备份与保留策略、执行 cron。
- s3sync:周期性使用 awscli 将 Barman 仓库同步到 S3。
- primary-watcher:连接 pgpool,查询当前 primary 节点,动态更新 barman 的连接目标,自动感知主从切换。
- scheduler(可选):每日触发一次基线备份(base backup)。
- 数据流:PostgreSQL 主库 → Barman(pg_receivewal 流式)→ 本地仓库 → S3 同步。
- 约束:不修改 postgresql.conf、pgpool 配置或启用 archive_command。
架构图(Mermaid)
flowchart LR
%% 对外应用经由 pgpool 访问数据库;Barman 直连主库做 WAL 拉取与备份,并将仓库同步到 S3;primary-watcher 通过 pgpool 感知主从切换
subgraph Clients[业务访问层]
APP[应用/服务]
end
APP -->|读写路由| PGPOOL[(pgpool)]
subgraph DB[数据库高可用集群]
PG_PRIMARY[(PostgreSQL 主库)] --- PG_STANDBY[(PostgreSQL 备库)]
end
PGPOOL -->|主库连接| PG_PRIMARY
PGPOOL -->|只读连接| PG_STANDBY
subgraph BackupPlane[备份平面]
PRIMARY_WATCHER[primary-watcher\n通过 pgpool 感知主库]
BARMAN[Barman\nWAL Streaming + Base Backup]
LOCAL[(本地Barman仓库)]
S3SYNC[s3sync\naws s3 sync]
S3[(S3 Bucket/prefix)]
SCHEDULER[scheduler\n每日基线备份]
end
%% 感知与更新
PRIMARY_WATCHER -->|show pool_nodes| PGPOOL
PRIMARY_WATCHER -->|更新 conninfo.host| BARMAN
%% 备份与同步
BARMAN -->|直连| PG_PRIMARY
BARMAN --> LOCAL
SCHEDULER -->|触发 base backup| BARMAN
S3SYNC --> LOCAL
S3SYNC -->|同步到云端| S3
%% 只用于感知,不经 pgpool 进行物理复制
classDef note fill:#fff9c4,stroke:#fbc02d,color:#8a6d3bflowchart LR
%% 对外应用经由 pgpool 访问数据库;Barman 直连主库做 WAL 拉取与备份,并将仓库同步到 S3;primary-watcher 通过 pgpool 感知主从切换
subgraph Clients[业务访问层]
APP[应用/服务]
end
APP -->|读写路由| PGPOOL[(pgpool)]
subgraph DB[数据库高可用集群]
PG_PRIMARY[(PostgreSQL 主库)] --- PG_STANDBY[(PostgreSQL 备库)]
end
PGPOOL -->|主库连接| PG_PRIMARY
PGPOOL -->|只读连接| PG_STANDBY
subgraph BackupPlane[备份平面]
PRIMARY_WATCHER[primary-watcher\n通过 pgpool 感知主库]
BARMAN[Barman\nWAL Streaming + Base Backup]
LOCAL[(本地Barman仓库)]
S3SYNC[s3sync\naws s3 sync]
S3[(S3 Bucket/prefix)]
SCHEDULER[scheduler\n每日基线备份]
end
%% 感知与更新
PRIMARY_WATCHER -->|show pool_nodes| PGPOOL
PRIMARY_WATCHER -->|更新 conninfo.host| BARMAN
%% 备份与同步
BARMAN -->|直连| PG_PRIMARY
BARMAN --> LOCAL
SCHEDULER -->|触发 base backup| BARMAN
S3SYNC --> LOCAL
S3SYNC -->|同步到云端| S3
%% 只用于感知,不经 pgpool 进行物理复制
classDef note fill:#fff9c4,stroke:#fbc02d,color:#8a6d3bflowchart LR
%% 对外应用经由 pgpool 访问数据库;Barman 直连主库做 WAL 拉取与备份,并将仓库同步到 S3;primary-watcher 通过 pgpool 感知主从切换
subgraph Clients[业务访问层]
APP[应用/服务]
end
APP -->|读写路由| PGPOOL[(pgpool)]
subgraph DB[数据库高可用集群]
PG_PRIMARY[(PostgreSQL 主库)] --- PG_STANDBY[(PostgreSQL 备库)]
end
PGPOOL -->|主库连接| PG_PRIMARY
PGPOOL -->|只读连接| PG_STANDBY
subgraph BackupPlane[备份平面]
PRIMARY_WATCHER[primary-watcher\n通过 pgpool 感知主库]
BARMAN[Barman\nWAL Streaming + Base Backup]
LOCAL[(本地Barman仓库)]
S3SYNC[s3sync\naws s3 sync]
S3[(S3 Bucket/prefix)]
SCHEDULER[scheduler\n每日基线备份]
end
%% 感知与更新
PRIMARY_WATCHER -->|show pool_nodes| PGPOOL
PRIMARY_WATCHER -->|更新 conninfo.host| BARMAN
%% 备份与同步
BARMAN -->|直连| PG_PRIMARY
BARMAN --> LOCAL
SCHEDULER -->|触发 base backup| BARMAN
S3SYNC --> LOCAL
S3SYNC -->|同步到云端| S3
%% 只用于感知,不经 pgpool 进行物理复制
classDef note fill:#fff9c4,stroke:#fbc02d,color:#8a6d3bflowchart LR
%% 对外应用经由 pgpool 访问数据库;Barman 直连主库做 WAL 拉取与备份,并将仓库同步到 S3;primary-watcher 通过 pgpool 感知主从切换
subgraph Clients[业务访问层]
APP[应用/服务]
end
APP -->|读写路由| PGPOOL[(pgpool)]
subgraph DB[数据库高可用集群]
PG_PRIMARY[(PostgreSQL 主库)] --- PG_STANDBY[(PostgreSQL 备库)]
end
PGPOOL -->|主库连接| PG_PRIMARY
PGPOOL -->|只读连接| PG_STANDBY
subgraph BackupPlane[备份平面]
PRIMARY_WATCHER[primary-watcher\n通过 pgpool 感知主库]
BARMAN[Barman\nWAL Streaming + Base Backup]
LOCAL[(本地Barman仓库)]
S3SYNC[s3sync\naws s3 sync]
S3[(S3 Bucket/prefix)]
SCHEDULER[scheduler\n每日基线备份]
end
%% 感知与更新
PRIMARY_WATCHER -->|show pool_nodes| PGPOOL
PRIMARY_WATCHER -->|更新 conninfo.host| BARMAN
%% 备份与同步
BARMAN -->|直连| PG_PRIMARY
BARMAN --> LOCAL
SCHEDULER -->|触发 base backup| BARMAN
S3SYNC --> LOCAL
S3SYNC -->|同步到云端| S3
%% 只用于感知,不经 pgpool 进行物理复制
classDef note fill:#fff9c4,stroke:#fbc02d,color:#8a6d3b3. 前提条件
- 网络:barman 容器到各 PostgreSQL 节点 5432 可达;pgpool 5432/PCP 端口可达(用于“感知”主从,不用于复制)。
- 账号:
复制用户(主库执行):
