一、背景简介

生产环境的MySQL监控面临着部署复杂、标签不统一、管理困难等问题。传统方式中每个MySQL实例都需要单独部署一个exporter,部署方式繁琐,采集的指标标签不统一,无法在监控图表上快速检索查看。

核心解决问题

  • 简化MySQL监控的部署流程
  • 统一监控指标标签格式
  • 支持灵活的多实例监控管理
  • 提供安全的认证信息存储

本方案采用Helm部署mysql-exporter实现MySQL监控采集,可以灵活增加mysql监控实例,大大简化了运维管理复杂度。

二、部署文件准备

2.1. 必需文件清单

文件类型 文件名称 说明
Helm Charts prometheus-mysql-exporter-2.10.0.tgz prometheus-mysql-exporter chart部署包
配置文件 mysql-exporter-values.yaml mysql-exporter配置文件

版本说明

  • 推荐使用prometheus-mysql-exporter 2.10.0或更新版本
  • Chart包包含了完整的Kubernetes资源定义
  • values.yaml文件用于定制化配置参数

2.2. 环境要求

  • Kubernetes集群环境
  • Helm 3.x已安装配置
  • Prometheus Operator已部署
  • 具备集群管理权限

三、配置步骤

3.1. MySQL监控账号创建

MySQL监控账号用于采集MySQL监控数据,需要具备特定的权限以确保能够获取完整的监控指标。

(1)创建监控用户

CREATE USER 'exporter'@'%' IDENTIFIED BY 'your-secure-password' WITH MAX_USER_CONNECTIONS 3;

(2)授权必要权限

GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
FLUSH PRIVILEGES;

安全配置要点

  • 'exporter'@'%'中的%调整为生产环境K8s的具体IP段
  • 设置MAX_USER_CONNECTIONS 3避免监控连接过多导致数据库过载
  • 使用强密码并定期轮换
  • 仅授权必要的最小权限集

(3)权限说明

权限类型 用途说明
PROCESS 查看进程列表,获取连接状态信息
REPLICATION CLIENT 获取主从复制状态信息
SELECT 查询performance_schema等系统表

3.2. 配置文件修改

修改mysql-exporter-values.yaml配置文件中的关键配置项:

(1)多目标配置结构

serviceMonitor:
  enabled: true
  additionalLabels: {}
  jobLabel: ""
  targetLabels: []
  podTargetLabels: []
  metricRelabelings: []
  relabelings: []
  
  # 启用多目标采集
  multipleTarget:
    enabled: true
    targets:
    - endpoint: 172.16.1.15
      name: app-db-write-master
      port: 3306
      user: exporter
      password: your-secure-password
    - endpoint: 172.16.1.17
      name: app-db-backup-master
      port: 3306
      user: exporter
      password: your-secure-password
      
  # 共享认证配置(可选)
  sharedSecret:
    enabled: false
    name: ""

(2)配置参数详解

配置项 示例值 说明
endpoint 172.16.1.15 MySQL实例的IP地址或域名
注意:使用域名配置多个IP时需使用具体IP避免数据混乱
name app-db-write-master 节点标识名称,用于监控页面筛选
命名规范:平台-用途-角色
port 3306 MySQL端口,默认3306,可选配置
user exporter 监控账号用户名
password your-secure-password 监控账号密码
注意:避免使用#等特殊字符

(3)命名规范示例

标准命名格式平台-地区-用途-角色[-附加信息]

示例说明

  • app-db-write-master:应用数据库写入主节点
  • app-db-backup-master:应用数据库备份主节点
  • app-db-write-master-slave:应用数据库写入主节点的从节点
  • app-cache-backup-master:应用缓存备份主节点
  • app-cache-backup-slave:应用缓存备份从节点

命名约束

  • 不能包含.等特殊字符
  • 建议使用英文字母和短横线-
  • 保持简洁明了,便于识别

四、部署实施

4.1. 部署命令

在具备Helm环境的生产服务器上执行部署:

# 部署MySQL监控
helm install prometheus-mysql-exporter \
  prometheus-mysql-exporter-2.10.0.tgz \
  --version 2.10.0 \
  -n monitoring \
  -f mysql-exporter-values.yaml

4.2. 部署验证

(1)检查Pod状态

# 查看Pod状态
kubectl get pods -n monitoring | grep mysql-exporter

# 查看Pod详细信息
kubectl describe pod <mysql-exporter-pod-name> -n monitoring

(2)验证Service和ServiceMonitor

# 查看Service
kubectl get service -n monitoring | grep mysql-exporter

# 查看ServiceMonitor
kubectl get servicemonitor -n monitoring | grep mysql-exporter

(3)验证指标采集

# 端口转发测试
kubectl port-forward service/prometheus-mysql-exporter 9104:9104 -n monitoring

# 访问指标端点
curl http://localhost:9104/metrics

4.3. 安全清理

重要提醒:部署完成后,为避免配置文件中数据库监控账号及密码泄漏,应立即删除本地配置文件:

# 删除本地配置文件
rm mysql-exporter-values.yaml

后续查看配置方式

# 通过Helm查看当前配置
helm get values prometheus-mysql-exporter -n monitoring

五、监控配置管理

5.1. 添加新的MySQL实例

(1)获取当前配置

# 导出当前配置
helm get values prometheus-mysql-exporter -n monitoring > current-values.yaml

(2)修改配置添加新实例

# 在targets中添加新的MySQL实例
targets:
- endpoint: 172.16.1.18
  name: app-cluster-write-master
  user: exporter
  password: your-secure-password

(3)更新部署

# 更新Helm部署
helm upgrade prometheus-mysql-exporter \
  prometheus-mysql-exporter-2.10.0.tgz \
  --version 2.10.0 \
  -n monitoring \
  -f current-values.yaml
  
# 清理临时配置文件
rm current-values.yaml

5.2. 移除MySQL实例

# 导出配置并编辑
helm get values prometheus-mysql-exporter -n monitoring > temp-values.yaml

# 编辑文件移除不需要的targets配置
vim temp-values.yaml

# 应用更新
helm upgrade prometheus-mysql-exporter \
  prometheus-mysql-exporter-2.10.0.tgz \
  --version 2.10.0 \
  -n monitoring \
  -f temp-values.yaml

# 清理文件
rm temp-values.yaml

5.3. 完全卸载

# 卸载Helm部署
helm uninstall prometheus-mysql-exporter -n monitoring

# 清理相关Secret(如果需要)
kubectl delete secret prometheus-mysql-exporter -n monitoring

六、监控指标说明

6.1. 核心MySQL指标

连接指标

  • mysql_global_status_threads_connected:当前连接数
  • mysql_global_status_threads_running:活跃连接数
  • mysql_global_status_max_used_connections:历史最大连接数

性能指标

  • mysql_global_status_queries:查询总数
  • mysql_global_status_slow_queries:慢查询数量
  • mysql_global_status_innodb_buffer_pool_reads:缓冲池读取次数

复制指标

  • mysql_slave_lag_seconds:主从延迟时间
  • mysql_slave_sql_running:SQL线程运行状态
  • mysql_slave_io_running:IO线程运行状态

6.2. 告警规则配置

groups:
- name: mysql_alerts
  rules:
  - alert: MySQLDown
    expr: mysql_up == 0
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "MySQL实例不可用"
      description: "{{ $labels.instance }} MySQL实例已下线"
      
  - alert: MySQLSlaveLag
    expr: mysql_slave_lag_seconds > 300
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: "MySQL主从延迟过高"
      description: "{{ $labels.instance }} 主从延迟 {{ $value }} 秒"
      
  - alert: MySQLConnectionsHigh
    expr: mysql_global_status_threads_connected / mysql_global_variables_max_connections > 0.8
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: "MySQL连接数过高"
      description: "{{ $labels.instance }} 连接使用率超过80%"

七、故障排查

7.1. 常见问题

部署失败

  • 检查Helm Chart版本兼容性
  • 验证namespace是否存在
  • 确认RBAC权限配置

连接失败

  • 验证MySQL账号权限
  • 检查网络连通性
  • 确认防火墙规则

指标缺失

  • 检查ServiceMonitor配置
  • 验证Prometheus配置
  • 查看exporter日志

7.2. 日志排查

# 查看exporter日志
kubectl logs -f deployment/prometheus-mysql-exporter -n monitoring

# 查看Prometheus日志
kubectl logs -f prometheus-prometheus-kube-prometheus-prometheus-0 -n monitoring

# 检查ServiceMonitor状态
kubectl describe servicemonitor prometheus-mysql-exporter -n monitoring

总结

通过Helm部署MySQL监控方案具有以下优势:

  1. 简化部署:一次性配置多个MySQL实例监控
  2. 统一管理:集中化的配置管理和版本控制
  3. 安全存储:敏感信息通过Kubernetes Secret安全存储
  4. 灵活扩展:支持动态添加和移除监控实例
  5. 标准化:统一的命名规范和标签体系

本方案大大降低了MySQL监控的运维复杂度,提升了监控系统的可维护性和可扩展性。

参考文档