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/