PGSQL 架构
PostgreSQL 模块的组件交互与数据流。
PGSQL 模块是 Pigsty 的核心,提供自治高可用的 PostgreSQL 集群。
架构总览
┌─────────────────────────────────────────────────────────────────────────┐
│ 集群 DNS / VIP │
│ pg-test → 10.10.10.3 (VIP) │
└────────────────────────────────┬────────────────────────────────────────┘
│
┌────────────────────────────────┼────────────────────────────────────────┐
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ HAProxy │ │
│ │ :5433 primary :5434 replica :5436 default :5438 offline │ │
│ └───────────────────────────────┬──────────────────────────────────┘ │
│ │ │
│ ┌───────────────────────────────┼──────────────────────────────────┐ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ Pgbouncer (:6432) │ │ │
│ │ │ 连接池 │ │ │
│ │ └───────────────────────────┬─────────────────────────────┘ │ │
│ │ │ │ │
│ │ ┌───────────────────────────┼─────────────────────────────┐ │ │
│ │ │ ▼ │ │ │
│ │ │ ┌─────────────────────────────────────────────────┐ │ │ │
│ │ │ │ PostgreSQL (:5432) │ │ │ │
│ │ │ │ 数据库实例 │ │ │ │
│ │ │ └─────────────────────────────────────────────────┘ │ │ │
│ │ │ │ │ │ │
│ │ │ ┌────────────────────────┼────────────────────────┐ │ │ │
│ │ │ │ ▼ │ │ │ │
│ │ │ │ ┌─────────────────────────────────────────┐ │ │ │ │
│ │ │ │ │ Patroni (:8008) │ │ │ │ │
│ │ │ │ │ 高可用控制 │ │ │ │ │
│ │ │ │ └─────────────────────┬───────────────────┘ │ │ │ │
│ │ │ │ │ │ │ │ │
│ │ │ │ ▼ │ │ │ │
│ │ │ │ ETCD 集群 │ │ │ │
│ │ │ └──────────────────────────────────────────────────┘ │ │ │
│ │ │ │ │ │
│ │ │ PGSQL 实例 │ │ │
│ │ └──────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ PGSQL 节点 │ │
│ └────────────────────────────────────────────────────────────────────┘ │
│ │
│ PGSQL 集群 │
└───────────────────────────────────────────────────────────────────────────┘
组件职责
PostgreSQL
核心数据库进程,监听 5432 端口:
- 主库:接受读写请求,产生 WAL 日志
- 从库:通过流复制同步数据,提供只读服务
- 由 Patroni 管理生命周期
Patroni
高可用控制器,监听 8008 端口:
- 管理 PostgreSQL 进程启停
- 通过 ETCD 进行领导者选举
- 自动执行故障转移
- 提供 REST API 供健康检查
Pgbouncer
连接池中间件,监听 6432 端口:
- 缓冲客户端连接,减少后端压力
- 支持事务级/会话级连接复用
- 无状态,通过 Unix Socket 连接 PostgreSQL
HAProxy
负载均衡器,提供多个服务端口:
| 端口 | 服务 | 目标 | 说明 |
|---|---|---|---|
| 5433 | primary | Pgbouncer | 读写服务 |
| 5434 | replica | Pgbouncer | 只读服务 |
| 5436 | default | PostgreSQL | 直连主库 |
| 5438 | offline | PostgreSQL | 离线查询 |
| 9101 | admin | - | 管理页面 |
vip-manager
VIP 管理器(可选):
- 监视 ETCD 中的领导者信息
- 将 VIP 绑定到当前主库节点
- L2 层漂移,故障切换透明
数据流
读写请求
Client → DNS/VIP → HAProxy:5433 → Pgbouncer:6432 → PostgreSQL:5432 (Primary)
只读请求
Client → DNS/VIP → HAProxy:5434 → Pgbouncer:6432 → PostgreSQL:5432 (Replica)
直连管理
Client → HAProxy:5436 → PostgreSQL:5432 (Primary,绕过连接池)
监控组件
每个 PGSQL 节点上运行多个 Exporter:
| 组件 | 端口 | 说明 |
|---|---|---|
| pg_exporter | 9630 | PostgreSQL 指标 |
| pgbouncer_exporter | 9631 | Pgbouncer 指标 |
| pgbackrest_exporter | 9854 | 备份指标 |
| patroni | 8008 | HA 指标与健康检查 |
| haproxy | 9101 | 负载均衡指标 |
| node_exporter | 9100 | 主机指标 |
所有指标由 INFRA 节点的 Prometheus 采集。
备份子系统
pgBackRest 提供备份与 PITR:
┌─────────────────────────────────────────────────────────────┐
│ pgBackRest │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ PostgreSQL (Primary) │ │
│ │ │ │ │
│ │ ┌────────────┴────────────┐ │ │
│ │ ▼ ▼ │ │
│ │ 全量/增量备份 WAL 归档 │ │
│ │ │ │ │ │
│ │ └────────────┬────────────┘ │ │
│ │ ▼ │ │
│ │ ┌────────────────────────────────────────────┐ │ │
│ │ │ 备份仓库 │ │ │
│ │ │ 本地磁盘 / MinIO / S3 │ │ │
│ │ └────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
日志收集
Vector 收集各组件日志发送到 VictoriaLogs:
| 组件 | 日志路径 |
|---|---|
| PostgreSQL | /pg/log/postgres/ |
| Patroni | /pg/log/patroni/ |
| Pgbouncer | /pg/log/pgbouncer/ |
| pgBackRest | /pg/log/pgbackrest/ |