外观
Prometheus + Grafana 监控方案介绍
Prometheus + Grafana 是一套流行的开源监控解决方案,可用于监控 KingBaseES 数据库的运行状态和性能指标。Prometheus 负责数据采集和存储,Grafana 负责数据可视化和告警管理。这套方案具有高可靠性、可扩展性和灵活的配置能力,适合各种规模的 KingBaseES 数据库环境。
核心优势
- 开源免费:基于开源技术栈,无 licensing 成本
- 灵活扩展:支持动态添加监控目标,适应数据库集群扩展
- 强大的查询语言:PromQL 支持复杂的指标查询和分析
- 丰富的可视化:Grafana 提供多样化的图表类型和仪表盘设计
- 灵活的告警规则:支持多维度告警规则配置和多种通知渠道
- 高可靠性:支持 Prometheus 集群部署,避免单点故障
- 社区活跃:持续更新和完善,拥有丰富的插件生态
监控架构设计
架构组成
Prometheus + Grafana 监控 KingBaseES 的典型架构包括:
- KingBaseES 数据库:被监控对象,提供性能指标
- Exporter:指标采集组件,用于从 KingBaseES 中采集监控指标
- Prometheus:核心组件,负责指标存储、查询和告警
- Grafana:可视化组件,用于展示监控数据和配置告警
- Alertmanager:告警管理组件,负责处理和发送告警通知
数据流向
- Exporter 定期从 KingBaseES 数据库采集性能指标
- Prometheus 从 Exporter 拉取指标数据并存储
- Grafana 从 Prometheus 查询指标数据,生成可视化图表
- Prometheus 根据配置的告警规则触发告警
- Alertmanager 处理告警并通过配置的渠道发送通知
安装与配置
系统要求
| 组件 | 最低配置 | 推荐配置 |
|---|---|---|
| CPU | 4 核 | 8 核或以上 |
| 内存 | 8 GB | 16 GB 或以上 |
| 存储 | 200 GB | 1 TB 或以上(用于存储监控数据) |
| 操作系统 | CentOS 7.6+/Ubuntu 18.04+ | CentOS 7.9+/Ubuntu 20.04+ |
安装步骤
1. 安装 Prometheus
bash
# 下载 Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
# 解压安装
mkdir -p /opt/prometheus
tar -zxvf prometheus-2.45.0.linux-amd64.tar.gz -C /opt/prometheus --strip-components=1
# 创建 prometheus 用户
useradd -M -s /sbin/nologin prometheus
chown -R prometheus:prometheus /opt/prometheus
# 创建 systemd 服务文件
cat > /etc/systemd/system/prometheus.service << EOF
[Unit]
Description=Prometheus Monitoring System
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/opt/prometheus/prometheus \
--config.file=/opt/prometheus/prometheus.yml \
--storage.tsdb.path=/opt/prometheus/data \
--web.console.templates=/opt/prometheus/consoles \
--web.console.libraries=/opt/prometheus/console_libraries \
--web.listen-address=:9090
[Install]
WantedBy=multi-user.target
EOF
# 启动 Prometheus
systemctl daemon-reload
systemctl start prometheus
systemctl enable prometheus2. 安装 KingBaseES Exporter
KingBaseES 可以使用 PostgreSQL Exporter 或专用的 KingBaseES Exporter。这里使用 PostgreSQL Exporter 作为示例:
bash
# 下载 PostgreSQL Exporter
wget https://github.com/prometheus-community/postgres_exporter/releases/download/v0.15.0/postgres_exporter-0.15.0.linux-amd64.tar.gz
# 解压安装
mkdir -p /opt/postgres_exporter
tar -zxvf postgres_exporter-0.15.0.linux-amd64.tar.gz -C /opt/postgres_exporter --strip-components=1
# 创建监控用户
ksql -U system -d test << EOF
CREATE USER prometheus WITH PASSWORD 'prometheus';
GRANT pg_monitor TO prometheus;
GRANT CONNECT ON DATABASE test TO prometheus;
EOF
# 创建 .pgpass 文件
cat > /opt/postgres_exporter/.pgpass << EOF
localhost:54321:test:prometheus:prometheus
EOF
chmod 600 /opt/postgres_exporter/.pgpass
chown prometheus:prometheus /opt/postgres_exporter/.pgpass
# 创建 systemd 服务文件
cat > /etc/systemd/system/postgres_exporter.service << EOF
[Unit]
Description=PostgreSQL Exporter for KingBaseES
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
Environment=DATA_SOURCE_NAME="postgresql://prometheus:prometheus@localhost:54321/test?sslmode=disable"
ExecStart=/opt/postgres_exporter/postgres_exporter
[Install]
WantedBy=multi-user.target
EOF
# 启动 Exporter
systemctl daemon-reload
systemctl start postgres_exporter
systemctl enable postgres_exporter3. 配置 Prometheus 采集规则
编辑 Prometheus 配置文件,添加 KingBaseES 采集任务:
yaml
# /opt/prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'kingbase'
static_configs:
- targets: ['localhost:9187']
labels:
instance: 'kingbase-test'
env: 'production'
# 监控 Prometheus 自身
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']重启 Prometheus 服务:
bash
systemctl restart prometheus4. 安装 Grafana
bash
# 添加 Grafana 仓库
sudo yum install -y https://dl.grafana.com/oss/release/grafana-10.0.3-1.x86_64.rpm
# 启动 Grafana
systemctl start grafana-server
systemctl enable grafana-server
# 开放防火墙端口
firewall-cmd --add-port=3000/tcp --permanent
firewall-cmd --reload5. 配置 Grafana
- 访问 Grafana Web 界面:http://your-ip:3000
- 使用默认用户名密码(admin/admin)登录
- 添加 Prometheus 数据源:
- 点击左侧导航栏的「Configuration」→「Data sources」
- 点击「Add data source」,选择「Prometheus」
- 配置 URL:http://localhost:9090
- 点击「Save & Test」
监控指标与查询
核心监控指标
1. 连接数指标
| 指标名称 | 描述 | PromQL 示例 |
|---|---|---|
postgres_stat_database_numbackends | 数据库连接数 | postgres_stat_database_numbackends{instance="kingbase-test"} |
postgres_stat_database_xact_commit | 事务提交数 | rate(postgres_stat_database_xact_commit{instance="kingbase-test"}[5m]) |
postgres_stat_database_xact_rollback | 事务回滚数 | rate(postgres_stat_database_xact_rollback{instance="kingbase-test"}[5m]) |
2. 性能指标
| 指标名称 | 描述 | PromQL 示例 |
|---|---|---|
postgres_stat_database_blks_read | 物理块读取数 | rate(postgres_stat_database_blks_read{instance="kingbase-test"}[5m]) |
postgres_stat_database_blks_hit | 缓冲区命中数 | rate(postgres_stat_database_blks_hit{instance="kingbase-test"}[5m]) |
postgres_stat_database_tup_returned | 返回的行数 | rate(postgres_stat_database_tup_returned{instance="kingbase-test"}[5m]) |
postgres_stat_database_tup_fetched | 抓取的行数 | rate(postgres_stat_database_tup_fetched{instance="kingbase-test"}[5m]) |
postgres_stat_database_tup_inserted | 插入的行数 | rate(postgres_stat_database_tup_inserted{instance="kingbase-test"}[5m]) |
postgres_stat_database_tup_updated | 更新的行数 | rate(postgres_stat_database_tup_updated{instance="kingbase-test"}[5m]) |
postgres_stat_database_tup_deleted | 删除的行数 | rate(postgres_stat_database_tup_deleted{instance="kingbase-test"}[5m]) |
3. 锁指标
| 指标名称 | 描述 | PromQL 示例 |
|---|---|---|
postgres_locks_count | 锁数量 | postgres_locks_count{instance="kingbase-test"} |
4. 存储指标
| 指标名称 | 描述 | PromQL 示例 |
|---|---|---|
postgres_database_size_bytes | 数据库大小 | postgres_database_size_bytes{instance="kingbase-test"} |
postgres_tablespace_size_bytes | 表空间大小 | postgres_tablespace_size_bytes{instance="kingbase-test"} |
常用查询示例
1. 计算缓冲区命中率
sql
rate(postgres_stat_database_blks_hit{instance="kingbase-test"}[5m]) /
(rate(postgres_stat_database_blks_hit{instance="kingbase-test"}[5m]) +
rate(postgres_stat_database_blks_read{instance="kingbase-test"}[5m])) * 1002. 计算事务提交率
sql
rate(postgres_stat_database_xact_commit{instance="kingbase-test"}[5m]) /
(rate(postgres_stat_database_xact_commit{instance="kingbase-test"}[5m]) +
rate(postgres_stat_database_xact_rollback{instance="kingbase-test"}[5m])) * 1003. 监控表空间使用率
sql
100 * (postgres_tablespace_size_bytes{instance="kingbase-test"} /
postgres_tablespace_size_bytes{instance="kingbase-test", tablespace="pg_default"})告警规则配置
配置 Prometheus 告警规则
编辑 Prometheus 告警规则文件:
yaml
# /opt/prometheus/kingbase_alerts.yml
groups:
- name: kingbase_alerts
rules:
# 连接数告警
- alert: KingbaseTooManyConnections
expr: postgres_stat_database_numbackends{instance="kingbase-test"} > 80
for: 5m
labels:
severity: warning
annotations:
summary: "KingBaseES 连接数过高"
description: "实例 {{ $labels.instance }} 的连接数已超过 80,当前值为 {{ $value }}"
# CPU 使用率告警
- alert: KingbaseHighCpuUsage
expr: (100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "KingBaseES 服务器 CPU 使用率过高"
description: "服务器 {{ $labels.instance }} 的 CPU 使用率已超过 80%,当前值为 {{ $value }}%"
# 表空间使用率告警
- alert: KingbaseTablespaceUsageHigh
expr: 100 * (postgres_tablespace_size_bytes{instance="kingbase-test"} /
postgres_tablespace_size_bytes{instance="kingbase-test", tablespace="pg_default"}) > 85
for: 10m
labels:
severity: warning
annotations:
summary: "KingBaseES 表空间使用率过高"
description: "实例 {{ $labels.instance }} 的表空间 {{ $labels.tablespace }} 使用率已超过 85%,当前值为 {{ $value }}%"
# 慢查询告警
- alert: KingbaseSlowQueries
expr: rate(postgres_stat_database_conflicts{instance="kingbase-test"}[5m]) > 10
for: 5m
labels:
severity: warning
annotations:
summary: "KingBaseES 慢查询数量过多"
description: "实例 {{ $labels.instance }} 的慢查询数量已超过 10,当前值为 {{ $value }}"
# 主从延迟告警(适用于流复制环境)
- alert: KingbaseReplicationLag
expr: postgresql_replication_lag{instance="kingbase-test"} > 30
for: 5m
labels:
severity: critical
annotations:
summary: "KingBaseES 主从延迟过高"
description: "从库 {{ $labels.instance }} 的主从延迟已超过 30 秒,当前值为 {{ $value }} 秒"在 Prometheus 配置文件中引用告警规则:
yaml
# /opt/prometheus/prometheus.yml
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093']
rule_files:
- "kingbase_alerts.yml"安装和配置 Alertmanager
bash
# 下载 Alertmanager
wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz
# 解压安装
mkdir -p /opt/alertmanager
tar -zxvf alertmanager-0.26.0.linux-amd64.tar.gz -C /opt/alertmanager --strip-components=1
# 配置 Alertmanager
cat > /opt/alertmanager/alertmanager.yml << EOF
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'instance']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: 'admin@example.com'
from: 'alertmanager@example.com'
smarthost: 'smtp.example.com:25'
require_tls: false
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'instance']
EOF
# 创建 systemd 服务文件
cat > /etc/systemd/system/alertmanager.service << EOF
[Unit]
Description=Alertmanager for Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/opt/alertmanager/alertmanager \
--config.file=/opt/alertmanager/alertmanager.yml \
--storage.path=/opt/alertmanager/data
[Install]
WantedBy=multi-user.target
EOF
# 启动 Alertmanager
systemctl daemon-reload
systemctl start alertmanager
systemctl enable alertmanagerGrafana 可视化配置
导入预定义仪表盘
Grafana 提供了许多预定义的 PostgreSQL 仪表盘,可以直接导入使用:
- 登录 Grafana Web 控制台
- 点击左侧导航栏的「+」→「Import」
- 输入仪表盘 ID:9628(PostgreSQL Overview)或 12485(PostgreSQL Detailed)
- 选择 Prometheus 数据源
- 点击「Import」
自定义仪表盘
创建数据库概览仪表盘
- 点击左侧导航栏的「+」→「Dashboard」
- 点击「Add new panel」
- 配置面板:
- 数据源:Prometheus
- 查询:
postgres_stat_database_numbackends{instance="kingbase-test"} - 图表类型:Gauge
- 标题:数据库连接数
- 点击「Apply」保存面板
- 继续添加其他面板,如 CPU 使用率、内存使用率、表空间使用率等
慢查询分析仪表盘
- 创建新的仪表盘,命名为「KingBaseES 慢查询分析」
- 添加面板,配置查询:sql
rate(postgres_stat_database_conflicts{instance="kingbase-test"}[5m]) - 配置时间范围和刷新间隔
- 添加表格面板,显示慢查询详情
V8 R6 与 V8 R7 版本差异
指标差异
| 特性 | V8 R6 | V8 R7 |
|---|---|---|
| 指标完整性 | 基础指标 | 支持更多高级指标 |
| Exporter 支持 | 兼容 PostgreSQL Exporter | 提供专用的 KingBaseES Exporter |
| 集群指标 | 有限支持 | 全面支持集群监控指标 |
| 存储引擎指标 | 基础支持 | 支持更多存储引擎指标 |
| 性能视图 | 基础视图 | 新增性能视图,提供更丰富的指标 |
配置差异
V8 R7 专用 Exporter
V8 R7 提供了专用的 KingBaseES Exporter,支持更多 KingBaseES 特有的指标:
bash
# 下载 KingBaseES Exporter(示例,具体版本请参考官方文档)
wget https://example.com/kingbase_exporter-v1.0.0.linux-amd64.tar.gz
# 安装和配置步骤类似 PostgreSQL ExporterV8 R7 新增监控视图
V8 R7 新增了多个监控视图,提供更丰富的性能指标:
sql
-- 查看 V8 R7 新增的监控视图
SELECT viewname FROM sys_views WHERE schemaname = 'sys_stat' AND viewname NOT IN (
SELECT viewname FROM sys_views WHERE schemaname = 'sys_stat' AND viewname IN (
-- V8 R6 已有的视图
'sys_stat_activity', 'sys_stat_bgwriter', 'sys_stat_database',
'sys_stat_replication', 'sys_stat_user_tables', 'sys_stat_user_indexes'
)
);生产环境最佳实践
部署最佳实践
Prometheus 高可用:
- 部署 Prometheus 集群,使用 Thanos 或 Cortex 实现长期存储
- 配置 Prometheus 数据持久化,避免数据丢失
Exporter 优化:
- 为每个 KingBaseES 实例部署独立的 Exporter
- 配置合理的采集间隔,平衡监控精度和资源消耗
- 为 Exporter 创建专用的监控用户,限制权限
存储优化:
- 配置 Prometheus 数据保留时间,避免存储过大
- 使用 SSD 存储提高 Prometheus 查询性能
- 考虑使用远程存储方案,如 Thanos 或 Cortex
监控策略最佳实践
分层监控:
- 基础监控:CPU、内存、磁盘、网络
- 数据库监控:连接数、活跃会话、锁等待
- 业务监控:关键业务 SQL 性能
告警分级:
- 紧急:直接影响业务运行的问题(如实例宕机)
- 警告:可能影响业务的问题(如 CPU 使用率过高)
- 提示:需要关注的问题(如表空间使用率增长过快)
告警抑制:
- 配置合理的告警抑制规则,避免告警风暴
- 设置合适的告警持续时间,减少误报
- 配置告警分组,避免重复告警
定期Review:
- 定期Review监控指标和告警规则
- 根据业务变化调整监控策略
- 定期清理无用的监控指标和告警规则
安全最佳实践
访问控制:
- 为 Grafana 配置强密码和多因素认证
- 限制 Prometheus 和 Grafana 的访问 IP
- 为不同用户分配不同的 Grafana 权限
数据加密:
- 配置 HTTPS 访问 Grafana 和 Prometheus
- 加密 Exporter 与 Prometheus 之间的通信
- 保护监控数据的存储安全
审计日志:
- 启用 Grafana 审计日志
- 监控 Prometheus 和 Exporter 的日志
- 定期Review访问日志,发现异常访问
常见问题(FAQ)
安装与配置
Q1:Exporter 无法连接到 KingBaseES 数据库,怎么办?
A1:
- 检查 Exporter 配置的数据库连接信息是否正确
- 检查 KingBaseES 数据库是否允许远程连接
- 检查防火墙设置,确保 Exporter 可以访问数据库端口
- 检查监控用户的权限是否正确
- 查看 Exporter 日志,排查具体错误信息
Q2:Prometheus 无法从 Exporter 拉取数据,怎么办?
A2:
- 检查 Prometheus 配置的 Exporter 地址和端口是否正确
- 检查 Exporter 是否正常运行
- 检查防火墙设置,确保 Prometheus 可以访问 Exporter 端口
- 查看 Prometheus 日志,排查具体错误信息
- 在浏览器中直接访问 Exporter 地址,检查是否能获取指标数据
监控与告警
Q3:监控数据延迟严重,如何解决?
A3:
- 检查 Prometheus 采集间隔设置,适当调整采集频率
- 检查网络传输情况,确保网络带宽充足
- 检查 Prometheus 服务器资源使用情况,如 CPU、内存使用率过高,考虑升级硬件
- 对于大规模部署,考虑使用 Prometheus 集群或增加 Prometheus 实例
Q4:告警误报频繁,如何优化?
A4:
- 调整告警规则的阈值和持续时间
- 配置合理的告警抑制规则
- 增加告警分组,避免重复告警
- 定期Review告警规则,移除不必要的告警
- 考虑使用更精确的告警指标
性能与优化
Q5:Prometheus 占用资源过高,如何优化?
A5:
- 减少监控指标数量,只保留关键指标
- 增加 Prometheus 数据保留时间间隔
- 优化 Prometheus 查询,避免复杂查询
- 升级 Prometheus 服务器硬件配置
- 考虑使用 Prometheus 集群或分片
Q6:如何监控 KingBaseES 集群?
A6:
- 为每个集群节点部署 Exporter
- 配置 Prometheus 采集所有节点的指标
- 创建集群专用的告警规则,如主从延迟、同步状态等
- 使用 Grafana 仪表盘展示集群整体状态
- 考虑使用 KingBaseES 专用的集群监控工具
版本升级
Q7:从 V8 R6 升级到 V8 R7 后,监控需要做哪些调整?
A7:
- 考虑升级到 KingBaseES 专用的 Exporter
- 重新配置监控指标,添加 V8 R7 新增的指标
- 更新告警规则,适配 V8 R7 的指标变化
- 重新设计 Grafana 仪表盘,展示新增的指标
Q8:如何迁移 Prometheus 数据?
A8:
- 停止 Prometheus 服务
- 备份 Prometheus 数据目录
- 部署新的 Prometheus 实例
- 迁移数据目录到新实例
- 启动新的 Prometheus 实例,验证数据完整性
总结
Prometheus + Grafana 是一套强大的开源监控解决方案,能够有效监控 KingBaseES 数据库的运行状态和性能指标。通过合理的架构设计、安装配置和监控策略,可以实现对 KingBaseES 数据库的全方位监控,及时发现和解决问题,保障数据库系统的稳定运行。
在生产环境中,建议遵循最佳实践,配置高可用的 Prometheus 集群,优化监控策略和告警规则,定期Review监控数据和告警情况,根据业务变化调整监控方案。同时,关注 KingBaseES 版本变化,及时更新监控配置,充分利用新版本提供的监控功能。
