这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

系统架构

Pigsty 的模块化架构:声明式组合,自由部署。

如果您只有一分钟,请记住这张图:

flowchart TB
    subgraph AppLayer["应用层模块"]
        direction LR
        PGSQL["🐘 PGSQL<br/>PostgreSQL"]
        REDIS["📮 REDIS<br/>缓存"]
        MINIO["📦 MINIO<br/>对象存储"]
        FERRET["🍃 FERRET<br/>MongoDB"]
        DOCKER["🐳 DOCKER<br/>容器"]
    end

    subgraph BaseLayer["基础层模块"]
        direction LR
        NODE["🖥️ NODE<br/>节点管理/纳管"]
        ETCD["🔐 ETCD<br/>DCS 共识"]
        INFRA["📊 INFRA<br/>监控/仓库/DNS/告警"]
    end

    PGSQL & REDIS & MINIO & FERRET & DOCKER --> NODE
    PGSQL --> ETCD
    NODE --> INFRA

    subgraph Examples["部署示例"]
        E1["纯监控:INFRA + NODE"]
        E2["单机数据库:INFRA + NODE + ETCD + PGSQL"]
        E3["高可用集群:INFRA + NODE + ETCD + PGSQL×3"]
        E4["完整套件:全部模块"]
    end

核心价值:像搭积木一样组合模块。需要什么就装什么,单机到集群一套配置,声明式描述自动部署。


本章内容

章节 说明 核心问题
模块总览 六大核心模块的功能定位与依赖关系 各模块是做什么的?
INFRA 架构 基础设施模块:监控、仓库、DNS 监控系统怎么工作?
PGSQL 架构 PostgreSQL 模块:组件交互与数据流 数据库集群内部结构?

为什么需要模块化?

flowchart LR
    subgraph Problems["❌ 传统一体化部署的困境"]
        direction TB
        P1["全有或全无<br/>安装必须完整,无法按需裁剪"]
        P2["升级困难<br/>牵一发动全身,风险高"]
        P3["灵活性差<br/>无法适应不同场景"]
    end

    subgraph Solutions["✅ 模块化架构的优势"]
        direction TB
        S1["按需组合<br/>只需监控?INFRA + NODE<br/>需要数据库?再加 PGSQL"]
        S2["独立升级<br/>各模块独立演进<br/>风险可控,逐步推进"]
        S3["场景适配<br/>开发:单节点<br/>生产:多节点高可用"]
    end

    Problems --> |模块化改造| Solutions

六大核心模块

模块概览

模块 功能 核心组件 典型场景
PGSQL 高可用 PostgreSQL PostgreSQL、Patroni、Pgbouncer、HAProxy 业务数据库
INFRA 基础设施服务 Prometheus、Grafana、Nginx、AlertManager 监控中心
NODE 节点管理 node_exporter、Vector、Docker 所有服务器
ETCD 分布式共识 Etcd 集群 HA 必需
REDIS 缓存服务 Redis 主从/哨兵/集群 应用缓存
MINIO 对象存储 MinIO 分布式存储 远程备份

模块依赖图

flowchart TB
    PGSQL["🐘 PGSQL<br/>核心数据库模块"]

    PGSQL --> NODE["🖥️ NODE<br/>(必需)"]
    PGSQL --> ETCD["🔐 ETCD<br/>(HA 必需)"]
    PGSQL -.-> MINIO["📦 MINIO<br/>(可选备份)"]

    NODE --> INFRA["📊 INFRA<br/>软件源和监控"]
    ETCD --> INFRA
    MINIO --> INFRA

    INFRA --> OS["🖥️ OS<br/>操作系统基础"]

    subgraph Notes["📋 依赖说明"]
        N1["所有模块都依赖 NODE(节点必须先被纳管)"]
        N2["NODE 弱依赖 INFRA(使用本地软件源时)"]
        N3["PGSQL 需要 ETCD 实现高可用"]
        N4["PGSQL 可选使用 MINIO 进行远程备份"]
    end

部署模式

单机部署

开发测试环境,一台机器搞定所有:

flowchart TB
    subgraph SingleNode["🖥️ 单节点全能部署 (10.10.10.10)"]
        direction TB
        subgraph INFRA["📊 INFRA:监控中心"]
            I1["Prometheus、Grafana、Nginx<br/>AlertManager、VictoriaLogs"]
        end

        subgraph ETCD["🔐 ETCD:分布式共识"]
            E1["单节点 Etcd(开发模式)"]
        end

        subgraph PGSQL["🐘 PGSQL:pg-meta 数据库"]
            P1["PostgreSQL + Pgbouncer + 完整监控"]
        end

        subgraph NODE["🖥️ NODE:节点管理"]
            N1["node_exporter、Vector、时区、NTP"]
        end

        INFRA --> ETCD --> PGSQL --> NODE
    end

    Usage["📋 适用场景:开发环境、测试环境、个人学习、演示Demo"]

生产集群部署

分布式高可用架构:

flowchart TB
    subgraph Production["🏢 生产环境分布式部署"]
        subgraph InfraLayer["📊 INFRA 节点 (1-2台)"]
            INFRA1["10.10.10.10<br/>Prometheus, Grafana, Nginx<br/>AlertManager, VictoriaLogs"]
            INFRA2["10.10.10.11<br/>备份监控节点(可选)"]
        end

        subgraph EtcdLayer["🔐 ETCD 集群 (3台)"]
            E1["10.10.10.21"] <--> E2["10.10.10.22"] <--> E3["10.10.10.23"]
            EtcdNote["Raft 共识协议"]
        end

        subgraph PgsqlLayer["🐘 PGSQL 集群 pg-test (3台)"]
            direction LR
            subgraph Primary["Primary<br/>10.10.10.31"]
                P1["PostgreSQL<br/>Patroni<br/>HAProxy<br/>Pgbouncer"]
            end
            subgraph Replica1["Replica<br/>10.10.10.32"]
                R1["PostgreSQL<br/>Patroni<br/>HAProxy<br/>Pgbouncer"]
            end
            subgraph Replica2["Replica<br/>10.10.10.33"]
                R2["PostgreSQL<br/>Patroni<br/>HAProxy<br/>Pgbouncer"]
            end
            Primary --> Replica1 --> Replica2
        end

        subgraph MinioLayer["📦 MINIO 集群 (可选,4台)"]
            MinioNote["用于 PostgreSQL 远程备份,跨地域灾备"]
        end

        InfraLayer --> |监控/日志| EtcdLayer
        EtcdLayer --> |DCS| PgsqlLayer
        PgsqlLayer -.-> |备份| MinioLayer
    end

    HANote["⚡ 自动故障转移,RTO < 30s"]
    Usage2["📋 适用场景:生产环境、金融业务、关键系统"]

部署顺序

标准部署流程

flowchart TB
    subgraph DeployOrder["📋 部署顺序"]
        Step1["1️⃣ 步骤 1:基础设施<br/><code>./infra.yml</code><br/>安装 INFRA 模块:软件仓库、监控系统、DNS"]

        Step2["2️⃣ 步骤 2:ETCD 集群<br/><code>./etcd.yml</code><br/>安装 ETCD 模块:为 PostgreSQL 高可用提供 DCS"]

        Step3["3️⃣ 步骤 3:MinIO 集群(可选)<br/><code>./minio.yml</code><br/>安装 MINIO 模块:远程备份存储"]

        Step4["4️⃣ 步骤 4:PostgreSQL 集群<br/><code>./pgsql.yml</code><br/>安装 PGSQL 模块:高可用数据库集群"]

        Step5["5️⃣ 步骤 5:其他模块(可选)<br/><code>./redis.yml</code> Redis 缓存<br/><code>./docker.yml</code> Docker 容器"]

        Step1 --> Step2 --> Step3 --> Step4 --> Step5
    end

    OneKey["🚀 或者一键部署所有模块:<br/><code>./deploy.yml</code> 自动按正确顺序部署"]

场景组合

典型部署场景

场景 模块组合 节点数 说明
纯监控 INFRA + NODE 1+ 只监控现有主机,不部署数据库
开发环境 INFRA + NODE + ETCD + PGSQL 1 单机全能,适合开发测试
标准HA INFRA + NODE + ETCD + PGSQL×3 5+ 三节点高可用 PostgreSQL
多集群 INFRA + NODE + ETCD + PGSQL×N 10+ 多套数据库集群共享基础设施
完整套件 INFRA + NODE + ETCD + PGSQL + REDIS + MINIO 10+ 数据库 + 缓存 + 对象存储

配置示例

纯监控模式

# 只需要监控系统,不部署数据库
all:
  children:
    infra:
      hosts:
        10.10.10.10: { infra_seq: 1 }
      vars:
        node_cluster: infra

高可用数据库

# 标准三节点高可用 PostgreSQL
all:
  children:
    infra:
      hosts: { 10.10.10.10: { infra_seq: 1 } }
    etcd:
      hosts:
        10.10.10.10: { etcd_seq: 1 }
        10.10.10.11: { etcd_seq: 2 }
        10.10.10.12: { etcd_seq: 3 }
    pg-test:
      hosts:
        10.10.10.11: { pg_seq: 1, pg_role: primary }
        10.10.10.12: { pg_seq: 2, pg_role: replica }
        10.10.10.13: { pg_seq: 3, pg_role: replica }
      vars:
        pg_cluster: pg-test

数据库 + 缓存 + 备份

# 完整企业级配置
all:
  children:
    infra: { hosts: { 10.10.10.10: { infra_seq: 1 } } }
    etcd: { hosts: { ... } }
    minio: { hosts: { ... } }
    pg-main:
      hosts:
        10.10.10.21: { pg_seq: 1, pg_role: primary }
        10.10.10.22: { pg_seq: 2, pg_role: replica }
      vars:
        pg_cluster: pg-main
        pgbackrest_method: minio  # 使用 MinIO 远程备份
    redis-cache:
      hosts:
        10.10.10.31: { redis_node: 1, redis_instances: { 6379: {} } }
        10.10.10.32: { redis_node: 2, redis_instances: { 6379: {} } }

扩展能力

自定义模块

Pigsty 的模块化设计允许您开发自己的模块:

flowchart TB
    subgraph Templates["📚 现有模块可作为模板"]
        T1["📮 REDIS 模块<br/>多模式部署示例"]
        T2["📦 MINIO 模块<br/>分布式存储示例"]
        T3["🍃 FERRET 模块<br/>MongoDB 兼容示例"]
    end

    subgraph DevSteps["🔧 模块开发规范"]
        D1["1️⃣ 定义模块参数(vars)"]
        D2["2️⃣ 编写 Ansible 剧本(playbook)"]
        D3["3️⃣ 创建 Grafana 仪表盘(可选)"]
        D4["4️⃣ 配置 Prometheus 规则(可选)"]
        D1 --> D2 --> D3 --> D4
    end

    Templates --> DevSteps

路线图

模块 状态 说明
PGSQL ✅ 稳定 核心模块,生产就绪
INFRA ✅ 稳定 基础设施,生产就绪
NODE ✅ 稳定 节点管理,生产就绪
ETCD ✅ 稳定 DCS 服务,生产就绪
REDIS ✅ 稳定 缓存服务,生产就绪
MINIO ✅ 稳定 对象存储,生产就绪
FERRET 🔄 Beta MongoDB 兼容层
DOCKER 🔄 Beta 容器支持

接下来

深入了解各模块的架构细节:

相关话题:

1 - 模块总览

Pigsty 的六大核心模块及其功能定位。

Pigsty 采用模块化设计,将功能分解为可独立部署、自由组合的模块。


核心模块

PGSQL 模块

PostgreSQL 高可用集群,Pigsty 的核心模块。

┌─────────────────────────────────────────────────────────────┐
│                      PGSQL 模块                             │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────────┐    │
│  │PostgreSQL│ │Pgbouncer│  │ HAProxy │  │  Patroni    │    │
│  └─────────┘  └─────────┘  └─────────┘  └─────────────┘    │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────────┐    │
│  │pgBackRest│ │pg_exporter││vip-manager│ │  各类扩展   │    │
│  └─────────┘  └─────────┘  └─────────┘  └─────────────┘    │
└─────────────────────────────────────────────────────────────┘

主要功能

  • 自治高可用 PostgreSQL 集群
  • Patroni + ETCD 实现自动故障转移
  • HAProxy 负载均衡与服务发现
  • Pgbouncer 连接池
  • pgBackRest 备份与 PITR
  • 完整的监控与告警

INFRA 模块

基础设施服务,提供软件仓库、监控、DNS 等核心服务。

┌─────────────────────────────────────────────────────────────┐
│                      INFRA 模块                             │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────────┐    │
│  │  Nginx  │  │ Grafana │  │Prometheus│  │AlertManager │    │
│  └─────────┘  └─────────┘  └─────────┘  └─────────────┘    │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────────┐    │
│  │ DNSMASQ │  │  Loki   │  │ Chronyd │  │  Ansible    │    │
│  └─────────┘  └─────────┘  └─────────┘  └─────────────┘    │
└─────────────────────────────────────────────────────────────┘

主要功能

  • Nginx:Web 服务、软件仓库
  • Prometheus/VictoriaMetrics:指标采集与存储
  • Grafana:可视化仪表盘
  • AlertManager:告警管理
  • DNSMASQ:DNS 服务
  • Loki/VictoriaLogs:日志收集

NODE 模块

节点管理,将裸机/虚拟机调整到期望状态。

┌─────────────────────────────────────────────────────────────┐
│                      NODE 模块                              │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  主机名、时区、NTP、内核参数、用户、权限、防火墙...     │   │
│  └─────────────────────────────────────────────────────┘   │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────────┐    │
│  │node_exp │  │  Vector │  │ HAProxy │  │  Docker     │    │
│  └─────────┘  └─────────┘  └─────────┘  └─────────────┘    │
└─────────────────────────────────────────────────────────────┘

主要功能

  • 系统配置:主机名、时区、NTP
  • 用户与权限:SSH、Sudo
  • node_exporter:主机监控
  • Vector:日志收集
  • Docker:容器支持(可选)

ETCD 模块

分布式键值存储,为 PostgreSQL 高可用提供 DCS。

┌─────────────────────────────────────────────────────────────┐
│                      ETCD 模块                              │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐                     │
│  │ ETCD-1  │◄─┼─► ETCD-2 │◄─┼─► ETCD-3 │   Raft 共识        │
│  └─────────┘  └─────────┘  └─────────┘                     │
└─────────────────────────────────────────────────────────────┘

主要功能

  • Patroni 的 DCS 后端
  • 集群领导者选举
  • 配置管理与服务发现
  • 分布式锁

REDIS 模块

Redis 缓存服务,支持多种部署模式。

┌─────────────────────────────────────────────────────────────┐
│                      REDIS 模块                             │
│  ┌─────────────────┐  ┌─────────────────┐                  │
│  │ 主从模式        │  │ 哨兵模式         │                  │
│  │ Master ──► Slave │  │ Master + Sentinel│                  │
│  └─────────────────┘  └─────────────────┘                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              集群模式(Redis Cluster)               │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

主要功能

  • 独立主从模式
  • 哨兵高可用模式
  • Redis Cluster 分片集群
  • 完整监控支持

MINIO 模块

S3 兼容对象存储,用于数据库备份。

┌─────────────────────────────────────────────────────────────┐
│                      MINIO 模块                             │
│  ┌───────┐  ┌───────┐  ┌───────┐  ┌───────┐               │
│  │Node 1 │  │Node 2 │  │Node 3 │  │Node 4 │  分布式存储    │
│  └───────┘  └───────┘  └───────┘  └───────┘               │
└─────────────────────────────────────────────────────────────┘

主要功能

  • S3 兼容 API
  • pgBackRest 备份目标
  • 分布式冗余存储
  • 跨区域复制

模块依赖

                    ┌─────────┐
                    │  PGSQL  │
                    └────┬────┘
                         │
           ┌─────────────┼─────────────┐
           │             │             │
      ┌────▼────┐   ┌────▼────┐   ┌────▼────┐
      │  NODE   │   │  ETCD   │   │  MINIO  │
      └────┬────┘   └────┬────┘   └────┬────┘
           │             │             │
           └─────────────┼─────────────┘
                         │
                    ┌────▼────┐
                    │  INFRA  │
                    └────┬────┘
                         │
                    ┌────▼────┐
                    │   OS    │
                    └─────────┘
依赖关系 说明
PGSQL → NODE 节点必须先被纳管
PGSQL → ETCD Patroni 需要 DCS
PGSQL → MINIO 可选,远程备份
NODE → INFRA 软件仓库(弱依赖)
ETCD → NODE 节点必须先被纳管

部署顺序

推荐的模块部署顺序:

# 1. 基础设施(包含软件仓库)
./infra.yml

# 2. ETCD 集群(高可用必需)
./etcd.yml

# 3. MinIO 集群(可选,远程备份)
./minio.yml

# 4. PostgreSQL 集群
./pgsql.yml

# 5. Redis 集群(可选)
./redis.yml

或使用一键部署:

./deploy.yml    # 自动按正确顺序部署所有模块

2 - INFRA 架构

基础设施模块的组件与功能详解。

INFRA 模块提供核心基础设施服务,包括软件仓库、监控系统、DNS 服务等。


架构总览

┌─────────────────────────────────────────────────────────────────┐
│                         INFRA 节点                               │
│                                                                  │
│  ┌─────────────────────────────────────────────────────────┐    │
│  │                     Nginx (:80)                          │    │
│  │              Web 服务 / 软件仓库 / 反向代理                │    │
│  └─────────────────────────────────────────────────────────┘    │
│                                                                  │
│  ┌──────────────────────┐  ┌──────────────────────┐            │
│  │   Grafana (:3000)    │  │  Prometheus (:9090)  │            │
│  │     可视化平台        │  │     指标存储          │            │
│  └──────────────────────┘  └──────────────────────┘            │
│                                                                  │
│  ┌──────────────────────┐  ┌──────────────────────┐            │
│  │ AlertManager (:9093) │  │    Loki (:3100)      │            │
│  │     告警管理          │  │     日志存储          │            │
│  └──────────────────────┘  └──────────────────────┘            │
│                                                                  │
│  ┌──────────────────────┐  ┌──────────────────────┐            │
│  │   DNSMASQ (:53)      │  │   Chronyd (:123)     │            │
│  │     DNS 服务          │  │     NTP 服务         │            │
│  └──────────────────────┘  └──────────────────────┘            │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

核心组件

Nginx

Web 服务器,提供多种功能:

功能 端口 说明
软件仓库 80 YUM/APT 本地仓库
Web 门户 80 Pigsty 首页
反向代理 80 代理 Grafana、Prometheus 等
http://10.10.10.10/          # Web 门户
http://10.10.10.10/pigsty/   # 软件仓库
http://10.10.10.10/grafana/  # Grafana 代理

VictoriaMetrics / Prometheus

时序数据库,用于指标存储与查询:

┌─────────────────────────────────────────────────────────────┐
│                   VictoriaMetrics                            │
│  ┌─────────────────────────────────────────────────────┐    │
│  │                 指标存储 (:9090)                      │    │
│  └───────────────────────────┬─────────────────────────┘    │
│                              │ Pull                          │
│    ┌─────────┬───────────────┼───────────────┬─────────┐    │
│    ▼         ▼               ▼               ▼         ▼    │
│  pg_exp   node_exp      pgb_exp        patroni     ...      │
│  :9630    :9100         :9631          :8008                │
└─────────────────────────────────────────────────────────────┘

采集目标

  • node_exporter (9100):主机指标
  • pg_exporter (9630):PostgreSQL 指标
  • pgbouncer_exporter (9631):连接池指标
  • patroni (8008):高可用指标

Grafana

可视化平台,提供丰富的仪表盘:

类别 仪表盘
概览 Pigsty Overview, Cluster Overview
主机 Node Overview, Node Instance
PostgreSQL PG Cluster, PG Instance, PG Database
连接池 PGBouncer Overview
高可用 Patroni Overview

AlertManager

告警管理,负责告警的分组、去重和通知:

┌─────────────────────────────────────────────────────────────┐
│                     AlertManager                             │
│  ┌─────────────────────────────────────────────────────┐    │
│  │                告警接收 (:9093)                       │    │
│  └───────────────────────────┬─────────────────────────┘    │
│                              │                               │
│    ┌─────────────────────────┼─────────────────────────┐    │
│    ▼                         ▼                         ▼    │
│  分组                       去重                      路由   │
│    │                         │                         │    │
│    └─────────────────────────┼─────────────────────────┘    │
│                              ▼                               │
│  ┌───────┐  ┌───────┐  ┌───────┐  ┌───────┐               │
│  │ Email │  │ Slack │  │ 钉钉  │  │Webhook│               │
│  └───────┘  └───────┘  └───────┘  └───────┘               │
└─────────────────────────────────────────────────────────────┘

VictoriaLogs / Loki

日志存储系统,集中收集各组件日志:

日志来源 说明
PostgreSQL 数据库日志
Patroni 高可用组件日志
Pgbouncer 连接池日志
pgBackRest 备份日志
系统日志 /var/log/messages

DNSMASQ

DNS 服务器,提供内部域名解析:

┌─────────────────────────────────────────────────────────────┐
│                      DNSMASQ                                 │
│  ┌─────────────────────────────────────────────────────┐    │
│  │              DNS 服务 (:53)                          │    │
│  └─────────────────────────────────────────────────────┘    │
│                                                              │
│  解析记录:                                                   │
│  ├── pg-meta     → 10.10.10.10                              │
│  ├── pg-test     → 10.10.10.11 (主库 VIP)                   │
│  ├── pg-test-1   → 10.10.10.11                              │
│  ├── pg-test-2   → 10.10.10.12                              │
│  └── pg-test-3   → 10.10.10.13                              │
└─────────────────────────────────────────────────────────────┘

高可用部署

生产环境建议部署多个 INFRA 节点:

infra:
  hosts:
    10.10.10.10: { infra_seq: 1 }  # 主节点
    10.10.10.11: { infra_seq: 2 }  # 备节点
  vars:
    node_cluster: infra

多节点部署时:

  • Nginx 可通过 Keepalived VIP 实现高可用
  • Prometheus 联邦或远程写入实现指标冗余
  • AlertManager 集群模式自动去重

端口清单

组件 端口 说明
Nginx 80 Web 服务
Grafana 3000 可视化
VictoriaMetrics 9090 指标存储
VictoriaLogs 9428 日志存储
AlertManager 9093 告警管理
DNSMASQ 53 DNS
Chronyd 123 NTP
BlackboxExporter 9115 黑盒探测

3 - 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/