教你使用Prometheus监控MySQL与MariaDB

作者:roc 陈鹏
来源:微信公众号:腾讯云原生
出处:;mid=2247488719 --tt-darkmode-bgcolor: #131313;">roc , 腾讯高级工程师 , Kubernetes Contributor , 热爱开源 , 专注云原生领域 。 目前主要负责腾讯云TKE 的售中、售后的技术支持 , 根据客户需求输出合理技术方案与最佳实践 , 为客户业务保驾护航 。
概述MySQL 是常用的关系型数据库 , MariaDB 作为 MySQL 的分支版本 , 兼容 MySQL 协议 , 也越来越流行 。 在 Kubernetes 环境中如何使用 Prometheus 来对它们进行监控呢?通常是借助开源的 mysqld-exporter 来实现 , 本文将围绕这个主题展开详细介绍下 。
mysqld-exporter:
mysqld-exporter 原理介绍mysqld-exporter 通过读取 MySQL 或 MariaDB 中的一些数据库状态的数据 , 并将其转换为 Prometheus 的指标格式并暴露成 http 接口被 Prometheus 所采集 , 来实现让原本不支持 Prometheus 指标的 MySQL 和 MariaDB 能够被 Prometheus 监控起来:
教你使用Prometheus监控MySQL与MariaDB文章插图
操作步骤部署 mysqld-exporter在部署 mysqld-exporter 之前首先保证 MySQL 或 MariaDB 已经部署 , 可以在集群内 , 也可以在集群外 , 或者使用现成的云服务 。 如果还没有 , 这里以从应用市场部署到集群为例来部署一个 MySQL:

  1. 在应用市场中找到 MySQL , 点击 创建应用-创建。

教你使用Prometheus监控MySQL与MariaDB文章插图
  1. 查看 mysql 是否正常运行:
$ kubectl get podsNAMEREADYSTATUSRESTARTSAGEmysql-698b898bf7-4dc5k1/1Running011s
  1. 获取 root 密码:
$ kubectl get secret -o jsonpath={.data.mysql-root-password} mysql6ZAj33yLBo有了 MySQL 后 , 我们开始准备部署 mysqld-exporter , 首先为 mysqld-exporter 创建一个账号 , 登录 MySQL:
$ kubectl exec -it mysql-698b898bf7-4dc5k bash$ mysql -uroot -p6ZAj33yLBo然后输入 SQL 来创建账号 , 这里 以 mysqld-exporter/123456 为 例:
CREATE USER 'mysqld-exporter' IDENTIFIED BY '123456' WITH MAX_USER_CONNECTIONS 3;GRANT PROCESS, REPLICATION CLIENT, REPLICATION SLAVE, SELECT ON *.* TO 'mysqld-exporter';flush privileges;然后使用以下 yaml 来部署 mysqld-exporter:
apiVersion: apps/v1kind: Deploymentmetadata:name: mysqld-exporterspec:replicas: 1selector:matchLabels:app: mysqld-exportertemplate:metadata:labels:app: mysqld-exporterspec:containers:- name: mysqld-exporterimage: prom/mysqld-exporter:v0.12.1args:- --collect.info_schema.tables- --collect.info_schema.innodb_tablespaces- --collect.info_schema.innodb_metrics- --collect.global_status- --collect.global_variables- --collect.slave_status- --collect.info_schema.processlist- --collect.perf_schema.tablelocks- --collect.perf_schema.eventsstatements- --collect.perf_schema.eventsstatementssum- --collect.perf_schema.eventswaits- --collect.auto_increment.columns- --collect.binlog_size- --collect.perf_schema.tableiowaits- --collect.perf_schema.indexiowaits- --collect.info_schema.userstats- --collect.info_schema.clientstats- --collect.info_schema.tablestats- --collect.info_schema.schemastats- --collect.perf_schema.file_events- --collect.perf_schema.file_instances- --collect.perf_schema.replication_group_member_stats- --collect.perf_schema.replication_applier_status_by_worker- --collect.slave_hosts- --collect.info_schema.innodb_cmp- --collect.info_schema.innodb_cmpmem- --collect.info_schema.query_response_time- --collect.engine_tokudb_status- --collect.engine_innodb_statusports:- containerPort: 9104protocol: TCPenv:- name: DATA_SOURCE_NAMEvalue: "mysqld-exporter:123456@(mysql.default.svc.cluster.local:3306)/"---apiVersion: v1kind: Servicemetadata:name: mysqld-exporterlabels:app: mysqld-exporterspec:type: ClusterIPports:- port: 9104protocol: TCPname: httpselector:app: mysqld-exporter注意根据实际情况替换 DATA_SOURCE_NAME 中的账号密码 , 以及 MySQL 的连接地址
添加监控采集配置有了 mysqld-exporter 后 , 我们就可以配置监控的采集 , 让 mysqld-exporter 暴露的数据被采集起来 , 如果你的集群中安装了 prometheus-operator , 可以通过定义 ServiceMonitor 来配置采集规则 , 示例:
apiVersion: monitoring.coreos.com/v1kind: ServiceMonitormetadata:name: mysqld-exporterspec:endpoints:interval: 5stargetPort: 9104namespaceSelector:matchNames:- defaultselector:matchLabels:app: mysqld-exporter你可以通过修改 Prometheus 原生的配置文件来配置采集规则 , 示例:
- job_name: mysqld-exporterscrape_interval: 5skubernetes_sd_configs:- role: endpointsnamespaces:names:- defaultrelabel_configs:- action: keepsource_labels:- __meta_kubernetes_service_label_app_kubernetes_io_nameregex: mysqld-exporter- action: keepsource_labels:- __meta_kubernetes_endpoint_port_nameregex: http