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所示。
图9-30
本文给大家讲解的内容是MySQL性能监控解决方案:Prometheus+Grafana
- 下文给大家讲解的是堆内缓存解决方案:Java堆内缓存与GuavaCache