这是本节的多页打印视图。
点击此处打印.
返回本页常规视图.
可观测性
基于 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 或扩容
最佳实践
监控配置
- 配置告警:为关键指标配置告警阈值
- 设置通知:配置多渠道告警通知
- 保留策略:根据需求配置数据保留时间
日常运维
- 定期巡检:每天查看 Overview 仪表盘
- 关注趋势:不只看当前值,也看变化趋势
- 日志分析:指标异常时结合日志定位
问题排查
- 从全局到局部:先看概览,再看详情
- 关联分析:对比多个指标的时间点
- 历史对比:与正常时段对比
接下来
深入了解可观测性的各个方面:
相关话题:
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 集成,可在仪表盘中查看日志:
- 打开 Grafana
- 进入 Explore
- 选择 VictoriaLogs 数据源
- 输入 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 中配置基于日志的告警规则。
日志最佳实践
-
保留合适时间:根据合规要求和存储空间设置保留期
-
关注关键日志:
- FATAL 和 ERROR 级别日志
- 认证相关日志
- 复制相关日志
-
日志分析:
-
日志保护:
-
日志轮转:
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
- 访问 AlertManager(
http://<ip>:9093)
- 点击 “Silences” -> “New Silence”
- 设置匹配条件和静默时间
通过命令行
# 创建静默
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: <详细描述>
告警最佳实践
-
避免告警疲劳:
- 只告警需要人工处理的问题
- 合理设置阈值和持续时间
- 使用告警分组减少通知数量
-
分级处理:
- P0 告警必须立即响应
- P1 告警在工作时间内处理
- P2/P3 告警可以批量处理
-
维护期间静默:
-
持续优化:
- 定期回顾告警历史
- 调整误报较多的规则
- 补充遗漏的告警场景