Skip to content

MySQL 企业级监控平台集成

监控平台集成概述

企业级监控平台能够提供更全面、可视化的MySQL监控,支持告警、报表和历史数据分析。本文将介绍主流监控平台与MySQL的集成方法。

版本差异

版本特性MySQL 5.6MySQL 5.7MySQL 8.0
Performance Schema⚠️ 部分支持✅ 完整支持✅ 完整支持
sys schema
监控指标数量较少中等丰富
JSON 格式日志
GTID 复制监控⚠️ 实验性
事务锁监控基础增强全面
自动扩展 undo 表空间

Prometheus + Grafana 集成

集成架构

Prometheus 通过 Exporter 采集 MySQL 指标,Grafana 作为可视化层展示指标和告警。

安装 MySQL Exporter

下载和安装

bash
# 下载最新版本的 MySQL Exporter
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.14.0/mysqld_exporter-0.14.0.linux-amd64.tar.gz

# 解压
mkdir -p /opt/mysqld_exporter
tar -xzf mysqld_exporter-0.14.0.linux-amd64.tar.gz -C /opt/mysqld_exporter --strip-components=1

# 创建用户
useradd -rs /bin/false mysqld_exporter

# 设置权限
chown -R mysqld_exporter:mysqld_exporter /opt/mysqld_exporter

配置 MySQL 用户

创建用于监控的 MySQL 用户:

sql
CREATE USER 'mysqld_exporter'@'localhost' IDENTIFIED BY 'ExporterPassword1!' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'mysqld_exporter'@'localhost';
FLUSH PRIVILEGES;

创建配置文件

bash
cat > /etc/.mysqld_exporter.cnf <<EOF
[client]
user=mysqld_exporter
password=ExporterPassword1!
host=localhost
EOF

chmod 600 /etc/.mysqld_exporter.cnf
chown mysqld_exporter:mysqld_exporter /etc/.mysqld_exporter.cnf

创建系统服务

bash
cat > /etc/systemd/system/mysqld_exporter.service <<EOF
[Unit]
Description=MySQL Exporter for Prometheus
After=network.target

[Service]
Type=simple
User=mysqld_exporter
Group=mysqld_exporter
ExecStart=/opt/mysqld_exporter/mysqld_exporter --config.my-cnf=/etc/.mysqld_exporter.cnf
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

# 启动服务
systemctl daemon-reload
systemctl enable --now mysqld_exporter

# 验证服务
curl http://localhost:9104/metrics | grep mysql_up

配置 Prometheus

添加 MySQL 目标

编辑 Prometheus 配置文件:

yaml
scrape_configs:
  - job_name: 'mysql'
    static_configs:
      - targets: ['localhost:9104']
    scrape_interval: 1s
    scrape_timeout: 10s

重启 Prometheus

bash
systemctl restart prometheus

配置 Grafana 面板

导入 MySQL 面板

  1. 登录 Grafana
  2. 点击左侧菜单的 "+", 选择 "Import"
  3. 输入面板 ID: 7362 (MySQL Overview)
  4. 选择 Prometheus 数据源
  5. 点击 "Import"

常用 MySQL Grafana 面板

面板 ID名称描述
7362MySQL OverviewMySQL 概览面板
14057MySQL Details详细的 MySQL 指标
12633MySQL InnoDB MetricsInnoDB 专用指标
14102MySQL Replication主从复制指标

Zabbix 集成

集成架构

Zabbix 通过 Agent 或专用模板采集 MySQL 指标。

配置 Zabbix Agent

安装 Zabbix Agent

bash
# CentOS/RHEL
yum install zabbix-agent

# Ubuntu/Debian
apt install zabbix-agent

配置 MySQL 监控项

编辑 Zabbix Agent 配置文件 /etc/zabbix/zabbix_agentd.conf,添加:

ini
# 启用 UserParameter
EnableRemoteCommands=1

# 添加 MySQL 监控参数
UserParameter=mysql.ping,mysqladmin -u zabbix -pZabbixPassword1! ping | grep -c alive
UserParameter=mysql.version,mysql -u zabbix -pZabbixPassword1! -V
UserParameter=mysql.status[*],mysql -u zabbix -pZabbixPassword1! -e "SHOW GLOBAL STATUS LIKE '$1'" | grep $1 | awk '{print $$2}'
UserParameter=mysql.variables[*],mysql -u zabbix -pZabbixPassword1! -e "SHOW GLOBAL VARIABLES LIKE '$1'" | grep $1 | awk '{print $$2}'

创建 Zabbix MySQL 用户

sql
CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'ZabbixPassword1!' WITH MAX_USER_CONNECTIONS 5;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'zabbix'@'localhost';
FLUSH PRIVILEGES;

重启 Zabbix Agent

bash
systemctl restart zabbix-agent

导入 Zabbix MySQL 模板

  1. 登录 Zabbix Web 界面
  2. 进入 "Configuration" > "Templates"
  3. 点击 "Import"
  4. 选择官方 MySQL 模板 (Template DB MySQL)
  5. 关联到目标主机

Percona Monitoring and Management (PMM)

PMM 概述

PMM 是专为 MySQL 优化的开源监控平台,由 Percona 开发。

安装 PMM Server

使用 Docker 安装 PMM Server:

bash
docker run -d \
  --restart always \
  --publish 443:443 \
  --name pmm-server \
  percona/pmm-server:latest

安装 PMM Client

安装客户端

bash
# CentOS/RHEL
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
yum install pmm2-client

# Ubuntu/Debian
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
apt update
apt install pmm2-client

注册客户端

bash
pmm-admin config --server-insecure-tls --server-url=https://admin:admin@<pmm-server-ip>:443 <client-name> <client-ip>

添加 MySQL 实例

添加 MySQL 监控

bash
# 添加 MySQL 实例
pmm-admin add mysql --username=pmm --password=PmmPassword1! --query-source=perfschema

# 或使用 socket 连接
pmm-admin add mysql --username=pmm --password=PmmPassword1! --socket=/var/lib/mysql/mysql.sock --query-source=perfschema

创建 PMM MySQL 用户

sql
CREATE USER 'pmm'@'localhost' IDENTIFIED BY 'PmmPassword1!' WITH MAX_USER_CONNECTIONS 10;
GRANT SELECT, PROCESS, SUPER, REPLICATION CLIENT, RELOAD ON *.* TO 'pmm'@'localhost';
FLUSH PRIVILEGES;

访问 PMM Web 界面

浏览器访问 https://<pmm-server-ip>,使用默认用户名密码 admin/admin 登录。

告警策略配置

Prometheus 告警规则

配置告警规则

编辑 Prometheus 告警规则文件:

yaml
groups:
- name: mysql_alerts
  rules:
  - alert: MySQLDown
    expr: mysql_up == 0
    for: 30s
    labels:
      severity: critical
    annotations:
      summary: MySQL is down
      description: MySQL instance {{ $labels.instance }} has been down for more than 30 seconds.

  - alert: MySQLHighConnectionUsage
    expr: mysql_global_status_threads_connected / mysql_global_variables_max_connections * 100 > 80
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: High connection usage
      description: MySQL instance {{ $labels.instance }} has {{ $value }}% connection usage.

  - alert: MySQLSlowQueries
    expr: rate(mysql_global_status_slow_queries[5m]) > 10
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: High number of slow queries
      description: MySQL instance {{ $labels.instance }} has {{ $value }} slow queries per second.

  - alert: MySQLReplicationLag
    expr: mysql_slave_status_seconds_behind_master > 30
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: MySQL replication lag
      description: MySQL slave {{ $labels.instance }} is {{ $value }} seconds behind master.

配置 Alertmanager

编辑 Alertmanager 配置文件 /etc/alertmanager/alertmanager.yml

yaml
global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'email'

receivers:
- name: 'email'
  email_configs:
  - to: 'alerts@example.com'
    from: 'prometheus@example.com'
    smarthost: 'smtp.example.com:587'
    auth_username: 'prometheus'
    auth_password: 'SmtpPassword1!'
    auth_identity: 'prometheus@example.com'

Zabbix 告警配置

创建告警媒介

  1. 进入 "Administration" > "Media types"
  2. 点击 "Create media type"
  3. 选择类型(Email、SMS 等)
  4. 配置相应参数

配置用户告警媒介

  1. 进入 "Administration" > "Users"
  2. 选择用户,点击 "Media"
  3. 点击 "Add"
  4. 选择媒介类型,配置收件人

配置触发器

可以使用模板自带的触发器,或自定义触发器:

  1. 进入 "Configuration" > "Hosts"
  2. 选择主机,点击 "Triggers"
  3. 点击 "Create trigger"
  4. 配置触发器表达式,例如:
    • 连接数高:{MySQL:mysql.status[Threads_connected].last()} / {MySQL:mysql.variables[max_connections].last()} * 100 > 80
    • 慢查询:{MySQL:mysql.status[Slow_queries].delta(5m)} > 10

监控平台最佳实践

监控数据采集

  • 核心指标(连接数、锁等待、复制延迟):1 秒采集一次
  • 资源指标(CPU、内存、磁盘 I/O):5 秒采集一次
  • 日志指标:30 秒采集一次
  • 慢查询:1 分钟采集一次

告警分级

级别描述示例
P1紧急,数据库不可用MySQL 服务停止,主从复制中断
P2高优先级,影响部分业务连接数达到 90%,慢查询突增
P3中优先级,需要关注缓冲池命中率下降,复制延迟增加
P4低优先级,建议优化临时表使用增加,锁等待次数增加

告警通知

  • 确保告警通知的多样性(邮件、短信、即时通讯工具)
  • 配置告警升级策略,长时间未处理的告警自动升级
  • 配置告警抑制,避免重复告警

监控数据保留

  • 原始数据:保留 7-30 天
  • 聚合数据:保留 1 年
  • 历史趋势数据:保留 3-5 年

集成验证

Prometheus 验证

bash
# 检查 Prometheus 目标
curl http://localhost:9090/api/v1/targets

# 查询 MySQL 指标
curl -g 'http://localhost:9090/api/v1/query?query=mysql_up'

Zabbix 验证

  1. 进入 "Monitoring" > "Latest data"
  2. 选择 MySQL 主机,查看采集的指标
  3. 进入 "Monitoring" > "Graphs",查看指标趋势

PMM 验证

  1. 访问 PMM Web 界面
  2. 进入 "Dashboards",查看 MySQL 相关面板
  3. 进入 "Metrics Explorer",查询 MySQL 指标

常见问题及解决方案

问题解决方案
Exporter 无法连接 MySQL检查 MySQL 用户密码和权限,确保网络可达
Prometheus 无法采集指标检查 Exporter 服务状态,验证防火墙设置
Grafana 面板无数据检查 Prometheus 数据源配置,验证指标名称
Zabbix 无法采集指标检查 Zabbix Agent 状态,验证 UserParameter 配置
PMM 无法添加 MySQL 实例检查 PMM Client 与 Server 连接,验证 MySQL 用户权限

总结

企业级监控平台集成是 MySQL 运维的重要组成部分,能够提供全面的可视化监控和告警功能。通过本文的介绍,应该掌握了 Prometheus + Grafana、Zabbix 和 PMM 三种主流监控平台的集成方法。

建议根据企业规模和需求选择合适的监控平台,并定期优化监控指标和告警策略,确保数据库的稳定运行。