Py学习  »  DATABASE

一文带你吃透MySQL性能监控解决方案:Prometheus+Grafana

IT大咖说 • 6 月前 • 75 次点击  

MySQL性能监控解决方案:Prometheus+Grafana问题描述

在对MySQL进行主从复制、分库分表等架构之后,MySQL的节点数量变得越来越多,无法实时监控到每一台MySQL节点,此时应当如何处理?

问题分析与解决方案

针对上面的问题,需要用Prometheus + Grafana对服务器进行统一监控、规划与报警,时刻关注服务器的响应情况。当出现宕机或异常时,Grafana可迅速通过短信、钉钉、邮件等方式通知相关人员,进而快速对生产环节进行补救。

Prometheus概述与适用场景

Prometheus 是 一 个 开 源 的 服 务 监 控 系 统 和 时 间 序 列 数 据 库 ,Kubernetes(k8s)内部使用的就是Prometheus数据库。Kubernetes的流行,带动了Prometheus社区的发展。Prometheus在大规模数据管理与读取上,比传统的NoSQL数据库要快很多。在数据压缩上,Prometheus具有高效压缩数据的算法,节省了存储空间,可有效减少服务器I/O的瓶颈。

Prometheus的适用场景如下:

(1)部署监控服务器,实现7×24实时监控。

(2)针对公司的业务及研发部门设计监控系统,对监控项和触发器给出合理意见。

(3)做好问题预警机制,对可能出现的问题及时告警并形成严格的处理机制。

(4)做好监控告警系统,要求可以实现告警分级(一级报警电话通知、二级报警微信通知、三级报警邮件通知)。

(5)处理好公司服务器异地集中监控的问题。

Prometheus的主要特征:

(1)多维度数据模型。

(2)灵活的查询语言。

(3)不依赖分布式存储,单个服务器节点是自主的。

(4)以HTTP方式通过pull模型拉取时间序列数据。

(5)通过中间网关支持push模型。

(6)通过服务发现或者静态配置发现目标服务对象。

(7)支持多种多样的图表和界面展示,例如Grafana。

时序数据库概述与适用场景

在工作中,时序数据库(TimeSeries DataBase,TSDB)主要记录按照时间顺序进行管理的数据。这些以时间为变化的数据被统称为时序数据。时序数据库对该类数据有更好的读取性能,其应用场景如下所示:

(1)Linux服务器每秒的CPU占用百分比、内存占用百分比、硬盘占用百分比等相关数据。

(2)无人汽车每秒的速度、油耗、方向、地理位置等相关数据。

(3)无人机每秒的经纬度、飞行高度、地理位置等相关数据。

(4)证券中心每秒开盘的行情数据、资金流数据。

(5)银行账号每天、每周的存款数据。

时序数据库并不要求数据实时更新,只是需要以时间作为变化单位而已,所以银行账号同样适用于时序数据库,但仅限于展示数据的可视化及数据的变化。时序数据库的安全性不如关系数据库。

Grafana概述与适用场景

Grafana是开源的可视化和分析软件,可以对数据进行可视化和报警,提供了把时序数据转换成漂亮图形并进行可视化的工具。

Grafana可独立部署,也就是说,Grafana、Prometheus和MySQL可被部署在3台不同的服务器上。除Prometheus外,Grafana还可集成InfluxDB、MySQL和Elasticsearch等数据源。

构建Prometheus + Grafana监控实战

1. 安装Prometheus

输入下面的命令,下载Prometheus:

输入下面的命令,解压缩Prometheus安装包:

初次运行Prometheus程序:

启动之后,可以通过Prometheus内置的Web页面进行查看,地址为服务器IP:9090,如图9-1所示。

图9-1

在图9-1中可以输入想要查询的字段,并单击Execute按钮,使用Graph显示相应时间序列的折线图,如图9-2所示。

图9-2

单击Status下拉框中的Targets按钮,可查看当前Prometheus监控了哪些服务器。目前Prometheus只监控了本机,如图9-3所示。

图9-3

2. Prometheus的内部插件介绍

Prometheus的内部插件如表9-1所示。

表9-1

• prometheus是基本程序包,是必须下载的,后续插件可以在自身业务的基础上,酌情下载并集成到prometheus之上。

• alertmanager是一个独立的报警插件,可以接收Prometheus等客户端发来的警报,之后通过分组、删除重复警报等处理,将它们通过路由发送给正确的接收器。报警方式可以按照不同的规则发送给不同的模块负责人。

alertmanager既支持E-mail、Slack等报警方式,也可以通过Webhook接入钉钉等国内IM工具。在Prometheus+Grafana架构上,Grafana同样包含报警模块,警报可以推送给钉钉、邮箱等不同渠道,所以对alertmanager插件可以酌情下载与使用。

• blackbox_exporter是网络监控插件,可以提供HTTP、DNS、TCP、ICMP的监控数据采集,包括连接性状态、SSL状态、HTTP状态、HTTPS耗时、服务连通信统计、总耗时统计等。

• consul_exporter是用来监控Consul注册中心的插件,主要监控内容为Consul中的KV节点的健康状态与服务检查、集群有多少节点、提供的服务有多少节点、集群提供多少服务等。

• graphite_exporter是用来监控Graphite Metrics的插件。Graphite用来收集度量标准,通常采用Grafana+Prometheus+graphite_exporter插件+Spark的架构形式监控Spark上的数据。该架构首先需要配置Spark,将Metrics 报 告 传 入 graphite_exporter 插 件 的 Graphite 内 , 此 后 由graphite_exporter插件转化数据并交由Prometheus进行存储,Grafana负责读取Prometheus中的数据。与之类似的还有Grafana + .txt文件 + Telegraf+ InfluxDB架构,即由Telegraf读取.txt文件中的数据进行解析并传入InfluxDB中,Grafana负责读取InfluxDB中的数据。

注意:Telegraf是由Go语言编写的InfluxDB对外读取数据的数据驱动软件,该驱动内部设置了各种可插拔的插件。使用这些插件可以读取除.txt文件外的一系列数据,如HTTP接口、服务器CPU、服务器内存MEM、服务器I/O、服务器硬盘等。

• haproxy_exporter是使用Go语言编写的用来监控HAProxy负载均衡器的插件。它通过HTTP使用HAProxy所给出的URL地址读取相关数据。

• memcached_exporter是用来监控MemCache的插件,可以通过设置导出关于MemCache进程本身的指标及大量的统计信息数据。

• mysqld_exporter是用来监控MySQL的插件,可以收集InnoDB引擎状态、TokuDB引擎状态、心跳、InnoDB引擎缓冲池状态、数据库表相关的状态等一系列内容。

• node_exporter是用来监控主机CPU、内存、磁盘等相关硬件指标的插件。因为node_exporter是为了监控主机系统而设计的,所以不建议将其部署为Docker容器。如果必须将其部署为Docker容器,则需要增加一些额外的配置参数,以便node_exporter能够访问Linux的一些命名空间(文件)。例如,通过/proc/net/arp访问公开的ARP统计信息,通过/sys/fs/cache访问公开的bcache统计信息,通过/proc/net/ip_vs、/proc/net/ip_vs_stats访问公开的ipv状态信息,通过/proc/net/udp和/proc/net/udp6访问UPD队列的长度信息,通过/proc/net/netstat访问公开的netstat网络统计信息,等等。node_exporter在一台服务器上只能启动一个进程,不可多次重复启动,以免造成数据的失真与损坏。

• pushgateway 插 件 是 一 个 独 立 服 务 , 位 于 应 用 程 序 发 送 指 标 与Prometheus服务器之间。示例命令如下所示:


• statsd_exporter插件可以通过UDP接收StatsD风格的度量,并把它们作为Prometheus度量导出。StatsD是一个简单的网络守护进程,它基于Node.js平台,通过UDP或者TCP方式侦听各种统计信息,包括计数器和定时器,并发送聚合信息到后端服务,如Graphite。

3. 使用Prometheus远程监控Linux

从远程主机上下载node_exporter插件,命令如下所示:


解压缩下载的node_exporter插件,命令如下所示:


在node_exporter中只有一个执行程序,启动node_exporter的命令如下所示:


node_exporter的默认启动命令为9100,可通过netstat命令查看9100端口是否执行正常,命令如下所示:


在 Prometheus 所 在 的 服 务 器 上 更 改 prometheus.yml 文 件 , 对 接node_exporter插件所在服务器的9100接口。在prometheus.yml文件结尾处增加如下配置:

job_name的后面是自定义名称,可随意书写;在targets后面的方括号中可以输入多个TCP地址,并以逗号“,”进行分隔。更改prometheus.yml文件后,重启Prometheus程序,在Prometheus的Web页面处可以查看新增的监控地址和图表,如图9-4与图9-5所示。

图9-4

图9-5

4. 使用Prometheus远程监控MySQL

输入下面的命令下载mysqld_exporter插件:

输入下面的命令解压缩

mysqld_exporter-0.10.0.linux-amd64.tar.gz文件:

在MySQL控制台中添加用户名及角色权限。这里的mysqld_exporter插件与MySQL在同一台服务器上。mysqld_exporter插件通过新添加的用户名与MySQL 进 行 通 信 , 而 Prometheus 只 与 mysqld_exporter 插 件 进 行 通 信 ,Prometheus与MySQL并不直接关联。

编写mysqld_exporter插件的配置文件.my.config,在配置文件中输入MySQL对应的用户账号及密码,内容如下所示:

执行下面的命令启动mysqld_exporter插件:

mysqld_exporter插件的默认启动命令为9104。可以通过下面的命令查看9104端口是否执行正常,命令如下所示;

在 Prometheus 所 在 的 服 务 器 上 更 改 prometheus.yml 文 件 , 对 接mysqld_exporter插件所在服务器的9104端口。在prometheus.yml文件结尾处增加如下配置:

重启Prometheus,Web页面如图9-6和图9-7所示。

图9-6

图9-7

5. 安装Grafana

下载Grafana可视化工具,命令如下所示:

安装Grafana相关字库,命令如下所示:

安装rpm文件,命令如下所示:

也可以通过rpm方式安装Grafana,命令如下所示:

查看Grafana文件的相关地址,如图9-8所示。

图9-8

更改/etc/grafana/grafana.ini配置文件中的绑定IP地址(输入grafana服务器的IP即可),命令如下所示:

启动Grafana,命令如下所示:

打开Grafana页面,如图9-9所示。

图9-9

默认账号和密码均为admin,初次进入后需要填写新密码并确认。更改新密码后,展示页面如图9-10所示。

图9-10

6. 为Grafana配置Promtheus数据源

单击左侧任务栏中的Configuration→Data Sources选项,如图9-11所示。

图9-11

在 展 开 的 Configuration 页 面 中 单 击 Add data source 按 钮 , 输 入Promtheus相关的配置信息,如图9-12和图9-13所示。

图9-12

图9-13

再次单击Data Sources选项,可以看到刚刚配置的myPrometheus,如图9-14所示。

图9-14

7. Grafana图表Graph配置

单击左侧任务栏中的Create→Dashboard→Graph选项,如图9-15所示。

图9-15

单击Panel Title→Edit选项,配置图表,如图9-16所示。

图9-16

配置图表参数如图9-17所示,也可以单击Add Query按钮,选择查询多个参数,选择后,这些参数将在一个图表中展示。

图9-17

若想查询详细的地址或job,则可以在A查询处增加条件:

图形展示变化如图9-18所示。

图9-18

配置完之后,单击右上角的Save dashboard按钮,在Grafana内部进行保存。也可以单击Settings按钮保存为JSON文件,以免Grafana崩溃而直接丢失图表配置。JSON文件的内容如图9-19所示。

图9-19

8. 使用Grafana的图表模板

虽然Grafana提供了极多的图表规划体验,例如,线条的颜色、条件展示位置、上升和下降箭头、折线图、饼状图、线条图等,但是每次设置未免过于复杂,通常使用Grafana官方的图表模板即可。其中,大部分所包含的内容都在图表模板上,不需一一配置,如图9-20所示。

图9-20

单击图9-15中的“Create”→“Import”选项,导入模板。在第1个输入框中输入Dashboard官网的编号例如1010,或者在第2个输入框中粘贴整个Grafana图表的JSON数据,如图9-21所示。

图9-21

单击Load按钮之后,更改Import页面中的Name(即Dashboard的名称),以及VictoriaMetrics处的数据源,如图9-22所示。

图9-22

node_exporter数据导入模板的结果如图9-23所示(导入的模板不同,展示的结果也不同)。

图9-23

mysql_exporter数据导入模板的结果如图9-24所示。

图9-24

导入图表后,在右上角可选择时间的跨度及刷新频率等参数,如图9-25所示。

图9-25

9. 使用Grafana的报警功能

更改Grafana的配置文件default.ini,如图9-26所示。

图9-26

单击Alerting→Notification channels选项,配置Grafana账号绑定的邮箱,如图9-27所示。

图9-27

设置邮箱地址,如图9-28所示。

图9-28

配置Grafana图表报警条件,如图9-29所示。

在Grafana的图表里选择Alert,配置相关的Alert报警。这里可以配置的是报警的阈值和报警条件。

• Conditions中的WHEN avg() OF query(A, 5m,now) IS ABOVE 3000:

A指的是之前写的A语句,now和5m指的是从现在起往回五分钟。

• Evaluate every:指多久检测一次。

• If execution error or timeout:如果出现大于3000次的error,则发送邮件。在邮件标题开头写上【Alerting】。

• If no data all values are null:当所有的数据为空时发送邮件,在邮件标题开头写上【No Data】。

当然,上面条件中的IS ABOVE和WHEN也可以更改。

Test Rule尤其重要。这里可以用Java接收返回的JSON,也可以用来测试当前预警是否成功。当state为ok时,表示该监控没有问题。当state为Alerting时,表示该监控有问题,需要发送邮件。alert表示当数据达到发送监控要求时,哪怕目前数值持续性达到发送监控要求,也只会发送一封邮件。但是若在发送邮件之后,该数据又达到ok范围内,则Grafana会发送以

【OK】为标题开头的邮件,表示该监控已经正常。

Test Rule的conditionEvals会判断当前数据是否处于监控语句标准,若为true,则表示需要发送邮件。

另外,Grafana支持多个监控语句判定。可以单击+按钮,此时Grafana会让你选择and或or。如果选择and,则必须所有语句都达到监控范围才发送邮件;如果选择or,则只需有一条语句达到监控范围就会发送邮件。而在TestRule的conditionEvals处,会出现[true or false]=true。

图9-29

Grafana的报警结果如图9-30所示。


来源:https://www.toutiao.com/article/7282640403675873851/?log_from=fe10c476d0c3_1696646143728

“IT大咖说”欢迎广大技术人员投稿,投稿邮箱:aliang@itdks.com





来都来了,走啥走,留个言呗~




 IT大咖说  |  关于版权 

由“IT大咖说(ID:itdakashuo)”原创的文章,转载时请注明作者、出处及微信公众号。投稿、约稿、转载请加微信:ITDKS10(备注:投稿),茉莉小姐姐会及时与您联系!

感谢您对IT大咖说的热心支持!


相关推荐


推荐文章

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/162904
 
75 次点击