在维护 Harbor 镜像仓库时,我们可能会遇到 Harbor 核心服务无法连接数据库的情况,导致无法推送镜像或查看项目。本文将针对一个特定的 PostgreSQL 连接错误进行排查分析。
Harbor 连接 PostgreSQL 报错 SQLSTATE XX000 排查指南
解决 Harbor 推送 S3 报错 412 Precondition Failed
在云原生环境中,使用 Harbor 对接对象存储(如 AWS S3、MinIO、Ceph RGW、Aliyun OSS 等)是常见的做法。然而,在推送大镜像时,有时会遇到 412 Precondition Failed 错误,导致推送失败。本文将详细分析该问题的原因并提供解决方案。
Prometheus PromQL 查询最佳实践与性能优化
Kubernetes 生产环境 Cri-Dockerd 二进制部署指南
Linux 性能分析:60,000 毫秒速查
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 端口可达(用于“感知”主从,不用于复制)。
- 账号:
复制用户(主库执行):
