外观
MySQL 企业级监控平台集成
监控平台集成概述
企业级监控平台能够提供更全面、可视化的MySQL监控,支持告警、报表和历史数据分析。本文将介绍主流监控平台与MySQL的集成方法。
版本差异
| 版本特性 | MySQL 5.6 | MySQL 5.7 | MySQL 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 面板
- 登录 Grafana
- 点击左侧菜单的 "+", 选择 "Import"
- 输入面板 ID: 7362 (MySQL Overview)
- 选择 Prometheus 数据源
- 点击 "Import"
常用 MySQL Grafana 面板
| 面板 ID | 名称 | 描述 |
|---|---|---|
| 7362 | MySQL Overview | MySQL 概览面板 |
| 14057 | MySQL Details | 详细的 MySQL 指标 |
| 12633 | MySQL InnoDB Metrics | InnoDB 专用指标 |
| 14102 | MySQL 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 模板
- 登录 Zabbix Web 界面
- 进入 "Configuration" > "Templates"
- 点击 "Import"
- 选择官方 MySQL 模板 (Template DB MySQL)
- 关联到目标主机
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 告警配置
创建告警媒介
- 进入 "Administration" > "Media types"
- 点击 "Create media type"
- 选择类型(Email、SMS 等)
- 配置相应参数
配置用户告警媒介
- 进入 "Administration" > "Users"
- 选择用户,点击 "Media"
- 点击 "Add"
- 选择媒介类型,配置收件人
配置触发器
可以使用模板自带的触发器,或自定义触发器:
- 进入 "Configuration" > "Hosts"
- 选择主机,点击 "Triggers"
- 点击 "Create trigger"
- 配置触发器表达式,例如:
- 连接数高:
{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 验证
- 进入 "Monitoring" > "Latest data"
- 选择 MySQL 主机,查看采集的指标
- 进入 "Monitoring" > "Graphs",查看指标趋势
PMM 验证
- 访问 PMM Web 界面
- 进入 "Dashboards",查看 MySQL 相关面板
- 进入 "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 三种主流监控平台的集成方法。
建议根据企业规模和需求选择合适的监控平台,并定期优化监控指标和告警策略,确保数据库的稳定运行。
