数字化技能提升教程,数字化时代生存宝典

MySQL数据库运行状态监控实战

浏览:31

网站响应变慢时,可以先观察数据库连接数、查询量和慢查询是否发生变化,再结合其他监控结果缩小排查范围。本次通过mysqld_exporter采集MySQL指标,接入Prometheus,并在Grafana中集中展示数据库运行状态。

一、监控目标

本次重点监控以下内容:

  • 数据库是否能够被正常采集
  • 当前连接数
  • 查询速率QPS
  • 慢查询速率
  • 连接创建速率

连接数与查询量用于观察负载变化,慢查询计数用于发现超过指定执行时间的查询。这些指标需要结合业务情况分析,不能单凭某一项数值判断数据库存在故障。

二、组件版本

本次环境记录的组件版本如下:

MySQL Server 8.0.46
prometheus-mysqld-exporter 0.15.0-2ubuntu0.24.04.3

以下步骤按MySQL与Exporter部署在同一台Ubuntu服务器上编写,使用本地Unix Socket连接数据库。

三、安装组件

以下系统命令以root身份执行:

apt-get update
apt-get install -y mysql-server prometheus-mysqld-exporter

如果服务器已经安装并运行MySQL,只安装Exporter即可,不要重复安装或替换现有数据库。

检查服务和版本:

systemctl is-active mysql prometheus-mysqld-exporter
mysql --version

安装后先完成监控账号与连接配置,再判断采集是否正常。Exporter服务运行与数据库采集成功是两个不同的检查环节。

四、创建监控用户

1. 确认Socket认证条件

本次使用MySQL的auth_socket认证,避免在Exporter配置文件中保存数据库密码。

Socket认证需要匹配操作系统用户身份,不能只创建一个同名数据库账号就结束配置。 本例要求Exporter以系统用户prometheus运行,并通过Unix Socket连接数据库。

检查服务运行用户:

systemctl show prometheus-mysqld-exporter -p User -p Group

如果User不是prometheus,应根据实际服务用户调整认证配置,不要直接照搬后续账号设置。

使用数据库管理员身份登录MySQL,检查插件和Socket路径:

SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME = 'auth_socket';

SHOW VARIABLES LIKE 'socket';

后续步骤要求auth_socket已经启用。本教程针对MySQL,不应直接将其他数据库的unix_socket插件名替换进来使用。

2. 创建专用监控账号

在确认该账号尚不存在的情况下执行:

CREATE USER 'prometheus'@'localhost'
IDENTIFIED WITH auth_socket
WITH MAX_USER_CONNECTIONS 3;

GRANT PROCESS, REPLICATION CLIENT, SELECT
ON *.* TO 'prometheus'@'localhost';

这组权限用于Exporter采集,并限制监控账号的并发连接数。SELECT ON *.*的读取范围较广,应将账号专用于监控,后续可结合实际启用的采集器评估权限范围。

如果账号已经存在,先检查,不要直接删除重建:

SHOW CREATE USER 'prometheus'@'localhost';
SHOW GRANTS FOR 'prometheus'@'localhost';

确认Exporter系统用户为prometheus后,可以在服务器终端验证认证:

sudo -u prometheus mysql \
  --protocol=SOCKET \
  --socket=/run/mysqld/mysqld.sock \
  -u prometheus \
  -e "SELECT CURRENT_USER();"

其中Socket路径应与数据库实际配置一致。

五、配置mysqld_exporter

创建配置文件:

nano /etc/prometheus/mysql-exporter.cnf

写入:

[client]
user=prometheus
socket=/run/mysqld/mysqld.sock

Exporter支持从指定配置文件读取用户和Socket连接参数。确保服务运行用户能够读取该文件。

本次安装方式使用以下默认参数文件:

/etc/default/prometheus-mysqld-exporter

编辑其中的ARGS,不要保留多个相互冲突的赋值:

ARGS="--config.my-cnf=/etc/prometheus/mysql-exporter.cnf --web.listen-address=127.0.0.1:9104"

这里将指标接口限制在本机。如果Prometheus部署在另一台服务器,需要改为可达的监听地址,并限制允许访问的来源。

重启服务:

systemctl reset-failed prometheus-mysqld-exporter
systemctl restart prometheus-mysqld-exporter
systemctl status prometheus-mysqld-exporter

如果修改后没有生效,检查实际服务启动配置是否读取上述参数文件:

systemctl cat prometheus-mysqld-exporter

六、验证metrics

访问Exporter指标接口:

curl -sS http://127.0.0.1:9104/metrics \
  | grep -E '^mysql_up|^mysql_global_status_threads_connected|^mysql_global_status_queries'

重点检查:

mysql_up 1

同时确认存在连接数和查询计数指标。mysql_up为1表示Exporter能够连接数据库;仅看到指标名称或HTTP接口能够访问,还不足以认定数据库采集正常。

七、Prometheus配置

在已有的scrape_configs列表下添加任务,不要覆盖其他采集配置:

  - job_name: mysql
    static_configs:
      - targets:
          - localhost:9104

校验配置:

promtool check config /etc/prometheus/prometheus.yml

校验通过后重启Prometheus:

systemctl restart prometheus

进入Targets页面,检查mysql任务是否为UP。

MySQL Target

再查询:

mysql_up{job="mysql"}

mysql_up查询

需要区分两个状态:

  • up{job="mysql"}:Prometheus是否成功抓取Exporter。
  • mysql_up{job="mysql"}:Exporter是否能够连接MySQL。

因此,Targets为UP后,还需要继续确认mysql_up为1。

八、常用PromQL

1. MySQL采集状态

mysql_up{job="mysql"}

用于检查数据库连接是否成功。它不代表所有业务SQL都能正常执行。

2. 当前连接数

mysql_global_status_threads_connected{job="mysql"}

反映当前打开的连接数量,其中可能包含空闲连接,并不等同于正在执行查询的数量。

3. 查询速率QPS

rate(mysql_global_status_queries{job="mysql"}[5m])

根据累计查询计数计算最近5分钟的平均每秒查询量。该计数并非只统计业务请求,也不能直接等同于网站访问量。

4. 慢查询速率

rate(mysql_global_status_slow_queries{job="mysql"}[5m])

用于观察慢查询计数的增长速度。判断时应同时核对long_query_time设置;慢查询计数与是否开启慢查询日志不是同一件事。

5. 连接创建速率

rate(mysql_global_status_connections{job="mysql"}[5m])

该指标对应连接尝试次数的增长速率,包含成功和失败的连接尝试,因此不能理解为“成功建立连接数”。

九、Grafana看板

将上述查询添加到Grafana面板,集中展示MySQL运行状态。

MySQL Dashboard

建议将在线状态、当前连接数、QPS、慢查询速率和连接尝试速率放在同一看板中。排查网站响应变慢的问题时,统一时间范围,再对照服务器资源、网站请求量和数据库日志进行分析。

十、常见问题

1. Exporter服务启动失败

查看日志:

journalctl -u prometheus-mysqld-exporter --no-pager -n 100

如果出现no user specified,检查配置文件中是否包含有效的user,以及--config.my-cnf是否指向正确文件。也要确认服务用户具备读取权限。

2. 提示Access denied

优先核对:

  • Exporter实际使用的系统用户
  • 数据库监控账号的认证插件
  • 是否通过Unix Socket连接
  • Socket路径是否正确
  • 监控账号是否具有所需权限

本例的无密码认证依赖系统用户身份,不能改成TCP连接后仍按相同方式使用。

3. Prometheus中的mysql任务为DOWN

先检查Exporter及其指标接口:

systemctl status prometheus-mysqld-exporter
curl http://127.0.0.1:9104/metrics

再核对Prometheus的目标地址和网络可达性。DOWN表示抓取失败,应先排查Prometheus到Exporter这一段。

如果Targets为UP但mysql_up为0,再检查MySQL服务、认证与连接配置:

systemctl status mysql
journalctl -u prometheus-mysqld-exporter --no-pager -n 100

十一、总结

MySQL基础监控可以先覆盖采集状态、连接数、查询速率和慢查询变化,再根据实际故障补充更细的指标。连接数或QPS升高并不必然意味着异常,判断时需要结合业务负载与查询表现。

配置完成后,建议先记录正常运行时的指标范围,再以此为依据设置告警,避免直接套用不适合当前网站的固定阈值。

相关文章
猜你喜欢