目 录CONTENT

文章目录

MySQL Exporter 集成 Prometheus 监控实战指南

Administrator
2025-11-18 / 0 评论 / 0 点赞 / 3 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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 连接配置

二、部署配置详解

mysql-exporter-file

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 参数详解

参数说明可选值/示例
apiVersionAPI版本monitoring.coreos.com/v1
kind资源类型ServiceMonitor
metadata.nameServiceMonitor名称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 如何抓取指标。
mysql-exporter-prometheus-target

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 Overview7362官方提供的 MySQL 全局概览仪表盘
MySQL Exporter Quickstart and Dashboard14057包含丰富的 MySQL 性能指标展示
MySQL Performance Dashboard11323专注于 MySQL 性能分析的仪表盘
MySQL InnoDB Dashboard14336专门针对 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 提供了丰富的监控指标,主要包括:

  1. 全局状态指标

    • mysql_global_status_uptime:MySQL 服务运行时间
    • mysql_global_status_threads_connected:当前连接数
    • mysql_global_status_questions:查询请求数
  2. 查询性能指标

    • mysql_global_status_slow_queries:慢查询数量
    • mysql_global_status_select_full_join:全表连接查询数
  3. InnoDB 存储引擎指标

    • mysql_global_status_innodb_buffer_pool_read_requests:InnoDB 缓冲池读请求数
    • mysql_global_status_innodb_buffer_pool_reads:InnoDB 缓冲池物理读取数

七、部署验证

部署完成后,可以通过以下方式验证是否正常工作:

  1. 检查 Pod 状态:

    kubectl get pods -n infrastructure | grep mysql-exporter
    
  2. 检查 Service 是否正常:

    kubectl get svc -n infrastructure | grep mysql-exporter
    
  3. 验证指标是否可访问:

    kubectl port-forward svc/mysql-exporter 9104:9104 -n infrastructure
    

    然后访问 http://localhost:9104/metrics 查看指标输出

  4. 检查 Prometheus 是否成功抓取指标:
    在 Prometheus UI 中查询 mysql 相关指标

八、常见问题与解决方案

8.1 权限不足问题

如果出现权限不足错误,需要确保监控用户具有以下权限:

  • PROCESS
  • REPLICATION CLIENT
  • SELECT

8.2 连接失败问题

检查以下几点:

  1. MySQL 服务器地址和端口是否正确
  2. 网络连通性是否正常
  3. 防火墙是否放行相关端口

8.3 指标抓取失败

  1. 检查 ServiceMonitor 配置是否正确
  2. 确认 Prometheus Operator 是否正常运行
  3. 验证标签选择器是否匹配

九、性能优化建议

  1. 合理设置抓取间隔,避免过于频繁的监控影响数据库性能
  2. 根据实际需要调整资源限制,避免资源浪费
  3. 定期审查监控指标,移除不必要的指标收集

总结

通过 MySQL Exporter 与 Prometheus 的集成,我们可以实现对 MySQL 数据库的全面监控。结合 Argo CD 的 GitOps 部署方式,能够确保监控配置的一致性和可追溯性。合理配置监控指标和告警规则,有助于及时发现和解决数据库性能问题,保障业务系统的稳定运行。

参考文档

  1. Prometheus 官方文档
  2. MySQL Exporter GitHub 仓库
  3. Prometheus Operator 官方文档
0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区