Skip to content

Prometheus + Grafana 监控方案介绍

Prometheus + Grafana 是一套流行的开源监控解决方案,可用于监控 KingBaseES 数据库的运行状态和性能指标。Prometheus 负责数据采集和存储,Grafana 负责数据可视化和告警管理。这套方案具有高可靠性、可扩展性和灵活的配置能力,适合各种规模的 KingBaseES 数据库环境。

核心优势

  • 开源免费:基于开源技术栈,无 licensing 成本
  • 灵活扩展:支持动态添加监控目标,适应数据库集群扩展
  • 强大的查询语言:PromQL 支持复杂的指标查询和分析
  • 丰富的可视化:Grafana 提供多样化的图表类型和仪表盘设计
  • 灵活的告警规则:支持多维度告警规则配置和多种通知渠道
  • 高可靠性:支持 Prometheus 集群部署,避免单点故障
  • 社区活跃:持续更新和完善,拥有丰富的插件生态

监控架构设计

架构组成

Prometheus + Grafana 监控 KingBaseES 的典型架构包括:

  • KingBaseES 数据库:被监控对象,提供性能指标
  • Exporter:指标采集组件,用于从 KingBaseES 中采集监控指标
  • Prometheus:核心组件,负责指标存储、查询和告警
  • Grafana:可视化组件,用于展示监控数据和配置告警
  • Alertmanager:告警管理组件,负责处理和发送告警通知

数据流向

  1. Exporter 定期从 KingBaseES 数据库采集性能指标
  2. Prometheus 从 Exporter 拉取指标数据并存储
  3. Grafana 从 Prometheus 查询指标数据,生成可视化图表
  4. Prometheus 根据配置的告警规则触发告警
  5. Alertmanager 处理告警并通过配置的渠道发送通知

安装与配置

系统要求

组件最低配置推荐配置
CPU4 核8 核或以上
内存8 GB16 GB 或以上
存储200 GB1 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 prometheus

2. 安装 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_exporter

3. 配置 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 prometheus

4. 安装 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 --reload

5. 配置 Grafana

  1. 访问 Grafana Web 界面:http://your-ip:3000
  2. 使用默认用户名密码(admin/admin)登录
  3. 添加 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])) * 100

2. 计算事务提交率

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])) * 100

3. 监控表空间使用率

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 alertmanager

Grafana 可视化配置

导入预定义仪表盘

Grafana 提供了许多预定义的 PostgreSQL 仪表盘,可以直接导入使用:

  1. 登录 Grafana Web 控制台
  2. 点击左侧导航栏的「+」→「Import」
  3. 输入仪表盘 ID:9628(PostgreSQL Overview)或 12485(PostgreSQL Detailed)
  4. 选择 Prometheus 数据源
  5. 点击「Import」

自定义仪表盘

创建数据库概览仪表盘

  1. 点击左侧导航栏的「+」→「Dashboard」
  2. 点击「Add new panel」
  3. 配置面板:
    • 数据源:Prometheus
    • 查询:postgres_stat_database_numbackends{instance="kingbase-test"}
    • 图表类型:Gauge
    • 标题:数据库连接数
  4. 点击「Apply」保存面板
  5. 继续添加其他面板,如 CPU 使用率、内存使用率、表空间使用率等

慢查询分析仪表盘

  1. 创建新的仪表盘,命名为「KingBaseES 慢查询分析」
  2. 添加面板,配置查询:
    sql
    rate(postgres_stat_database_conflicts{instance="kingbase-test"}[5m])
  3. 配置时间范围和刷新间隔
  4. 添加表格面板,显示慢查询详情

V8 R6 与 V8 R7 版本差异

指标差异

特性V8 R6V8 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 Exporter

V8 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'
  )
);

生产环境最佳实践

部署最佳实践

  1. Prometheus 高可用

    • 部署 Prometheus 集群,使用 Thanos 或 Cortex 实现长期存储
    • 配置 Prometheus 数据持久化,避免数据丢失
  2. Exporter 优化

    • 为每个 KingBaseES 实例部署独立的 Exporter
    • 配置合理的采集间隔,平衡监控精度和资源消耗
    • 为 Exporter 创建专用的监控用户,限制权限
  3. 存储优化

    • 配置 Prometheus 数据保留时间,避免存储过大
    • 使用 SSD 存储提高 Prometheus 查询性能
    • 考虑使用远程存储方案,如 Thanos 或 Cortex

监控策略最佳实践

  1. 分层监控

    • 基础监控:CPU、内存、磁盘、网络
    • 数据库监控:连接数、活跃会话、锁等待
    • 业务监控:关键业务 SQL 性能
  2. 告警分级

    • 紧急:直接影响业务运行的问题(如实例宕机)
    • 警告:可能影响业务的问题(如 CPU 使用率过高)
    • 提示:需要关注的问题(如表空间使用率增长过快)
  3. 告警抑制

    • 配置合理的告警抑制规则,避免告警风暴
    • 设置合适的告警持续时间,减少误报
    • 配置告警分组,避免重复告警
  4. 定期Review

    • 定期Review监控指标和告警规则
    • 根据业务变化调整监控策略
    • 定期清理无用的监控指标和告警规则

安全最佳实践

  1. 访问控制

    • 为 Grafana 配置强密码和多因素认证
    • 限制 Prometheus 和 Grafana 的访问 IP
    • 为不同用户分配不同的 Grafana 权限
  2. 数据加密

    • 配置 HTTPS 访问 Grafana 和 Prometheus
    • 加密 Exporter 与 Prometheus 之间的通信
    • 保护监控数据的存储安全
  3. 审计日志

    • 启用 Grafana 审计日志
    • 监控 Prometheus 和 Exporter 的日志
    • 定期Review访问日志,发现异常访问

常见问题(FAQ)

安装与配置

Q1:Exporter 无法连接到 KingBaseES 数据库,怎么办?

A1:

  1. 检查 Exporter 配置的数据库连接信息是否正确
  2. 检查 KingBaseES 数据库是否允许远程连接
  3. 检查防火墙设置,确保 Exporter 可以访问数据库端口
  4. 检查监控用户的权限是否正确
  5. 查看 Exporter 日志,排查具体错误信息

Q2:Prometheus 无法从 Exporter 拉取数据,怎么办?

A2:

  1. 检查 Prometheus 配置的 Exporter 地址和端口是否正确
  2. 检查 Exporter 是否正常运行
  3. 检查防火墙设置,确保 Prometheus 可以访问 Exporter 端口
  4. 查看 Prometheus 日志,排查具体错误信息
  5. 在浏览器中直接访问 Exporter 地址,检查是否能获取指标数据

监控与告警

Q3:监控数据延迟严重,如何解决?

A3:

  1. 检查 Prometheus 采集间隔设置,适当调整采集频率
  2. 检查网络传输情况,确保网络带宽充足
  3. 检查 Prometheus 服务器资源使用情况,如 CPU、内存使用率过高,考虑升级硬件
  4. 对于大规模部署,考虑使用 Prometheus 集群或增加 Prometheus 实例

Q4:告警误报频繁,如何优化?

A4:

  1. 调整告警规则的阈值和持续时间
  2. 配置合理的告警抑制规则
  3. 增加告警分组,避免重复告警
  4. 定期Review告警规则,移除不必要的告警
  5. 考虑使用更精确的告警指标

性能与优化

Q5:Prometheus 占用资源过高,如何优化?

A5:

  1. 减少监控指标数量,只保留关键指标
  2. 增加 Prometheus 数据保留时间间隔
  3. 优化 Prometheus 查询,避免复杂查询
  4. 升级 Prometheus 服务器硬件配置
  5. 考虑使用 Prometheus 集群或分片

Q6:如何监控 KingBaseES 集群?

A6:

  1. 为每个集群节点部署 Exporter
  2. 配置 Prometheus 采集所有节点的指标
  3. 创建集群专用的告警规则,如主从延迟、同步状态等
  4. 使用 Grafana 仪表盘展示集群整体状态
  5. 考虑使用 KingBaseES 专用的集群监控工具

版本升级

Q7:从 V8 R6 升级到 V8 R7 后,监控需要做哪些调整?

A7:

  1. 考虑升级到 KingBaseES 专用的 Exporter
  2. 重新配置监控指标,添加 V8 R7 新增的指标
  3. 更新告警规则,适配 V8 R7 的指标变化
  4. 重新设计 Grafana 仪表盘,展示新增的指标

Q8:如何迁移 Prometheus 数据?

A8:

  1. 停止 Prometheus 服务
  2. 备份 Prometheus 数据目录
  3. 部署新的 Prometheus 实例
  4. 迁移数据目录到新实例
  5. 启动新的 Prometheus 实例,验证数据完整性

总结

Prometheus + Grafana 是一套强大的开源监控解决方案,能够有效监控 KingBaseES 数据库的运行状态和性能指标。通过合理的架构设计、安装配置和监控策略,可以实现对 KingBaseES 数据库的全方位监控,及时发现和解决问题,保障数据库系统的稳定运行。

在生产环境中,建议遵循最佳实践,配置高可用的 Prometheus 集群,优化监控策略和告警规则,定期Review监控数据和告警情况,根据业务变化调整监控方案。同时,关注 KingBaseES 版本变化,及时更新监控配置,充分利用新版本提供的监控功能。