Prometheus 获取 MySQL 的监控数据,并通过 Grafana 展示的过程。首先来看整体架构图:
1 架构图
如上图,通过 mysql_exporter 获取 MySQL 的监控数据,通过 node_exporter 获得 Linux 服务器的监控数据。将获得的监控数据传到 Prometheus 中,最终通过 Grafana 展示出来,效果如下图:
除了展示监控数据,在文章的最后也会增加邮件告警的配置。
2 实验环境介绍
实验环境大致如下:
被监控的 MySQL 机器:192.168.150.123(MySQL 版本:8.0.22);
Prometheus 服务器:192.168.150.253(Prometheus 版本:2.25.2);
Grafana 服务器:192.168.21.126(Grafana 版本:7.4.5);
服务器版本均为:CentOS 7.4;
防火墙、Selinux 均关闭。
3 部署 Prometheus
在 https://prometheus.io/download/ 中下载对应的版本。
解压 Prometheus 安装包
tar zxvf prometheus-2.25.2.linux-amd64.tar.gz -C /opt
创建软链接
ln -s /opt/prometheus-2.25.2.linux-amd64/ /opt/prometheus
修改配置文件 /opt/prometheus/prometheus.yml
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=
` to any timeseries scraped from this config. - job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['192.168.150.253:9090']
这里只对 scrape_configs(被监控机器的配置) 中的 static_configs 进行了修改,targets 中的内容改成了 prometheus 所在机器的 IP 加端口。也就是暂时配置只监控本机。
启动 Prometheus
nohup /opt/prometheus/prometheus --config.file=/opt/prometheus/prometheus.yml &
访问 Prometheus 页面:http://192.168.150.253:9090/
可以看到如下界面:
点击 Status --> Targets,可以看到被监控的目标机器,如下:
点击对应的 Endpoint,则可获得监控数据,如下图:
到这里,Prometheus 已经部署完成。
4 部署 node_exporter 组件
node_exporter 是 Prometheus 用户获取 Linux 指标的插件。Github 地址:https://github.com/prometheus/node_exporter。这里聊聊它的部署。
首先在 https://prometheus.io/download/ 中找到对应的 node_exporter 版本。
将 node_exporter 传到需要监控的 MySQL 机器上,进行解压:
tar zxvf node_exporter-1.1.2.linux-amd64.tar.gz -C /opt/
创建软链接:
ln -s /opt/node_exporter-1.1.2.linux-amd64/ /opt/node_exporter
启动
nohup /opt/node_exporter/node_exporter &
浏览器输入:http://192.168.150.123:9100/metrics,如果有类似如下数据,则表示 node_exporter 部署完成。
5 部署 mysqld_exporter 组件
mysqld_exporter 是 Prometheus 的 MySQL 指标导出插件。Github 地址:https://github.com/prometheus/mysqld_exporter。这里来聊聊它的部署。
首先在 https://github.com/prometheus/mysqld_exporter/releases 中找到对应的 mysqld_exporter 版本。
将 mysqld_exporter 传到需要监控的 MySQL 机器上,进行解压:
tar zxvf mysqld_exporter-0.12.1.linux-amd64.tar.gz -C /opt
创建软链接
ln -s /opt/mysqld_exporter-0.12.1.linux-amd64/ /opt/mysqld_exporter
在 MySQL 上创建监控用户
create user 'exporter'@'localhost' IDENTIFIED BY 'eXpIHB666QWE!';
GRANT SELECT, PROCESS, SUPER, REPLICATION CLIENT, RELOAD ON *.* TO 'exporter'@'localhost';
新建一个配置文件:
vim /opt/mysqld_exporter/mysqld_exporter.cnf
配置 MySQL 监控用户信息:
[client]
user=exporter
password=eXpIHB666QWE!
启动 mysqld_exporter
nohup /opt/mysqld_exporter/mysqld_exporter --config.my-cnf=/opt/mysqld_exporter/mysqld_exporter.cnf &
浏览器输入:http://192.168.150.123:9104/metrics,可获得 MySQL 监控数据,如下图(部分数据):
6 配置 Prometheus 获取监控数据
在 prometheus 的机器上,修改 prometheus 的配置文件 /opt/prometheus/prometheus.yml,增加 node_exporter 和 mysqld_exporter 的配置:
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=
` to any timeseries scraped from this config. - job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['192.168.150.253:9090']
- job_name: 'mysql-123'
static_configs:
- targets: ['192.168.150.123:9104']
- job_name: 'node-123'
static_configs:
- targets: ['192.168.150.123:9100']
重启 prometheus
pkill prometheus
nohup /opt/prometheus/prometheus --config.file=/opt/prometheus/prometheus.yml &
访问 Prometheus 页面:http://192.168.150.253:9090/,点击 Status --> Targets,可以看到新增加的被监控节点。
回到主界面,搜索 MySQL 相关参数,比如:innodb_buffer_pool_size:
选择对应的参数,则可看到监控图,如下:
7 部署 Grafana
Grafana 的 Github 地址:https://github.com/grafana/grafana。
可以在 https://grafana.com/grafana/download 中选择适合自己操作系统的包。然后下载对应的包,如下:
wget https://dl.grafana.com/oss/release/grafana-7.4.5-1.x86_64.rpm
yum install grafana-7.4.5-1.x86_64.rpm -y
启动 Grafana
systemctl start grafana-server.service
登录 Grafana WEB 界面:http://192.168.21.126:3000/,显示如下:
用户名密码都是 admin。登录后,会让我们修改密码,则按提示操作即可,当然也可以点击跳过。
这里就可以看到 Grafana 的主界面了:
8 为 Grafana 配置 Prometheus 数据源
按下图进入数据源添加界面:
点击 “Add data source”
如下图,选择“Prometheus”数据源:
如下图,增加 Prometheus 的 URL 即可:
点击最下方的 Save & Test,显示“Data source is working”,则表示数据源配置正常:
9 Grafana 展示 Linux 的监控数据
按照下图的方式进入模板导入界面:
在 “Import via grafana.com” 下方输入:11074
点击 Load 会出现如下界面:
将 Name 改成你希望定义的名字,在 VictoriaMetrics 位置选择之前创建的 Prometheus 数据源,如下图:
点击 “Import”,会自动跳转到如下界面:
到这里,完成了 Grafana 展示 Prometheus 中 Linux 操作系统的监控数据。
10 Grafana 展示 MySQL 的监控数据
按照下图的方式进入模板导入界面:
在 “Import via grafana.com” 下方输入 7362:
或者在 https://grafana.com/grafana/dashboards/7362 页面下载 JSON 模板,然后点击 “Upload JSON file” 导入,然后会显示如下信息(目前还有其他一些模板,比如 https://github.com/percona/grafana-dashboards,有兴趣的可以尝试一下):
在 prometheus 选项选择之前创建的 Prometheus 数据源,点击 “Import”,会自动跳转到如下界面:
到这里,完成了 Grafana 展示 Prometheus 中 MySQL 的监控数据。
11 告警配置
对 Prometheus 中获取的数据进行告警配置,目前有很多方式,比如:
通过 Grafana 配置邮件告警
通过开源的运维告警中心消息转发系统:PrometheusAlert,Github 地址:https://github.com/pandorasongs/PrometheusAlert。
等等
本节内容就拿 Grafana 配置邮件告警来举例,PrometheusAlert 在后面的内容中再跟朋友们介绍。编辑 Grafana 配置文件 /etc/grafana/grafana.ini,按下图修改 [smtp] 部分配置:
重启 Grafana
systemctl start grafana-server.service
按如下方式进入通知渠道创建界面
填写好收件人,点击 “Test”,如果能正常收到邮件,则说明配置正常。
如果测试正常,则点击“Save”保存配置。
12 告警测试
在前面导入的 MySQL Overview 中,选择一个监控项,点击 More-->Duplicate 再复制一个图出来:
对复制出来的图点击 Edit,如下图:
则进入下图:
将里面的变量都改为常量,如下图:
进入 Alert,再点击 Create Alert,进入如下界面:
这里解释一下 query(A,5m,now) IS ABOVE 5:
A 对 A 类(A 是 Query 中定义的)指标;
5m,now 表示从 5 分钟前到现在;
IS ABOVE 5 定义阈值的类型和阈值。
更多内容可参考:https://grafana.com/docs/grafana/latest/alerting/create-alerts/
并填下好下方的收件人和 Message:
其中,收件人“dba”就是我们在 12.3.11 步骤配置的收件人。
配置好之后,点击下面的 “Test rule”,如果出现以下界面,则表示触发器配置正常:
因为上面我们是对 mysql_global_status_threads_connected 设置的阈值,所以我们可以在测试的 MySQL 中,构造超过 5 个连接,测试是否可以邮件告警。
如下图,就是告警效果:
到这里,通过 Prometheus + Grafana 监控 MySQL 的内容就讲完了。