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

返回本页常规视图.

可观测性

基于 Prometheus + Grafana 的监控告警体系,三千类指标全方位洞察。

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

flowchart TB
    subgraph Grafana["📊 Grafana 仪表盘"]
        direction LR
        G1["🌍 全局大盘<br/>一眼看全局"]
        G2["🏢 集群详情<br/>健康状态"]
        G3["💻 实例详情<br/>性能指标"]
        G4["🔍 查询分析<br/>慢查询"]
    end

    subgraph Storage["数据存储层"]
        direction LR
        VM["📈 VictoriaMetrics<br/>指标存储"]
        VL["📝 VictoriaLogs<br/>日志存储"]
        AM["🔔 AlertManager<br/>告警管理"]
    end

    subgraph Collectors["监控数据采集"]
        direction LR
        C1["pg_exporter<br/>PostgreSQL"]
        C2["pgbouncer_exp<br/>连接池"]
        C3["patroni<br/>高可用"]
        C4["haproxy<br/>负载均衡"]
        C5["node_exporter<br/>节点"]
    end

    Collectors --> Storage
    Storage --> Grafana

    Note["3000+ 指标,覆盖数据库每一个细节"]

核心价值:不用猜测数据库发生了什么——看一眼仪表盘就知道。30+ 开箱即用的专业仪表盘,3000+ 指标,从全局到单条查询全覆盖。


本章内容

章节 说明 核心问题
指标体系 Prometheus 兼容的指标采集与存储 有哪些指标?如何查询?
日志收集 VictoriaLogs 集中收集与分析 日志去哪了?如何搜索?
告警机制 AlertManager 告警通知与响应 如何收到告警通知?

为什么可观测性很重要?

flowchart LR
    subgraph NoMonitor["❌ 没有监控的困境"]
        direction TB
        Q1["数据库好像变慢了?"]
        Q1A["是查询慢还是连接多?"]
        Q1B["哪个查询最慢?"]
        Q1C["CPU 高还是 IO 高?"]
        Q1D["……完全不知道,只能猜 😵"]

        Q2["昨晚数据库出问题了?"]
        Q2A["什么时候出的问题?"]
        Q2B["持续了多久?影响哪些业务?"]
        Q2C["……日志翻了半天也没找到 😓"]
    end

    subgraph WithMonitor["✅ 有 Pigsty 监控的清晰"]
        direction TB
        A1["数据库变慢了"] --> A1G["📊 打开 Grafana"]
        A1G --> A1A["PGSQL Query:最慢的 5 条 SQL"]
        A1G --> A1B["PGSQL Session:连接数异常"]
        A1G --> A1C["Node Instance:CPU 95%"]
        A1G --> A1D["⏱️ 5 分钟定位问题"]

        A2["昨晚数据库出问题了"] --> A2G["📈 查看历史指标"]
        A2G --> A2A["23:15 复制延迟突增"]
        A2G --> A2B["23:17 主库 CPU 飙高"]
        A2G --> A2C["23:20 自动切换恢复"]
        A2G --> A2D["📋 全程有据可查"]
    end

监控架构

flowchart TB
    subgraph Grafana["📊 Grafana 可视化 + 告警面板"]
        direction LR
        D1["概览"]
        D2["集群"]
        D3["实例"]
        D4["查询"]
        D5["节点"]
    end

    subgraph Storage["数据存储与处理层"]
        VM["📈 VictoriaMetrics<br/>时序数据库<br/>指标存储/查询"]
        VL["📝 VictoriaLogs<br/>日志数据库<br/>日志搜索/分析"]
        AM["🔔 AlertManager<br/>告警引擎<br/>通知/静默"]
    end

    subgraph Targets["监控目标"]
        subgraph Exporters["指标采集器"]
            E1["pg_exporter<br/>PostgreSQL<br/>1000+ 指标"]
            E2["pgbouncer_exp<br/>连接池指标<br/>100+ 指标"]
            E3["patroni<br/>高可用指标<br/>50+ 指标"]
            E4["haproxy<br/>服务指标<br/>100+ 指标"]
            E5["node_exporter<br/>节点指标<br/>300+ 指标"]
        end
        Vector["📋 Vector 日志采集<br/>PostgreSQL / Patroni / 系统日志"]
    end

    Exporters --> |Pull 指标| VM
    Vector --> |Push 日志| VL
    VM --> Grafana
    VL --> Grafana
    AM --> Grafana
    VM --> |告警规则| AM

监控指标

Pigsty 采集超过 3000 类监控指标,覆盖数据库运行的每一个细节:

按组件分类

组件 指标数量 核心指标示例
PostgreSQL 1000+ 连接数、事务数、复制延迟、缓存命中率、死锁
Pgbouncer 100+ 连接池状态、等待队列、事务时间
Patroni 50+ 集群状态、成员健康、切换历史
HAProxy 100+ 后端状态、连接数、响应时间
Node 300+ CPU、内存、磁盘 IO、网络流量
pgBackRest 20+ 备份状态、大小、时间、WAL 归档

按场景分类

场景 关键指标 告警阈值示例
性能监控 QPS、TPS、延迟、缓存命中率 延迟 > 100ms
容量规划 连接数、磁盘使用、表膨胀 磁盘 > 80%
高可用 复制延迟、成员状态 延迟 > 10s
安全审计 连接来源、认证失败 失败 > 10次/分钟

仪表盘

Pigsty 提供 30+ 专业仪表盘,开箱即用:

全局视图

仪表盘 说明 适用场景
Home Pigsty 首页总览 快速了解全局状态
PGSQL Overview PostgreSQL 集群全局大盘 运维巡检
Node Overview 节点全局大盘 基础设施监控

集群与实例

仪表盘 说明 适用场景
PGSQL Cluster 单个集群详情 集群健康检查
PGSQL Instance 单个实例详情 问题定位
PGSQL Database 单个数据库详情 容量分析

专项分析

仪表盘 说明 适用场景
PGSQL Query 查询性能分析 慢 SQL 优化
PGSQL Session 会话分析 连接问题排查
PGSQL Persist 持久化分析 写入性能调优
PGSQL Replication 复制监控 高可用检查
PGSQL Table 表级详情 容量与膨胀

在线演示

立即体验 Pigsty 监控系统的强大能力:

🔗 demo.pigsty.cc

内容 说明
完整仪表盘 30+ 开箱即用的仪表盘
真实数据 实际运行的 PostgreSQL 集群
无需安装 浏览器直接访问

核心组件

VictoriaMetrics

Prometheus 兼容的时序数据库,比 Prometheus 更高效:

  • 完全兼容 PromQL 查询语法
  • 更高压缩率,节省存储空间
  • 更快查询,特别是长时间范围查询
  • 支持降采样,长期数据自动压缩

Grafana

业界领先的可视化平台:

  • 开箱即用 30+ 专业仪表盘
  • 灵活定制 支持自定义仪表盘
  • 告警集成 可视化配置告警规则
  • 权限管理 支持多租户

VictoriaLogs

高效的日志存储和分析系统:

  • 高压缩率 节省存储成本
  • 快速搜索 支持全文检索
  • 结构化查询 LogsQL 查询语言
  • Grafana 集成 统一查看日志和指标

AlertManager

Prometheus 生态的告警管理系统:

  • 告警分组 相关告警聚合
  • 告警静默 维护时段静默
  • 多渠道通知 邮件、Slack、钉钉、企业微信

快速访问

本地部署后,通过以下地址访问监控服务:

服务 地址 默认凭据 说明
Grafana http://<ip>:3000 admin / pigsty 主要入口
VictoriaMetrics http://<ip>:9090 - 指标查询
AlertManager http://<ip>:9093 - 告警管理
Nginx http://<ip>:80 - 统一入口

常见监控场景

场景一:慢查询定位

1. 打开 PGSQL Query 仪表盘
2. 按平均执行时间排序
3. 找到最慢的 SQL
4. 查看执行计划和调用频率
5. 优化 SQL 或添加索引

场景二:复制延迟告警

1. 收到复制延迟告警
2. 打开 PGSQL Replication 仪表盘
3. 查看延迟趋势和原因
4. 检查网络和主库负载
5. 决定是否需要干预

场景三:磁盘空间预警

1. 收到磁盘空间告警
2. 打开 PGSQL Database 仪表盘
3. 查看各表占用空间
4. 识别膨胀严重的表
5. 执行 VACUUM 或扩容

最佳实践

监控配置

  1. 配置告警:为关键指标配置告警阈值
  2. 设置通知:配置多渠道告警通知
  3. 保留策略:根据需求配置数据保留时间

日常运维

  1. 定期巡检:每天查看 Overview 仪表盘
  2. 关注趋势:不只看当前值,也看变化趋势
  3. 日志分析:指标异常时结合日志定位

问题排查

  1. 从全局到局部:先看概览,再看详情
  2. 关联分析:对比多个指标的时间点
  3. 历史对比:与正常时段对比

接下来

深入了解可观测性的各个方面:

相关话题:

  • ♾️ 高可用:监控复制延迟和集群状态
  • 🔒 安全:监控认证失败和异常访问
  • 🏗️ INFRA 模块:监控系统的部署和配置

1 - 指标体系

Prometheus 兼容的指标采集、存储与查询。

Pigsty 使用 VictoriaMetrics 作为指标存储,完全兼容 Prometheus 生态。通过各类 Exporter 采集超过三千类监控指标。


指标采集架构

┌─────────────────────────────────────────────────────────────┐
│                    VictoriaMetrics                           │
│                      (Pull 模式)                             │
└───────────────────────────┬─────────────────────────────────┘
                            │ HTTP Scrape
    ┌───────────┬───────────┼───────────┬───────────┐
    │           │           │           │           │
    ▼           ▼           ▼           ▼           ▼
┌───────┐  ┌───────┐  ┌───────┐  ┌───────┐  ┌───────┐
│ :9630 │  │ :9631 │  │ :8008 │  │ :9101 │  │ :9100 │
│pg_exp │  │pgb_exp│  │patroni│  │haproxy│  │node_ex│
└───────┘  └───────┘  └───────┘  └───────┘  └───────┘

Exporter 列表

Exporter 端口 说明
node_exporter 9100 主机指标(CPU/内存/磁盘/网络)
pg_exporter 9630 PostgreSQL 数据库指标
pgbouncer_exporter 9631 Pgbouncer 连接池指标
pgbackrest_exporter 9854 pgBackRest 备份指标
patroni 8008 Patroni 高可用指标
haproxy 9101 HAProxy 负载均衡指标

核心指标分类

PostgreSQL 指标

类别 指标示例 说明
连接 pg_stat_activity_count 当前连接数
事务 pg_stat_database_xact_commit 事务提交数
查询 pg_stat_statements_calls 查询调用次数
pg_locks_count 锁数量
复制 pg_replication_lag_seconds 复制延迟
存储 pg_database_size_bytes 数据库大小
缓存 pg_stat_bgwriter_buffers_backend 后台写入缓冲

主机指标

类别 指标示例 说明
CPU node_cpu_seconds_total CPU 使用时间
内存 node_memory_MemAvailable_bytes 可用内存
磁盘 node_disk_io_time_seconds_total 磁盘 IO 时间
网络 node_network_receive_bytes_total 网络接收字节

指标查询

PromQL 示例

# 当前连接数
pg_stat_activity_count{state="active"}

# 每秒事务数
rate(pg_stat_database_xact_commit[5m])

# 复制延迟(秒)
pg_replication_lag_seconds

# CPU 使用率
100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# 可用内存百分比
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100

查询接口

# 通过 API 查询
curl 'http://localhost:9090/api/v1/query?query=pg_up'

# 范围查询
curl 'http://localhost:9090/api/v1/query_range?query=pg_up&start=2024-01-01T00:00:00Z&end=2024-01-02T00:00:00Z&step=1h'

指标存储

存储配置

prometheus_retention: 15d          # 指标保留时间
prometheus_storage_size: 10GB      # 存储空间限制

存储路径

/data/prometheus/        # VictoriaMetrics 数据目录

服务发现

Pigsty 使用文件服务发现(File SD),自动注册监控目标。

配置文件

/etc/prometheus/targets/
├── infra.yml          # 基础设施目标
├── node.yml           # 节点目标
├── pgsql.yml          # PostgreSQL 目标
├── redis.yml          # Redis 目标
└── ...

目标格式

# /etc/prometheus/targets/pgsql.yml
- labels:
    cls: pg-meta
    ins: pg-meta-1
    ip: 10.10.10.10
    job: pgsql
  targets:
    - 10.10.10.10:9630    # pg_exporter
    - 10.10.10.10:9631    # pgbouncer_exporter
    - 10.10.10.10:8008    # patroni

自定义指标

添加查询指标

通过 pg_exporter 自定义查询采集额外指标:

# /etc/pg_exporter/queries.yaml
pg_custom_metric:
  query: "SELECT count(*) as value FROM my_table"
  metrics:
    - value:
        usage: "GAUGE"
        description: "Custom metric value"

添加 Exporter

haproxy_services 中添加自定义 Exporter 端口:

haproxy_services:
  - name: custom-exporter
    port: 9999
    options:
      - option httpchk GET /metrics

监控标签

所有 PostgreSQL 相关指标都带有以下标签:

标签 说明 示例
cls 集群名称 pg-meta
ins 实例名称 pg-meta-1
ip 实例 IP 10.10.10.10
job 任务类型 pgsql

使用标签进行过滤:

# 特定集群的连接数
pg_stat_activity_count{cls="pg-meta"}

# 特定实例的复制延迟
pg_replication_lag_seconds{ins="pg-test-2"}

2 - 日志收集

VictoriaLogs 集中收集与分析日志。

Pigsty 使用 Vector 收集各组件日志,集中存储到 VictoriaLogs 进行分析和查询。


日志架构

┌─────────────────────────────────────────────────────────────┐
│                     VictoriaLogs                             │
│                    (日志存储与查询)                           │
└───────────────────────────┬─────────────────────────────────┘
                            │ Push
                            │
┌───────────────────────────┴─────────────────────────────────┐
│                         Vector                               │
│                      (日志收集代理)                           │
└───────────────────────────┬─────────────────────────────────┘
                            │ 文件采集
    ┌───────────┬───────────┼───────────┬───────────┐
    │           │           │           │           │
    ▼           ▼           ▼           ▼           ▼
┌───────┐  ┌───────┐  ┌───────┐  ┌───────┐  ┌───────┐
│Postgres│  │Patroni│  │Pgbouncer│ │pgBackRest│ │System│
│  log  │  │  log  │  │  log  │  │  log  │  │  log │
└───────┘  └───────┘  └───────┘  └───────┘  └───────┘

日志来源

PostgreSQL 组件日志

组件 日志路径 说明
PostgreSQL /pg/log/postgres/ 数据库日志
Patroni /pg/log/patroni/ 高可用组件日志
Pgbouncer /pg/log/pgbouncer/ 连接池日志
pgBackRest /pg/log/pgbackrest/ 备份日志

系统日志

日志 路径 说明
系统日志 /var/log/messages 系统事件
认证日志 /var/log/secure 认证事件

PostgreSQL 日志配置

默认配置

# postgresql.conf
log_destination: csvlog
logging_collector: 'on'
log_directory: /pg/log/postgres
log_filename: 'postgresql-%a.log'    # 按星期轮转
log_file_mode: '0640'
log_rotation_age: '1d'
log_truncate_on_rotation: 'on'

# 日志内容
log_checkpoints: 'on'
log_lock_waits: 'on'
log_replication_commands: 'on'
log_statement: ddl                   # 记录 DDL
log_min_duration_statement: 100      # 记录 >100ms 的查询

增强配置(crit.yml)

log_connections: 'receipt,authentication,authorization'
log_disconnections: 'on'
log_lock_failures: 'on'

日志查询

VictoriaLogs 查询语法

# 查询 PostgreSQL 错误日志
{filename="/pg/log/postgres/postgresql-*.log"} | error

# 查询认证失败
{filename=~"/pg/log/.*"} | "authentication failed"

# 查询慢查询
{job="pgsql"} | duration > 1000ms

# 按实例过滤
{ins="pg-meta-1"} | FATAL

Grafana 集成

VictoriaLogs 与 Grafana 集成,可在仪表盘中查看日志:

  1. 打开 Grafana
  2. 进入 Explore
  3. 选择 VictoriaLogs 数据源
  4. 输入 LogsQL 查询

日志存储

存储配置

vlogs_enabled: true
vlogs_port: 9428
vlogs_options: >-
  -retentionPeriod=15d
  -retention.maxDiskSpaceUsageBytes=50GiB

存储路径

/data/victorialogs/      # 日志数据目录

日志告警

常见告警场景

场景 日志模式 说明
认证失败 authentication failed 可能的暴力破解
连接拒绝 no pg_hba.conf entry HBA 配置问题
磁盘空间 No space left 磁盘已满
OOM out of memory 内存不足
复制中断 replication connection 复制问题

配置日志告警

在 AlertManager 中配置基于日志的告警规则。


日志最佳实践

  1. 保留合适时间:根据合规要求和存储空间设置保留期

  2. 关注关键日志

    • FATAL 和 ERROR 级别日志
    • 认证相关日志
    • 复制相关日志
  3. 日志分析

    • 定期分析慢查询日志优化性能
    • 分析错误日志排查问题
  4. 日志保护

    • 日志文件权限 0640
    • 集中存储防止篡改
  5. 日志轮转

    • 配置自动轮转避免磁盘撑满
    • 归档重要日志

3 - 告警机制

AlertManager 告警通知与响应。

Pigsty 使用 VictoriaMetrics vmalert 进行告警规则评估,AlertManager 进行告警管理和通知分发。


告警架构

┌─────────────────────────────────────────────────────────────┐
│                     通知渠道                                  │
│  ┌───────┐  ┌───────┐  ┌───────┐  ┌───────┐  ┌───────┐     │
│  │ Email │  │ Slack │  │ 钉钉  │  │飞书    │  │Webhook│     │
│  └───────┘  └───────┘  └───────┘  └───────┘  └───────┘     │
└───────────────────────────┬─────────────────────────────────┘
                            │ 通知
┌───────────────────────────┴─────────────────────────────────┐
│                      AlertManager                            │
│                    (告警分组、去重、路由)                      │
└───────────────────────────┬─────────────────────────────────┘
                            │ 告警
┌───────────────────────────┴─────────────────────────────────┐
│                        vmalert                               │
│                     (规则评估引擎)                            │
└───────────────────────────┬─────────────────────────────────┘
                            │ 查询
┌───────────────────────────┴─────────────────────────────────┐
│                    VictoriaMetrics                           │
│                      (指标存储)                              │
└─────────────────────────────────────────────────────────────┘

预置告警规则

PostgreSQL 告警

规则名称 级别 说明
PG_DOWN P0 PostgreSQL 实例宕机
PG_REPLICATION_LAG P1 复制延迟过高
PG_CONNECTION_EXHAUSTED P1 连接数接近上限
PG_DEADLOCK P2 检测到死锁
PG_LONG_TRANSACTION P2 长事务未提交
PG_BACKUP_FAILED P1 备份失败

主机告警

规则名称 级别 说明
NODE_DOWN P0 节点不可达
NODE_CPU_HIGH P2 CPU 使用率过高
NODE_MEMORY_HIGH P2 内存使用率过高
NODE_DISK_FULL P1 磁盘空间不足

高可用告警

规则名称 级别 说明
PATRONI_FAILOVER P1 发生故障切换
PATRONI_NO_LEADER P0 集群无主库
ETCD_DOWN P0 ETCD 节点宕机

告警级别

级别 含义 响应要求
P0 紧急 立即响应,服务中断
P1 严重 尽快处理,可能影响服务
P2 警告 计划处理,潜在问题
P3 信息 需要关注,但不紧急

通知配置

邮件通知

# /etc/alertmanager/alertmanager.yml
global:
  smtp_smarthost: 'smtp.example.com:587'
  smtp_from: 'alertmanager@example.com'
  smtp_auth_username: 'alertmanager@example.com'
  smtp_auth_password: 'password'

receivers:
  - name: 'email'
    email_configs:
      - to: 'dba@example.com'

Slack 通知

receivers:
  - name: 'slack'
    slack_configs:
      - api_url: 'https://hooks.slack.com/services/xxx/xxx/xxx'
        channel: '#alerts'

钉钉通知

receivers:
  - name: 'dingtalk'
    webhook_configs:
      - url: 'https://oapi.dingtalk.com/robot/send?access_token=xxx'

告警路由

根据告警标签路由到不同接收者:

route:
  group_by: ['alertname', 'cls']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'default'
  routes:
    # P0 告警立即通知
    - match:
        severity: P0
      receiver: 'oncall'
      repeat_interval: 15m

    # PostgreSQL 告警发给 DBA
    - match:
        job: pgsql
      receiver: 'dba-team'

    # 特定集群告警发给对应团队
    - match:
        cls: pg-order
      receiver: 'order-team'

告警静默

临时静默告警(如计划维护期间):

通过 Web UI

  1. 访问 AlertManager(http://<ip>:9093
  2. 点击 “Silences” -> “New Silence”
  3. 设置匹配条件和静默时间

通过命令行

# 创建静默
amtool silence add alertname="PG_DOWN" instance="pg-test-1" --duration=2h

# 查看静默
amtool silence query

# 取消静默
amtool silence expire <silence-id>

自定义告警规则

添加告警规则

# /etc/prometheus/rules/custom.yml
groups:
  - name: custom
    rules:
      - alert: HighQueryLatency
        expr: pg_stat_statements_mean_exec_time > 1000
        for: 5m
        labels:
          severity: P2
        annotations:
          summary: "High query latency on {{ $labels.ins }}"
          description: "Average query execution time is {{ $value }}ms"

规则格式

- alert: <告警名称>
  expr: <PromQL 表达式>
  for: <持续时间>
  labels:
    severity: <级别>
  annotations:
    summary: <摘要>
    description: <详细描述>

告警最佳实践

  1. 避免告警疲劳

    • 只告警需要人工处理的问题
    • 合理设置阈值和持续时间
    • 使用告警分组减少通知数量
  2. 分级处理

    • P0 告警必须立即响应
    • P1 告警在工作时间内处理
    • P2/P3 告警可以批量处理
  3. 维护期间静默

    • 计划维护前创建静默
    • 维护完成后验证并取消静默
  4. 持续优化

    • 定期回顾告警历史
    • 调整误报较多的规则
    • 补充遗漏的告警场景