跳转到主要内容

这是本节的多页打印视图。 .

返回本页常规视图.

关键特性

关键特性和亮点
条目
      href="/zh/docs/intro/distro">
    将 PostgreSQL 用于一切! \
    用组装的超能力构建数据基础设施!
面向运维的 RDS 解决方案
    像专家一样自托管 PostgreSQL! \
    无需专业知识即可运营生产级服务

Postgres 扩展
    开箱即用地获得 **437** PG 扩展的超能力
高可用性
    自愈架构和无忧服务访问
内核替换
    在 PGSQL 之上模拟 MySQL、Mongo、Oracle、SQL Server
灾难恢复
    自动配置备份和简化的 PITR
基础设施即代码
    用代码 / 数据描述和实现一切
内置监控
    使用 Grafana 和 Prometheus 技术栈的预配置仪表板
自托管 Supabase
    将 Postgres 转变为全功能的后端即服务
应用模板
    使用 HA PG 强化软件:Gitlab、Odoo、Dify 等

1 - PG 扩展

获得 437 个开箱即用的扩展

Pigsty 允许您通过三个组件来利用 PostgreSQL 扩展生态系统的协同超能力:

  • 目录:查找您需要的扩展,包含无与伦比的 437 个扩展
  • 仓库:为 10 个主流 Linux 操作系统获取预制的 RPM/DEB 包
  • 包管理器:使用单个命令安装一切 - pig

另外查看我们的博客文章:PostgreSQL is eating the Database World

ecosystem


扩展

TIME GIS RAG FTS OLAP FEAT LANG TYPE
UTIL FUNC ADMIN STAT SEC FDW SIM ETL

类别 数量 描述
TIME 11 TimescaleDB、版本控制与时态表、Crontab、异步与后台作业调度器
GIS 20 地理空间数据类型、操作符和索引、六边形索引、OGR 数据 FDW、GeoIP 与 MobilityDB
RAG 10 具有 IVFFLAT、HNSW、DiskANN 索引的向量数据库、SQL 接口中的 AI 和 ML、相似性函数
FTS 20 ElasticSearch 替代品,具有 BM25、2-gram/3-gram 模糊搜索、Zhparser 与 Hunspell 分词词典
OLAP 13 DuckDB 与 FDW 和 PG Lakehouse 集成、从文件/S3 访问 Parquet、使用 Citus/Partman/PlProxy 分片
FEAT 56 AGE 的 OpenCypher、GraphQL、JsonSchema、Hints 与 Hypo Index、HLL、Rum、IVM、ChemRDKit 和消息队列
LANG 31 开发、测试、打包和交付用各种 PL/语言编写的存储过程:Java、Js、Lua、R、Sh、PRQL
TYPE 37 专用新数据类型如:prefix、sember、uint、SIUnit、RoaringBitmap、Rational、Sphere、Hash、RRule
UTIL 31 实用工具如发送 HTTP 请求、执行 gzip/zstd 压缩、发送邮件、正则表达式、ICU、编码、文档、加密
FUNC 43 函数如 ID 生成器、聚合、草图、向量函数、数学函数和摘要函数
ADMIN 36 膨胀控制、脏读、缓冲区检查、DDL 生成、校验和验证、权限、优先级、目录的实用工具
STAT 34 可观测性目录、监控指标和视图、统计、查询计划、等待采样、慢日志
SEC 26 审计日志、强制密码、保持机密、TDE、SM 算法、登录钩子、日志错误、扩展白名单
FDW 22 FDW 开发的包装器和 Multicorn、访问其他 DBMS:MySQL、Mongo、SQLite、MSSQL、Oracle、HDFS、DB2
SIM 16 协议模拟和异构 DBMS 兼容性:Oracle、MSSQL、DB2、MySQL、Memcached 和 Babelfish
ETL 17 逻辑复制、解码、protobuf/JSON/Mongo 格式的 CDC、复制和加载及比较 Postgres 数据库

仓库

Pigsty 有一个仓库,在 10 个主流 Linux 发行版 上提供 200+ 个额外的 PostgreSQL 扩展。 它被设计为与官方 PostgreSQL 全球开发组(PGDG)仓库一起工作。

您可以使用 pig CLI 工具启用 pigsty infra 和 pgsql 仓库,或手动将它们添加到您的系统:

curl https://repo.pigsty.io/pig | bash      # 下载并安装 pig CLI 工具
pig repo add all -u                         # 添加 linux、pgdg、pigsty 仓库并更新缓存
# 将 Pigsty 的 GPG 公钥添加到您的系统密钥链以验证包签名
curl -fsSL https://repo.pigsty.io/key | sudo gpg --dearmor -o /etc/apt/keyrings/pigsty.gpg

# 获取 Debian 发行版代号(distro_codename=jammy、focal、bullseye、bookworm),并将相应的上游仓库地址写入 APT List 文件
distro_codename=$(lsb_release -cs)
sudo tee /etc/apt/sources.list.d/pigsty-io.list > /dev/null <<EOF
deb [signed-by=/etc/apt/keyrings/pigsty.gpg] https://repo.pigsty.io/apt/infra generic main
deb [signed-by=/etc/apt/keyrings/pigsty.gpg] https://repo.pigsty.io/apt/pgsql/${distro_codename} ${distro_codename} main
EOF

# 刷新 APT 仓库缓存
sudo apt update
# 将 Pigsty 的 GPG 公钥添加到您的系统密钥链以验证包签名
curl -fsSL https://repo.pigsty.io/key | sudo tee /etc/pki/rpm-gpg/RPM-GPG-KEY-pigsty >/dev/null

# 将 Pigsty 仓库定义文件添加到 /etc/yum.repos.d/ 目录,包括两个仓库
sudo tee /etc/yum.repos.d/pigsty-io.repo > /dev/null <<-'EOF'
[pigsty-infra]
name=Pigsty Infra for $basearch
baseurl=https://repo.pigsty.io/yum/infra/$basearch
skip_if_unavailable = 1
enabled = 1
priority = 1
gpgcheck = 1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-pigsty
module_hotfixes=1

[pigsty-pgsql]
name=Pigsty PGSQL For el$releasever.$basearch
baseurl=https://repo.pigsty.io/yum/pgsql/el$releasever.$basearch
skip_if_unavailable = 1
enabled = 1
priority = 1
gpgcheck = 1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-pigsty
module_hotfixes=1
EOF

# 刷新 YUM/DNF 仓库缓存
sudo yum makecache;

所有 RPM / DEB 包都使用 Pigsty 仓库中的 GPG 密钥 指纹(B9BD8B20)签名。


包管理器

“Postgres 安装天才,PostgreSQL 生态系统缺失的扩展包管理器”

在几秒钟内 开始使用 PIG:

curl -fsSL https://repo.pigsty.io/pig | bash
curl -fsSL https://repo.pigsty.cc/pig | bash

然后就可以使用了,假设您想安装 pg_duckdb 扩展:

$ pig repo add pigsty pgdg -u  # 添加 pgdg 和 pigsty 仓库,然后更新仓库缓存
$ pig ext install pg18         # 使用原生 PGDG 包安装 PostgreSQL 18 内核
$ pig ext install pg_duckdb    # 安装 pg_duckdb 扩展(用于当前的 pg18)

2 - PG 内核分支

模拟其他数据库管理系统,用特殊分支替换普通 PostgreSQL

Pigsty 支持各种 PostgreSQL 内核和兼容分支, 使您能够模拟不同的数据库系统,同时利用 PostgreSQL 的生态系统。 每个内核提供独特的功能和兼容性层。

数据库内核

PostgreSQL

带有 437 个扩展插件的原生 PostgreSQL 内核

Citus

PG 原生分布式扩展

Babelfish

SQL Server 线缆协议兼容

IvorySQL

Oracle 语法和 PL/SQL 兼容

OpenHalo

MySQL 线缆协议兼容

Percona

透明加密内核

OrioleDB

OLTP 优化的云原生存储引擎

PolarDB PG

类 Aurora RAC 风味的信创内核

Supabase

后端即服务,自托管 Firebase

FerretDB

MongoDB 线缆协议兼容的内核


选择合适的内核

说明

灵活内核:为您的特定用例选择合适的内核 - 无论您需要 MSSQL 兼容性、Oracle 功能还是水平扩展能力。

内核 关键特性 描述
PostgreSQL 原始版本 原版 PostgreSQL 配备 437 扩展
Citus 水平扩展 通过原生扩展实现分布式 PostgreSQL
WiltonDB SQL Server 迁移 SQL Server 线协议兼容
IvorySQL Oracle 迁移 Oracle 语法和 PL/SQL 兼容
OpenHalo MySQL 迁移 MySQL 线协议兼容
Percona 透明数据加密 带有 pg_tde 的 Percona 发行版
FerretDB MongoDB 迁移 MongoDB 线协议兼容
OrioleDB OLTP 优化 Zheap,无膨胀,S3 存储
PolarDB Aurora 风格 RAC RAC,中国国产合规
Supabase 后端即服务 基于 PostgreSQL 的 BaaS,Firebase 替代方案
Cloudberry MPP 数厂与数据分析 大规模并行处理数据仓库(等待2.0GA)

Citus(分布式)

Citus 原生分布式

Citus 将 PostgreSQL 转换为分布式数据库系统,支持跨多个节点的水平扩展。使用 Pigsty 部署原生 HA Citus 集群,获得更好的吞吐量和性能。

关键特性

  • 分布式表:自动在工作节点间分片表
  • 分布式查询:在整个集群上执行查询
  • 高可用性:内置复制和故障转移功能
  • 实时分析:处理事务性和分析性工作负载
  • Postgres 兼容性:保持完整的 PostgreSQL 功能兼容性

使用场景

  • 需要水平扩展的多租户 SaaS 应用程序
  • 大数据集上的实时分析
  • 高吞吐量 OLTP 工作负载
  • 需要扩展超出单节点限制的应用程序
说明

需要规划:适当的分片键选择对于优化性能和避免跨分片查询至关重要。


Babelfish(MSSQL)

说明

SQL Server 兼容

说明

Beta

使用 WiltonDB 和 Babelfish 创建 SQL Server 兼容的 PostgreSQL 集群,提供与 Microsoft SQL Server 的协议级兼容性。

关键特性

  • T-SQL 支持:原生执行 T-SQL 查询
  • 协议兼容性:使用 SQL Server 驱动程序和工具连接
  • 存储过程:支持 T-SQL 存储过程和函数
  • 数据类型:与 SQL Server 数据类型和行为兼容
  • 迁移工具:简化从 SQL Server 环境的迁移

使用场景

  • 将传统 SQL Server 应用程序迁移到 PostgreSQL
  • 需要 SQL Server 兼容性的多数据库环境
  • 在保持应用程序兼容性的同时降低成本
  • 从 SQL Server 迁移到开源替代方案的云迁移
说明

迁移路径:非常适合希望降低许可成本同时保持现有 SQL Server 应用程序兼容性的组织。


IvorySQL(Oracle)

说明

Oracle 兼容

说明

社区版

使用由 HighGo 开源的 IvorySQL 内核运行 Oracle 兼容的 PostgreSQL 集群,提供 Oracle 语法和功能兼容性。

关键特性

  • Oracle 语法支持:支持 Oracle SQL 语法和 PL/SQL
  • 数据类型兼容:Oracle 数据类型映射和行为
  • 包支持:Oracle 风格的包和过程
  • 内置函数:Oracle 兼容的内置函数库
  • 迁移友好:简化从 Oracle 的迁移过程

使用场景

  • Oracle 到 PostgreSQL 的数据库迁移
  • 降低 Oracle 许可成本
  • 遗留 Oracle 应用程序现代化
  • 需要 Oracle 功能的新项目

OpenHalo(MySQL)

说明

MySQL 兼容

说明

实验性

OpenHalo 提供 MySQL 协议兼容性,允许 MySQL 应用程序和工具连接到 PostgreSQL。

关键特性

  • MySQL 协议:与 MySQL 客户端和驱动程序兼容
  • SQL 方言:支持 MySQL 特定的 SQL 语法
  • 函数映射:MySQL 函数到 PostgreSQL 等效项的映射
  • 连接器支持:与现有 MySQL 工具和连接器工作

OrioleDB(云原生)

说明

云原生存储

说明

开发中

OrioleDB 是一个云原生存储引擎,为现代云环境优化,提供无膨胀存储和 S3 集成。

关键特性

  • 无膨胀存储:消除 PostgreSQL 传统的膨胀问题
  • 云存储集成:原生 S3 存储支持
  • OLTP 优化:为事务性工作负载优化
  • 现代架构:为云原生环境设计

PolarDB PG(共享存储)

说明

共享存储

说明

企业版

PolarDB for PostgreSQL 提供类似 Aurora 的共享存储架构,具有中国国产化特性。

关键特性

  • 共享存储:计算与存储分离架构
  • 读写分离:多个只读实例共享存储
  • 快速扩容:快速添加只读实例
  • 国产化:符合中国信创要求

Supabase(BaaS)

说明

后端即服务

说明

开源

Supabase 将 PostgreSQL 转换为完整的后端即服务平台,提供 Firebase 的开源替代方案。

关键特性

  • 实时数据库:实时订阅和同步
  • 认证服务:内置用户认证系统
  • 存储服务:文件存储和 CDN
  • 边缘函数:无服务器函数支持
  • 仪表板:Web 管理界面

Greenplum(数据仓库)

说明

MPP 架构

说明

企业版

Greenplum 是基于 PostgreSQL 的大规模并行处理数据仓库,专为分析性工作负载设计。

关键特性

  • MPP 架构:大规模并行处理
  • 列式存储:优化分析查询性能
  • 分布式计算:跨节点并行查询执行
  • ETL 工具:内置数据加载和转换工具
  • 企业功能:备份、恢复和高可用性

通过选择合适的 PostgreSQL 内核分支,您可以在保持 PostgreSQL 生态系统优势的同时获得特定的功能和兼容性。每个内核都为不同的使用场景和迁移需求提供了解决方案。

3 - 可观测性基础设施

具有 3000+ 指标、30+ 仪表板和企业级监控的现代可观测性堆栈

Pigsty 提供 无与伦比的可观测性,具有基于行业最佳实践构建的现代监控堆栈。 自动监控每个组件,具有 3000+ 指标30+ 仪表板

说明

完整洞察:从高级集群健康到单个表统计的所有内容进行监控。完整洞察您基础设施的过去、现在和未来。

架构概述

Pigsty 的可观测性基础设施在一个连贯的、生产就绪的堆栈中利用经过实战考验的开源组件:

Grafana 可视化引擎

具有高级交互式可视化的仪表板

Prometheus 指标数据库

具有强大查询语言的时间序列存储

Loki 日志平台

具有基于标签索引的集中式日志记录

AlertManager

告警聚合、管理和升级

服务架构

graph TB
    subgraph "Observability Stack"
        Grafana[Grafana :3000]
        Prometheus[Prometheus :9058]
        Loki[Loki :3100]
        AlertManager[AlertManager :9059]
        Pushgateway[Pushgateway :9091]
        Blackbox[Blackbox :9115]
    end

    subgraph "Data Sources"
        PG[(PostgreSQL)]
        Node[Node Metrics]
        Redis[(Redis)]
        MinIO[(MinIO)]
    end

    subgraph "Exporters"
        PGExp[pg_exporter]
        NodeExp[node_exporter]
        RedisExp[redis_exporter]
        MinIOExp[minio_exporter]
    end

    PG --> PGExp
    Node --> NodeExp
    Redis --> RedisExp
    MinIO --> MinIOExp

    PGExp --> Prometheus
    NodeExp --> Prometheus
    RedisExp --> Prometheus
    MinIOExp --> Prometheus

    Prometheus --> Grafana
    Prometheus --> AlertManager
    Loki --> Grafana

监控仪表板

多层级仪表板层次结构

Pigsty 提供按逻辑下钻层次结构组织的 26+ PostgreSQL 仪表板

# 全局概览仪表板
dashboards:
  - Home: 全局集群概览和关键指标
  - INFRA: 基础设施服务状态
  - NODES: 节点级资源利用率
  - Alert: 活跃告警和通知状态

目的:整个环境的高级运营可见性 受众:运营团队、管理仪表板

# 集群焦点仪表板
dashboards:
  - PGSQL Cluster: 集群健康和复制状态
  - PGSQL Service: 服务端点和负载均衡
  - PGSQL Activity: 连接池和查询活动
  - PGSQL Replication: 流复制指标

目的:集群范围的 PostgreSQL 性能和健康 受众:数据库管理员、SRE 团队

# 实例特定仪表板
dashboards:
  - PGSQL Instance: 详细的 PostgreSQL 服务器指标
  - PGSQL Persist: WAL、检查点和持久化
  - PGSQL Proxy: Pgbouncer 连接池指标
  - PGSQL Session: 活跃会话和锁分析

目的:深入了解单个 PostgreSQL 实例 受众:数据库开发人员、性能工程师

# 数据库和对象级仪表板
dashboards:
  - PGSQL Database: 数据库特定性能指标
  - PGSQL Table: 表统计和访问模式
  - PGSQL Query: 查询性能和优化
  - PGSQL Slow: 慢查询分析和调优

目的:应用级数据库性能分析 受众:应用程序开发人员、数据库分析师

仪表板功能

下钻导航

无缝探索 从概览到详细信息,具有上下文链接

时间范围控制

灵活的时间窗口 从实时到数月的历史分析

多维过滤

动态过滤 按集群、实例、数据库或自定义标签

告警集成

可视化告警关联 与指标和告警详情的直接链接


Grafana 部署

增强的 Grafana 堆栈

Pigsty 使用强大的插件和数据源扩展 Grafana,用于高级分析:

# 基本 Grafana 插件
grafana_plugins:
  - grafana-piechart-panel        # 饼图可视化
  - grafana-polystat-panel        # 多值状态面板
  - grafana-worldmap-panel        # 地理可视化
  - grafana-clock-panel           # 时间显示小部件

目的:监控仪表板的基本可视化功能

# 高级可视化插件
grafana_plugins:
  - echarts-panel                 # Apache ECharts 集成
  - volkovlabs-echarts-panel      # 增强的 ECharts 支持
  - volkovlabs-form-panel         # 交互式表单
  - volkovlabs-variable-panel     # 动态变量

目的:用于复杂数据分析的丰富交互式可视化

# 扩展数据源支持
grafana_datasources:
  - infinity-datasource           # REST API 和文件数据源
  - redis-datasource              # Redis 数据源
  - clickhouse-datasource         # ClickHouse 集成
  - postgres-datasource           # 增强的 PostgreSQL 支持

目的:连接到传统指标之外的多样化数据源

# Pigsty 特定定制
custom_features:
  - pigsty-theme                  # 自定义品牌和颜色
  - dashboard-provisioning       # 自动化仪表板部署
  - alert-templates               # 预配置告警规则
  - data-link-automation          # 上下文感知导航

目的:为 PostgreSQL 环境优化的定制用户体验

配置和定制

# 高级 Grafana 配置
grafana_config:
  # 认证
  auth.anonymous.enabled: true
  auth.anonymous.org_role: Viewer
  auth.disable_login_form: false

  # 安全性
  security.allow_embedding: true
  security.cookie_secure: true
  security.cookie_samesite: strict

  # 性能
  database.max_open_conn: 300
  database.max_idle_conn: 300
  database.conn_max_lifetime: 14400

  # 告警
  alerting.enabled: true
  alerting.execute_alerts: true
  unified_alerting.enabled: true

  # 自定义面板
  panels.enable_alpha: true
  feature_toggles.enable: ngalert,live,publicDashboards

Prometheus 堆栈

完整的监控生态系统

Pigsty 部署完整的 Prometheus 生态系统以实现全面的可观测性:

步骤 1

Prometheus 服务器

核心指标数据库 具有高级查询和存储功能

# Prometheus 配置亮点
prometheus_config:
  global:
    scrape_interval: 15s          # 默认抓取频率
    evaluation_interval: 15s      # 规则评估频率
    external_labels:
      cluster: '{{ pg_cluster }}'

  rule_files:
    - "/etc/prometheus/rules/*.yml"

  scrape_configs:
    - job_name: 'node'            # 节点级指标
    - job_name: 'postgres'        # PostgreSQL 指标
    - job_name: 'redis'           # Redis 指标
    - job_name: 'pushgateway'     # 批处理作业指标

步骤 2

AlertManager

智能告警路由 具有抑制、分组和升级功能

# AlertManager 路由配置
alertmanager_routes:
  - match:
      severity: critical
    receiver: pagerduty-critical
    group_wait: 30s
    group_interval: 5m
    repeat_interval: 4h

  - match:
      severity: warning
    receiver: slack-warnings
    group_wait: 1m
    group_interval: 10m
    repeat_interval: 24h

步骤 3

Pushgateway

批处理作业指标收集 用于短暂工作负载和 cron 作业

# 示例:备份作业指标
echo "backup_duration_seconds $(date +%s)" | curl --data-binary @- \
  http://pushgateway:9091/metrics/job/pg-backup/instance/pg-test

步骤 4

Blackbox Exporter

网络连接监控 具有 HTTP、TCP 和 ICMP 探测

# Blackbox 探测配置
blackbox_probes:
  http_2xx:
    prober: http
    timeout: 5s
    http:
      valid_status_codes: [200]

  tcp_connect:
    prober: tcp
    timeout: 5s

预配置告警规则

# PostgreSQL 告警规则示例
alert_rules:
  - alert: PostgreSQLDown
    expr: pg_up == 0
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "PostgreSQL 实例 {{ $labels.instance }} 已宕机"

  - alert: PostgreSQLHighConnections
    expr: pg_stat_database_numbackends / pg_settings_max_connections > 0.8
    for: 10m
    labels:
      severity: warning
    annotations:
      summary: "{{ $labels.instance }} 上连接使用率过高"

  - alert: PostgreSQLReplicationLag
    expr: pg_replication_lag_seconds > 300
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "{{ $labels.instance }} 上复制延迟 > 5 分钟"

pg_exporter:高级 PostgreSQL 监控

自定义指标引擎

Pigsty 的 pg_exporter 是一个高度可定制的 PostgreSQL 指标收集器,支持 所有 PostgreSQL 版本,具有细粒度指标控制:

# pg_exporter 关键功能
features:
  - auto_discovery: true          # 自动数据库发现
  - custom_queries: true          # 用户定义指标查询
  - version_aware: true           # PostgreSQL 版本检测
  - rds_compatible: true          # 云数据库支持
  - label_customization: true     # 灵活的指标标签
  - connection_pooling: true      # 高效连接重用

优势:灵活、轻量级且高度可配置

# PostgreSQL 版本支持矩阵
supported_versions:
  - postgresql_9_6: legacy_metrics_set
  - postgresql_10: enhanced_metrics_set
  - postgresql_11: advanced_metrics_set
  - postgresql_12: modern_metrics_set
  - postgresql_13: extended_metrics_set
  - postgresql_14: latest_metrics_set
  - postgresql_15: cutting_edge_metrics_set
  - postgresql_16: next_gen_metrics_set

好处:异构 PostgreSQL 环境的单一 exporter

# 自定义指标定义示例
custom_queries:
  pg_custom_business_metrics:
    query: |
      SELECT
        schemaname,
        tablename,
        n_tup_ins as inserts_total,
        n_tup_upd as updates_total,
        n_tup_del as deletes_total
      FROM pg_stat_user_tables
    metrics:
      - inserts_total:
          usage: COUNTER
          description: "插入总数"
      - updates_total:
          usage: COUNTER
          description: "更新总数"
# RDS 监控配置
rds_monitoring:
  connection_string: "postgres://monitor:[email protected]:5432/postgres"
  metrics_subset: rds_safe        # 仅 RDS 兼容指标
  auto_discovery: false           # 手动数据库规范
  query_timeout: 30s              # 保守超时

  # RDS 特定指标
  included_databases: [production, staging]
  excluded_schemas: [information_schema, pg_catalog]

主机与基础设施监控

Pigsty v3.7 在受管节点上安装 node_exporter。启用相应模块后,会将 Node、 HAProxy、Keepalived、Nginx、Etcd、MinIO、Redis、PostgreSQL、PgBouncer 与 pgBackRest 目标注册到 Prometheus。端口和开关以 v3.7 标签中的角色默认值及 各模块参数页为准。

外部数据库监控

pgsql-monitor.yml 可注册现有 PostgreSQL 或云 RDS。请提供仅具有必要 pg_monitor 权限的监控连接串;Pigsty 只注册 pg_exporter 与 Grafana 数据源, 不会置备或修改被监控数据库。

./pgsql-monitor.yml -e pg_exporters='{"rds":{"pg_exporter_url":"postgres://dbuser_monitor:[email protected]:5432/postgres"}}'

数据分析与可视化平台

Grafana 既可查询 Prometheus 指标,也可查询 PostgreSQL 数据。内置仪表板通过 变量和 URL 链接实现下钻与上卷;ECharts 等随包提供的插件也可展示应用或 业务数据。

低代码应用开发

Grafana 面板可结合 PostgreSQL 查询构建内部运维视图。这属于可视化能力, 并不是独立的 Pigsty 部署模块或应用 API。

可复用基础设施

infra.yml 可以独立于 PGSQL 部署 INFRA。Nginx、DNSMasq、Prometheus、 AlertManager、Grafana 与 Loki 等服务均由已记录的 *_enabled 参数控制, 因而可以复用既有基础设施或与其共存。

最佳实践

  • 控制指标基数,并根据可用磁盘设置保留周期。
  • 备份 Grafana 配置,定期验证告警通知渠道。
  • 监控端点暴露到可信网络之外时,应配置访问控制与 HTTPS。
  • 监控监控系统本身,并定期检查存储增长。

限制与注意事项

v3.7 的 Prometheus 与 Loki 默认是单节点服务。高指标基数、长保留周期和复杂 仪表板需要额外容量规划。外部长周期存储和高可用监控架构属于人工集成, 不是 v3.7 内置模块。

4 - 高可用性

具有自动故障转移和自愈能力的企业级高可用性

Pigsty 使用 Patroni 为 PostgreSQL 实现高可用性,确保自动故障转移。

pigsty-ha
说明

主节点故障 RTO ≈ 30s,RPO < 1MB,副本故障 RTO≈0(重置当前连接)


概述

Pigsty 的 PostgreSQL 集群具有由 PatroniEtcdHAProxy 支持的内置高可用性。

当您在 PostgreSQL 集群中有两个或更多实例时,您就能够从硬件故障中自愈,无需任何进一步配置——只要集群中的任何实例存活,集群就能提供服务。客户端只需连接到集群中的任何节点即可获得完整服务,无需担心复制拓扑变化。

默认情况下,主节点故障的恢复时间目标(RTO)约为 30s ~ 60s,数据恢复点目标(RPO)< 1MB;对于备用节点故障,RPO = 0,RTO ≈ 0(瞬时)。在一致性优先模式下,保证故障转移期间零数据丢失:RPO = 0。这些指标可以根据您的实际硬件条件和可靠性要求 按需配置

Pigsty 集成了 HAProxy 负载均衡器进行自动流量切换,为客户端提供多种访问方法,如 DNS/VIP/LVS。除了偶发的中断外,故障转移和切换对业务端几乎不可感知,这意味着应用程序不需要修改连接字符串或重启。

关键指标

RTO ~ 30s
主节点故障
RPO < 1MB
异步模式 RPO
RTO ~ 0s
副本故障
RPO = 0
同步模式

高可用性解决的问题

高可用性解决关键的运营挑战:

数据安全

提升可用性:RPO ≈ 0,RTO < 30s,增强数据保护

滚动维护

无缝维护:最小化维护窗口,运营便利

硬件故障

自愈能力:无需人工干预即可从硬件故障中自动恢复

负载分布

读扩展:在备用实例间分布只读查询

具体优势

  • 增强数据安全性:将数据安全 CIA 的可用性方面提升到新高度
  • 滚动维护能力:实现最小停机时间的无缝维护
  • 硬件故障恢复:无需人工干预即可从硬件故障中自愈
  • 负载共享:只读请求可以分布在备用实例间

高可用性的成本

实施 HA 会引入某些权衡和要求:

说明

基础设施要求:HA 需要至少 3 个节点 和额外的基础设施依赖。

资源要求

  • 最小集群规模:至少 3 个节点以实现适当的共识
  • 额外基础设施:需要共识存储(Etcd)和负载均衡器
  • 资源开销:额外的 CPU、内存和网络资源
  • 运营复杂性:增加的监控和管理要求

限制

说明

高可用性 无法防止

  • 人为错误和操作失误
  • 导致数据损坏的软件缺陷
  • 逻辑数据删除或损坏

对于这些场景,需要额外的恢复策略:

  • 延迟集群 防护逻辑损坏
  • 时间点恢复 进行细粒度数据恢复
  • 定期备份 用于灾难恢复场景

架构

Pigsty 的 HA 架构利用多组件设计消除单点故障:

Patroni

集群管理:编排 PostgreSQL 进程并处理自动故障转移

Etcd

共识存储:提供分布式配置和领导者选举

HAProxy

负载均衡器:路由流量并提供服务发现

VIP Manager

虚拟 IP:用于无缝连接的可选第二层 VIP 绑定

组件角色

集群编排器

  • 管理 PostgreSQL 服务器进程
  • 处理自动故障转移和切换
  • 监控集群健康和拓扑
  • 配置流复制
  • 提供集群管理 REST API
# Patroni 配置示例
patron:
  name: pg-test-1
  scope: pg-test
  bootstrap:
    dcs:
      ttl: 30
      loop_wait: 10
      retry_timeout: 30

分布式配置存储

  • 存储集群配置和状态
  • 提供领导者选举机制
  • 确保所有节点的一致视图
  • 优雅处理网络分区
  • 维护集群成员信息
# Etcd 集群配置
etcd_cluster: etcd
etcd_safeguard: false

流量路由器和负载均衡器

  • 将读/写流量路由到适当的节点
  • 为数据库实例提供健康检查
  • 提供多个服务端点
  • 处理连接池和负载分布
  • 支持 SSL 终止和连接限制
# HAProxy 服务端点
primary:5433    # 主节点读写流量
replica:5434    # 副本只读流量
default:5436    # 故障转移感知连接
offline:5438    # 专用离线查询

虚拟 IP 管理

  • 管理第二层虚拟 IP 地址
  • 提供无缝客户端连接
  • 在故障转移期间处理 VIP 迁移
  • 支持多个 VIP 接口
  • 用于简化客户端访问的可选组件
# VIP 配置
vip_enabled: true
vip_address: 10.10.10.99/24
vip_interface: eth0

实现

Pigsty 的 HA 实现遵循 PostgreSQL 集群的成熟模式:

复制架构

步骤 1

流复制

PostgreSQL 使用内置流复制在主节点和备用节点之间进行数据同步。

步骤 2

基于共识的领导

Patroni 使用 Etcd 进行分布式共识来选举集群领导者并管理拓扑变化。

步骤 3

自动故障转移

当主节点失败时,Patroni 自动提升最新的备用节点成为新的主节点。

步骤 4

流量重路由

HAProxy 检测拓扑变化并自动将流量路由到新的主实例。

故障场景

主节点故障处理过程

  1. 检测:Patroni 检测主节点故障(15-30 秒)
  2. 领导者选举:Etcd 协调新领导者选择
  3. 提升:最新的备用节点被提升为主节点
  4. 重新配置:剩余的备用节点重新配置到新主节点
  5. 流量切换:HAProxy 将流量重定向到新主节点
说明

写服务中断:故障转移过程中 15-30 秒

备用节点故障处理过程

  1. 检测:立即检测到备用节点故障
  2. 流量重路由:HAProxy 从池中移除故障节点
  3. 服务连续性:只读查询在剩余备用节点上继续
  4. 自动恢复:节点恢复时自动重新加入集群
说明

最小影响:只读查询仅经历短暂中断

网络分区处理

  1. 防止脑裂:Etcd 共识防止多个主节点
  2. 仲裁要求:需要大多数节点进行操作
  3. 优雅降级:少数分区中的只读模式
  4. 自动恢复:分区愈合时恢复正常操作
说明

仲裁依赖:需要大多数共识节点保持运行


权衡

Pigsty 提供可配置参数来平衡恢复速度和数据一致性:

恢复时间目标(RTO)

pg_rto 参数控制故障转移时间和敏感性:

# RTO 配置
pg_rto: 30  # 默认:30 秒

较低的 RTO 值:

  • ✅ 更快的故障转移响应
  • ✅ 减少服务中断
  • ❌ 更高的误报风险
  • ❌ 可能导致不必要的故障转移

较高的 RTO 值:

  • ✅ 更稳定,较少误报
  • ✅ 对网络故障有更好的容忍度
  • ❌ 更长的服务中断
  • ❌ 对真实故障的延迟响应

恢复点目标(RPO)

pg_rpo 参数限制故障转移期间的潜在数据丢失:

# RPO 配置
pg_rpo: 1048576  # 默认:1MB

较低的 RPO 值:

  • ✅ 更好的数据一致性
  • ✅ 最小的数据丢失风险
  • ❌ 可能延迟故障转移
  • ❌ 可能影响可用性

较高的 RPO 值:

  • ✅ 更快的故障转移过程
  • ✅ 更好的可用性
  • ❌ 更多数据丢失的可能性
  • ❌ 一致性权衡

配置示例

# 零数据丢失配置
synchronous_mode: true
synchronous_mode_strict: true
pg_rpo: 0
pg_rto: 60
synchronous_standby_names: 'ANY 1 (*)'

使用场景:金融系统、关键交易数据

# 快速故障转移配置
synchronous_mode: false
pg_rpo: 16777216  # 16MB
pg_rto: 15
max_replication_slots: 16

使用场景:高流量应用、读重型工作负载

# 默认平衡配置
synchronous_mode: false
pg_rpo: 1048576   # 1MB
pg_rto: 30
max_replication_slots: 8

使用场景:大多数生产环境

网络质量影响

网络条件显著影响 HA 行为:

  • 高质量网络:可以安全使用较低的 RTO 值
  • 不稳定网络:需要较高的 RTO 以防止误报
  • WAN 部署:需要仔细调整超时参数
  • 本地网络:可以优化更快的故障转移

监控和可观测性

Pigsty 为 HA 集群健康提供全面监控:

关键指标

集群状态

监控集群拓扑、领导者状态和成员健康

复制延迟

跟踪所有副本的复制延迟和同步状态

故障转移事件

记录并分析故障转移事件及其影响

性能

监控查询性能和连接健康

仪表板集成

Pigsty 包含用于 HA 监控的预构建 Grafana 仪表板:

  • 集群概览:实时集群拓扑和健康
  • 复制监控:延迟指标和同步状态
  • 故障转移分析:历史故障转移事件和时间
  • 性能指标:正常和故障转移场景下的查询性能

最佳实践

部署建议

说明

反亲和性:在不同的物理主机、机架或可用区部署集群节点。

  • 硬件多样性:使用不同的硬件配置以避免常见故障模式
  • 网络冗余:确保集群节点间有多条网络路径
  • 存储考虑:使用本地存储获得最佳性能,特定用例使用共享存储
  • 监控设置:在投产前实施全面监控

运营指南

  • 定期测试:在非生产环境中执行受控的故障转移测试
  • 容量规划:为故障转移场景适当调整集群节点大小
  • 备份策略:维护独立于 HA 设置的定期备份
  • 文档:保持紧急程序运行手册的更新

常见陷阱

说明

避免这些常见错误:

  • 节点间网络带宽不足
  • 复制延迟监控不充分
  • 不定期测试故障转移程序
  • 防火墙配置不正确

总结

Pigsty 的高可用性解决方案提供:

  • 自动故障转移,RTO 不到一分钟
  • 可配置一致性,具有 RPO 控制
  • 自愈能力,用于硬件故障
  • 负载均衡,用于读扩展
  • 最小运营开销,具有自动化管理

Patroni、Etcd 和 HAProxy 的组合创建了一个强大的、生产就绪的 HA 解决方案,自动处理大多数故障场景,同时提供基于特定要求调整行为的灵活性。


高可用性不仅仅是技术——它是构建您的业务可以依赖的弹性系统。

5 - 灾难恢复

经过实战考验的备份策略和自动配置的时间点恢复

时间点恢复(PITR)允许将 PostgreSQL 集群回滚到过去的任何特定时刻,防止软件缺陷或人为错误导致的数据丢失。Pigsty 使用 pgBackRest 进行 PITR,具有可配置的备份策略,使用本地文件系统或 MinIO 等对象存储。

PITR Architecture
说明

数据库的时间旅行:将您的集群回滚到任何时间点,防止高可用性无法解决的软件缺陷、人为错误和数据损坏场景。

概述

Pigsty 提供 企业级时间点恢复,具有零配置设置、自动备份和灵活的恢复选项。基于 pgBackRest 构建,支持 MinIO/S3,防护数据损坏、人为错误和逻辑灾难。

降低 RPO
通过连续 WAL 归档最小化恢复点目标
数据完整性
增强数据完整性保护,防止损坏
灾难恢复
通过灵活的恢复选项改进灾难恢复能力

PITR 工作原理

PITR 需要两个关键组件协同工作以实现时间点恢复:

基础备份 [#base-backups]

使用 pgBackRest 创建数据库集群快照,支持多种备份类型:

- **完整备份**:完整的数据库集群快照
- **增量备份**:仅自上次备份以来的变更
- **差异备份**:自上次完整备份以来的变更
- **计划备份**:通过 Crontab 配置的定期备份

WAL 归档 [#wal-archiving]

连续归档预写日志(WAL)段文件:

- **连续归档**:实时 WAL 文件保存
- **自动管理**:WAL 文件和清理自动处理
- **可选功能**:如果不需要 PITR 可以禁用

实现

Pigsty 提供两种默认备份策略,具有灵活的配置选项:

本地文件系统策略 [#local-filesystem-strategy]

- **频率**:每日完整备份
- **存储**:本地文件系统存储
- **使用场景**:单节点或本地开发环境

MinIO/S3 策略 [#minio-s3-strategy]

- **频率**:每周完整备份,每日增量备份
- **存储**:对象存储(MinIO、S3)
- **使用场景**:具有分布式存储的生产环境

配置选项

备份配置非常灵活,可以指定选项:

  • 仓库类型:本地、S3 或其他支持的后端
  • 保留策略:保留备份的时间长度
  • 加密:安全备份存储
  • 存储位置:多个备份目标

恢复选项

说明

恢复操作应谨慎执行,因为它们将替换当前的数据库状态。

恢复命令允许恢复到各种时间点:

步骤 1

### 最新 WAL 归档 [#latest-wal-archive]
恢复到 WAL 归档中可用的最近点:
```bash
pg-pitr
```

步骤 2

### 特定时间戳 [#specific-timestamp]
恢复到确切的时间点:
```bash
pg-pitr --time="2022-12-30 14:44:44+08"
```

步骤 3

### 命名恢复点 [#named-restore-point]
恢复到之前创建的命名点:
```bash
pg-pitr --name="my-restore-point"
```

步骤 4

### 特定 LSN 或事务 ID [#specific-lsn-or-transaction-id]
恢复到特定的日志序列号或事务:
```bash
pg-pitr --lsn="0/1234567"
pg-pitr --xid="12345"
```
说明

虽然 PITR 对数据恢复很强大,但理想情况下应该与高可用性解决方案结合使用,以全面保护数据免受逻辑和物理故障的影响。

6 - 基础设施即代码

通过 YAML 驱动配置的声明式基础设施和数据库管理

Pigsty 提供 声明式 接口:在 配置 文件中描述一切,Pigsty 使用幂等的 playbooks 将其操作到期望的状态。它的工作原理类似于 Kubernetes CRD 和 Operator,但适用于任何节点上的数据库和基础设施:裸机或虚拟机。

说明

基础设施即代码,数据库即代码:声明式 API 和幂等 Playbooks,GitOPS 工作得如魅力般。


声明模块

您可以在单个节点上声明模块:

# infra cluster for proxy, monitor, alert, etc...
infra: { hosts: { 10.10.10.10: { infra_seq: 1 } } }

# minio cluster, s3 compatible object storage
minio: { hosts: { 10.10.10.10: { minio_seq: 1 } }, vars: { minio_cluster: minio } }

# etcd cluster for ha postgres DCS
etcd: { hosts: { 10.10.10.10: { etcd_seq: 1 } }, vars: { etcd_cluster: etcd } }

# postgres example cluster: pg-meta
pg-meta: { hosts: { 10.10.10.10: { pg_seq: 1, pg_role: primary } }, vars: { pg_cluster: pg-meta } }

并使用 playbooks 应用:

./infra.yml -l infra    # 在节点 10.10.10.10 上初始化 infra 模块
./etcd.yml  -l etcd     # 在节点 10.10.10.10 上初始化 etcd 模块
./minio.yml -l minio    # 在节点 10.10.10.10 上初始化 minio 模块
./pgsql.yml -l pg-meta  # 在节点 10.10.10.10 上初始化 pgsql 模块

声明集群

要创建具有流复制的三节点 HA postgres 集群:

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

并使用以下命令应用:

./pgsql.yml -l pg-test  # 初始化 pg-test 集群

声明集群内部

您可以深度定制数据库集群:

pg-meta:
  hosts:
    10.10.10.10: { pg_seq: 1, pg_role: primary }
  vars:
    pg_cluster: pg-meta
    pg_databases:
      - name: meta
        baseline: cmdb.sql
        comment: pigsty meta database
        schemas: [pigsty]
        extensions:
          - { name: adminpack, schema: pg_catalog }
          - { name: postgis, schema: public }
          - { name: timescaledb, schema: public }
    pg_users:
      - { name: dbuser_meta, password: DBUser.Meta, pgbouncer: true, roles: [dbrole_admin], comment: pigsty admin user }
      - { name: dbuser_view, password: DBUser.Viewer, pgbouncer: true, roles: [dbrole_readonly], comment: pigsty read-only user }
    pg_services:
      - { name: primary, port: 5433, dest: default }
      - { name: replica, port: 5434, dest: default, selector: "[]" }
      - { name: default, port: 5436, dest: postgres }
      - { name: offline, port: 5438, dest: postgres, selector: "[]" }
    pg_hba_rules:
      - { user: dbuser_view, db: all, addr: infra, auth: pwd, title: 'allow view user from infra nodes' }
    pgb_hba_rules:
      - { user: dbuser_view, db: all, addr: infra, auth: pwd, title: 'allow view user from infra nodes' }

声明访问控制

定义高级访问控制规则:

pg_hba_rules:
  - { user: '${dbsu}', db: all, addr: local, auth: ident, title: 'dbsu access via local os user ident' }
  - { user: '${dbsu}', db: replication, addr: local, auth: ident, title: 'dbsu replication from local os ident' }
  - { user: '${repl}', db: replication, addr: '${ip}/32', auth: pwd, title: 'replicator replication from ${ip}' }
  - { user: '${repl}', db: postgres, addr: '${ip}/32', auth: pwd, title: 'replicator postgres db from ${ip}' }
  - { user: '${monitor}', db: all, addr: '${ip}/32', auth: pwd, title: 'monitor from ${ip}' }
  - { user: '${monitor}', db: all, addr: infra, auth: pwd, title: 'monitor from infra nodes' }
  - { user: '${admin}', db: all, addr: infra, auth: ssl, title: 'admin @ infra nodes with pwd & ssl' }
  - { user: '+dbrole_readonly', db: all, addr: '${vip}/32', auth: ssl, title: 'allow readonly role from ${vip} with ssl' }
  - { user: '+dbrole_offline', db: all, addr: '${vip}/32', auth: ssl, title: 'allow offline role from ${vip} with ssl' }
  - { user: dbuser_meta, db: meta, addr: '10.0.0.0/8', auth: ssl, title: 'allow meta user from 10.0.0.0/8 with ssl' }

Citus 分布式集群

声明一个水平分布的 Citus 集群:

pg-citus0: # coordinator
  hosts: { 10.10.10.10: { pg_seq: 1, pg_role: primary } }
  vars:
    pg_cluster: pg-citus0
    pg_mode: citus
    pg_shard: pg-citus
    pg_primary_db: meta
    pg_users: [ { name: dbuser_meta, password: DBUser.Meta, pgbouncer: true, roles: [ dbrole_admin ] } ]
    pg_databases: [ { name: meta, extensions: [ { name: citus }, { name: postgis }, { name: timescaledb } ] } ]
    pg_hba_rules:
      - { user: 'all', db: all, addr: '10.10.10.0/24', auth: trust }
pg-citus1: # worker1
  hosts: { 10.10.10.11: { pg_seq: 1, pg_role: primary } }
  vars: { pg_cluster: pg-citus1, pg_mode: citus, pg_shard: pg-citus }
pg-citus2: # worker2
  hosts: { 10.10.10.12: { pg_seq: 1, pg_role: primary } }
  vars: { pg_cluster: pg-citus2, pg_mode: citus, pg_shard: pg-citus }
pg-citus3: # worker3
  hosts: { 10.10.10.13: { pg_seq: 1, pg_role: primary } }
  vars: { pg_cluster: pg-citus3, pg_mode: citus, pg_shard: pg-citus }

Redis 集群

声明不同类型的 Redis 集群:

redis-ms: # redis classic primary-replica
  hosts: { 10.10.10.10: { redis_node: 1 , redis_instances: { 6379: { }, 6380: { replica_of: '10.10.10.10 6379' } } } }
  vars: { redis_cluster: redis-ms ,redis_password: 'redis.ms' }
redis-sentinel: # redis sentinel x3
  hosts:
    10.10.10.10: { redis_node: 1, redis_instances: { 26379: { sentinel_monitor: redis-src } } }
    10.10.10.11: { redis_node: 2, redis_instances: { 26379: { sentinel_monitor: redis-src } } }
    10.10.10.12: { redis_node: 3, redis_instances: { 26379: { sentinel_monitor: redis-src } } }
  vars: { redis_cluster: redis-sentinel, redis_password: 'redis.sentinel' }
redis-cluster: # native redis cluster: 3m x 3s
  hosts:
    10.10.10.10: { redis_node: 1 ,redis_instances: { 6379: { }, 6380: { } } }
    10.10.10.11: { redis_node: 2 ,redis_instances: { 6379: { }, 6380: { } } }
    10.10.10.12: { redis_node: 3 ,redis_instances: { 6379: { }, 6380: { } } }
  vars: { redis_cluster: redis-cluster, redis_password: 'redis.cluster', redis_mode: cluster, redis_max_memory: 64MB }

Etcd 集群

声明一个 3 节点 etcd 共识集群:

etcd:
  hosts:
    10.10.10.10: { etcd_seq: 1 }
    10.10.10.11: { etcd_seq: 2 }
    10.10.10.12: { etcd_seq: 3 }
  vars:
    etcd_cluster: etcd
    etcd_safeguard: false

MinIO 集群

声明一个 3 节点 MinIO 对象存储集群:

minio:
  hosts:
    10.10.10.10: { minio_seq: 1 }
    10.10.10.11: { minio_seq: 2 }
    10.10.10.12: { minio_seq: 3 }
  vars:
    minio_cluster: minio
    minio_data: '/data/minio'
    minio_domain: sss.pigsty
    minio_buckets: [ { name: pgsql }, { name: infra }, { name: redis } ]
    minio_users:
      - { access_key: dba, secret_key: S3User.DBA, policy: consoleAdmin }
      - { access_key: pgbackrest, secret_key: S3User.Backup, policy: readwrite }

Pigsty 使您能够声明式地描述整个基础设施并通过代码管理它,为您的数据库和基础设施操作提供一致性、可重复性和可扩展性。

7 - 无容器

Pigsty 在原生 Linux 上运行,无需容器和 kubernetes

Pigsty 运行在裸 Linux 上,我们支持主流 Linux 发行版,如 EL / Debian / Ubuntu,以及兼容的 Linux 发行版,如 Rocky Linux、AlmaLinux 等……

我们这样做是有目的的。为每个主版本 x PG 版本 x 操作系统架构编译和打包所有 postgres 相关包和数百个扩展到 RPM/DEB 是困难的……

但我相信这是正确的做法。所以我们不走 Docker、Podman 或 Kubernetes 这样的捷径。

8 - 应用模板

使用模板设置企业软件,supabase、odoo、dify、gitlab……
Supabase
    自托管 Supabase
Odoo
    运行 Odoo 开源 ERP
Dify
    运行 Dify AI 工作流
pgAdmin
    运行官方管理 GUI 工具

9 - Supabase

将 Postgres 转换为功能齐全的后端即服务

自托管 Supabase

10 - 本地优先

无需互联网安装,包含所有依赖项