MySQL Exporter 集成 Prometheus 监控实战指南
实战背景
在现代云原生监控体系中,数据库作为核心数据存储组件,其性能和稳定性直接影响业务系统的运行。通过 Prometheus 和 MySQL Exporter 的组合,我们可以实现对 MySQL 数据库关键指标的实时监控和告警,确保系统稳定运行。
一、技术架构概览
MySQL Exporter 是一个官方提供的 Prometheus exporter,用于从 MySQL 服务器收集指标并将其暴露给 Prometheus 服务器进行抓取。结合 ServiceMonitor(Prometheus Operator 的自定义资源),可以实现自动化的监控配置。
1.1 核心组件
- MySQL Exporter:负责连接 MySQL 实例并收集指标
- Service:为 MySQL Exporter 提供网络访问入口
- ServiceMonitor:告诉 Prometheus Operator 需要监控哪些服务
- ConfigMap:存储 MySQL 连接配置
二、部署配置详解

2.1 基础部署配置
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-exporter # 部署名称
spec:
template:
spec:
containers:
- name: mysql-exporter # 容器名称
image: mysql-exporter-image # 镜像地址,后续会被kustomize替换
ports:
- name: http-9104 # 暴露端口名称
containerPort: 9104 # 容器端口
protocol: TCP # 协议类型
resources:
limits:
cpu: '1' # CPU使用上限
memory: 2000Mi # 内存使用上限
requests:
cpu: 100m # CPU请求
memory: 200Mi # 内存请求
2.2 服务配置
# service.yaml
kind: Service
apiVersion: v1
metadata:
name: mysql-exporter # 服务名称,与deployment对应
spec:
ports:
- name: http-9104 # 端口名称
protocol: TCP # 协议类型
port: 9104 # 服务端口
targetPort: 9104 # 目标端口,与容器端口一致
2.3 配置挂载
# mount.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-exporter # 与基础部署配置中的名称一致
spec:
template:
spec:
volumes:
- name: volume-my-cnf # 卷名称
configMap:
name: mysql-exporter-cm # 引用的configmap名称
items:
- key: .my.cnf # configmap中的键
path: .my.cnf # 挂载到容器中的路径
defaultMode: 420 # 文件权限,十进制表示
containers:
- name: mysql-exporter
volumeMounts:
- name: volume-my-cnf # 挂载卷名称
readOnly: true # 只读挂载
mountPath: /.my.cnf # 挂载路径
subPath: .my.cnf # 子路径
2.4 配置文件
# configmap.yaml
kind: ConfigMap
apiVersion: v1
metadata:
name: mysql-exporter-cm # configmap名称
data:
.my.cnf: |-
[client]
host=192.168.3.7 # MySQL服务器地址
port=3306 # MySQL服务端口
# mysql 用户名
user=mysql_exporter # 监控用户
# mysql 用户密码
password=Mysql_exporter@345 # 监控用户密码
2.5 监控配置
# servicemonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: mysql-exporter # servicemonitor名称,用于标识这个监控目标
spec:
endpoints:
- interval: 15s # 抓取间隔,可选值:5s, 10s, 30s, 1m, 5m等,默认为30s
path: /metrics # 指标路径,MySQL Exporter默认暴露的指标端点
port: http-9104 # 端口名称,必须与Service中定义的端口名称一致
namespaceSelector:
matchNames:
- infrastructure # 匹配的命名空间列表,ServiceMonitor会在这个命名空间中查找Service
selector:
matchLabels:
app: mysql-exporter # 标签选择器,ServiceMonitor会查找具有这个标签的Service
ServiceMonitor 参数详解
| 参数 | 说明 | 可选值/示例 |
|---|---|---|
apiVersion | API版本 | monitoring.coreos.com/v1 |
kind | 资源类型 | ServiceMonitor |
metadata.name | ServiceMonitor名称 | mysql-exporter |
spec.endpoints.interval | 抓取间隔 | 15s, 30s, 1m, 5m等 |
spec.endpoints.path | 指标路径 | /metrics |
spec.endpoints.port | 端口名称 | http-9104 |
spec.namespaceSelector.matchNames | 命名空间列表 | infrastructure |
spec.selector.matchLabels | 标签选择器 | app: mysql-exporter |
ServiceMonitor 是 Prometheus Operator 提供的自定义资源对象,用于声明式地定义应该监控哪些服务。它通过标签选择器(selector.matchLabels)找到对应的 Service,然后通过 endpoints 配置告诉 Prometheus 如何抓取指标。

2.6 Kustomize 配置
# base/kustomization.yaml
resources:
- ./deployment.yaml # 引用deployment配置
- ./service.yaml # 引用service配置
patches:
- ./mount.yaml # 应用挂载补丁
commonAnnotations:
application: mysql-exporter应用 # 应用标识
commonLabels:
app: mysql-exporter # 通用标签
# overlays/infrastructure/kustomization.yaml
resources:
- ../../base # 引用基础配置
- configmap.yaml # 引用configmap配置
- servicemonitor.yaml # 引用servicemonitor配置
namespace: infrastructure # 统一的namespace
images:
- name: mysql-exporter-image # 镜像名称(占位符)
newName: k8s-harbor:30002/prom/mysqld-exporter # 新镜像地址
newTag: v0.18.0 # 镜像标签
三、Argo CD 应用配置
通过 Argo CD 实现 GitOps 方式的持续部署:
# infrastructure/mysql-exporter-0180.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: mysql-exporter-0180 # 应用名称
spec:
destination:
name: '' # 目标集群名称(空表示默认集群)
namespace: infrastructure # 目标命名空间
server: 'https://kubernetes.default.svc' # 目标集群地址
source:
path: howlaisi-workspace/infrastructure/mysql-exporter/mysql-exporter-0180/overlays/infrastructure # 配置路径
repoURL: 'http://192.168.3.3/howlaisi/argocd-gitops.git' # Git仓库地址
targetRevision: HEAD # 目标分支
project: default # ArgoCD项目
syncPolicy:
automated:
prune: true # 自动清理
selfHeal: true # 自动修复
四、Grafana 仪表盘推荐
集成监控后,可以使用以下常用的 Grafana 仪表盘来可视化 MySQL 指标:
4.1 推荐的仪表盘 ID
| 仪表盘名称 | ID | 说明 |
|---|---|---|
| MySQL Overview | 7362 | 官方提供的 MySQL 全局概览仪表盘 |
| MySQL Exporter Quickstart and Dashboard | 14057 | 包含丰富的 MySQL 性能指标展示 |
| MySQL Performance Dashboard | 11323 | 专注于 MySQL 性能分析的仪表盘 |
| MySQL InnoDB Dashboard | 14336 | 专门针对 InnoDB 存储引擎的监控面板 |
五、关键配置说明
5.1 MySQL 用户权限配置
为确保安全性和最小权限原则,需要在 MySQL 中创建专用监控用户:
CREATE USER 'mysql_exporter'@'%' IDENTIFIED BY 'Mysql_exporter@345';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'mysql_exporter'@'%';
FLUSH PRIVILEGES;
5.2 配置参数详解
- host: MySQL 服务器地址
- port: MySQL 服务端口(默认 3306)
- user: 用于连接 MySQL 的用户名
- password: 对应用户的密码
- interval: 监控指标抓取间隔(示例中为 15s)
5.3 资源限制配置
根据实际业务负载情况,合理配置资源请求和限制:
resources:
limits:
cpu: '1' # CPU使用上限,根据实际负载调整
memory: 2000Mi # 内存使用上限,根据实际负载调整
requests:
cpu: 100m # CPU请求,建议设置较低值
memory: 200Mi # 内存请求,建议设置较低值
六、监控指标说明
MySQL Exporter 提供了丰富的监控指标,主要包括:
-
全局状态指标:
mysql_global_status_uptime:MySQL 服务运行时间mysql_global_status_threads_connected:当前连接数mysql_global_status_questions:查询请求数
-
查询性能指标:
mysql_global_status_slow_queries:慢查询数量mysql_global_status_select_full_join:全表连接查询数
-
InnoDB 存储引擎指标:
mysql_global_status_innodb_buffer_pool_read_requests:InnoDB 缓冲池读请求数mysql_global_status_innodb_buffer_pool_reads:InnoDB 缓冲池物理读取数
七、部署验证
部署完成后,可以通过以下方式验证是否正常工作:
-
检查 Pod 状态:
kubectl get pods -n infrastructure | grep mysql-exporter -
检查 Service 是否正常:
kubectl get svc -n infrastructure | grep mysql-exporter -
验证指标是否可访问:
kubectl port-forward svc/mysql-exporter 9104:9104 -n infrastructure然后访问
http://localhost:9104/metrics查看指标输出 -
检查 Prometheus 是否成功抓取指标:
在 Prometheus UI 中查询 mysql 相关指标
八、常见问题与解决方案
8.1 权限不足问题
如果出现权限不足错误,需要确保监控用户具有以下权限:
- PROCESS
- REPLICATION CLIENT
- SELECT
8.2 连接失败问题
检查以下几点:
- MySQL 服务器地址和端口是否正确
- 网络连通性是否正常
- 防火墙是否放行相关端口
8.3 指标抓取失败
- 检查 ServiceMonitor 配置是否正确
- 确认 Prometheus Operator 是否正常运行
- 验证标签选择器是否匹配
九、性能优化建议
- 合理设置抓取间隔,避免过于频繁的监控影响数据库性能
- 根据实际需要调整资源限制,避免资源浪费
- 定期审查监控指标,移除不必要的指标收集
总结
通过 MySQL Exporter 与 Prometheus 的集成,我们可以实现对 MySQL 数据库的全面监控。结合 Argo CD 的 GitOps 部署方式,能够确保监控配置的一致性和可追溯性。合理配置监控指标和告警规则,有助于及时发现和解决数据库性能问题,保障业务系统的稳定运行。
评论区