周 浩,蔡永健,顾丹鹏,陈肖勇
(1.中国电建集团华东勘测设计研究院有限公司,浙江 杭州 311100;2.浙江华东工程数字技术有限公司)
最新的DB-Engines 中,MySQL 以1211.53 分高居第二,在开源的关数据库当中排名第一[1]。但是MySQL 也有不少缺点,随着数据不断增加,MySQL 的InnoDb 引擎[2]在执行SQL 时,性能会显著下降,根据B+树[3]的特点,MySQL 的最大单表存储约在1000 万。开发人员滥用SQL 和索引造成MySQL 的性能急剧下降,在高并发的环境可能造成服务雪崩的灾难性故障。为了避免故障,MySQL运维工程师需要一套完整的方案提前预警。Prometheus是一个开源的监测和预警工具集,能够提供丰富的度量指标、高度可定制的云原生监控系统。它能够实时采集MySQL 的关键指标。Grafana是一款开源数据可视化工具,可以完美集成Prometheus API,做数据监控和数据统计,支持告警功能,根据用户自定义的查询规则制定不同的告警策略,让MySQL DBA 实时的监控数据库运行状态,提前给上层业务发出风险预警;同时也能够让开发工程师充分了解SQL 的运行状态,从而调整不同的策略,来纠正容易引发故障的SQL,保证项目的稳定。
Prometheus 是一个高度可定制的云原生监控系统[4],为现代DevOps[5]工作提供关键组件,监视云原生应用,与Kubernetes[6]完美协同,能够抓取或拉取应用程序的时间序列数据。
Prometheus 将数据存储成时间序列,每个时序列数据都具有带时间戳的数据流,每一个数据流都由其指标(Metric)和一组键值对的标签唯一标识。它提供Counter,Gauge,Histogram,Summary 四种指标类型。Counter 是一个累加器,随着时间不停累加;Gauge 可以上下浮动;Histogram 表示一段时间内指定区间的数据的分组统计;Summary 能够提供样本的累加,求和以及求百分比的功能。在Prometheus 中每一个提供HTTP的服务都称之为一个实例(Instance)。而有相同实例集合可以称之为作业(Job)。Exporter 是目标监控系统收集的数据转化为对应的文本格式,并且对外提供HTTP协议的接口,供Prometheus定期采集数据。
易管理性,Prometheus 只有单独的一个二进制文件,不存在任何第三方依赖,基于Pull模型的架构可以在任何环境搭建监控系统。
灵活的数据模型,监控数据是由值、时间戳和标签表组成的,监控数据完全记录在标签表里。
Prometheus支持监控数据采集阶段对数据的标签表镜像修改,使其具备强大的扩展能力。
良好的性能,强大的查询能力。
Prometheus 官方提供的在硬件资源满足情况下,单个实例Prometheus可以处理数以百万计的监控指标和数十万个数据点,并且内置了强大的PromQL,提供了大量数据计算函数,应用于数据可视化及告警。
健全的生态,Prometheus 可以迅速在应用程序里集成,目前已支持Java、JMX、Python、Go、MySQL 等多种客户端SDK。
Grafana 是一个跨平台的开源的度量分析和可视化工具,它可以将采集的监控数据进行可视化的展示,并且及时通知监控的告警信息。
DashBoard,仪表盘。Row,DashBoard 的基本组成单元,一个DashBoard 可以包含一个或者多个Row。Panel 是Row 展示的信息,支持表格,列表,热图等多种方式。Query Editor 是查询编辑器,用来指定获取数据。支持PromQL查询。
Grafana支持多种客户端图表,支持热图,折线图,柱状图,饼状图,图表等多种展示方式,支持多种不同的时间序列存储。每个数据源都有一套特定的查询编辑器与Prometheus完美协同。基于仪表盘可以添加丰富的报警规则,以及报警策略。Grafana 可以支持企业邮箱,短信,钉钉等推送工具来实现报警。
Linux操作系统自身不支持Prometheus,但Prometheus官方提供了NodeExporter 来实现对Linux 操作系统主机的监控数据采集。如图1 所示,它可以提供操作系统层的几乎所有监控,例如CPU 利用率,内存,磁盘空间,I/O,以及网络带宽。并且它还提供很多内核公开的额外监控指标,从负载均衡到主板温度等等。Node Exporter 通过脚本从Linux 内核采集到监控数据,Prometheus 通过轮询策略,不断从Linux Node Exporter 拉取数据存储到时序数据库中,供给Grafana去展示。
图1 LinuxOS监控原理图
MySQL 也不提供端点,Prometheus 无法直接从MySQL Sever获取监控指标。MySQL Server Exporter恰好解决这个问题。如图2 所示,它和Node Exporter的工作原理类似,通过底层应用程序从目标应用程序中提取监控指标,然后通过RESTAPI 公开这些指标,提供给Prometheus采集。
图2 MySQL Sever监控原理图
工程数据中心项目是基于SpringCloud 为基础组件,运用微服务思想设计的一套对工程数据的挖掘,分析的数据中台产品。
根据第三章的工作原理,首先需要将Node Exporter下载安装到主机服务器。解压启动Node Exporter以后将Node Exporter 服务添加为开机启动,然后将Node Exporter 与Prometheus 进行关联。在Prometheus 主机目录中找到配置文件,修改staticconfigs配置就可以采集nodeexporter提供的数据。Static config配置如下:
node_cpu_seconds_total是CPU的信息的重要采集指标。它是一个Counter类型的指标,用来标识每个核下面的各个模式的占用时间。node_meory_Memtotal_bytes是内存数据监控的重要指标,这些监控数据来源于Linux 系统中的/proc/meminfo 文件。磁盘数据的主要指标是node_disk_read_time_seconds_total,它来源于Linux 系统中的/proc/disktats 文件。文件的监控数据metric 都是以“node_filesytem_”开始,数据类型都为Gauge 类型。网络相关监控数据的所有“metric”都以“node_work”开始,可分为发送和监控两类。如图3 所示,通过Grafana 可以完成对主机的CPU,内存,文件,网络等核心指标的监控。
图3 主机监控图
为了获取MySQL Server 自身的监控数据,需要使用MySQL Exporter,然后将Prometheus 与MySQL Exporter 进行关联,修改Prometheus 的启动配置,添加MySQL Exporter的targets,配置如下。
MySQL Exporter 启动以后,Prometheus 就可以采集Metric 指标。MySQL 的查询吞吐量,查询执行性能,连接和缓冲池使用是其重要的监控指标。MySQL内部提供一个Questions 的内部计数器,对应监控指标为mysql_global_status_questions,用来描述查询吞吐量。Slow queries 可以用做慢查询的监控,当SQL执行时间超过long_query_time 参数时,计数器就会增加,对应的指标mysql_globals_status_slow_queries也会增加。为了防止MySQL 过载运行,DBA 需要根据业务进行评估设置合理的客户端连接的数量。MySQL 启动的时候根据my.cnf 文件的max_connections 设置最大连接数,也可以根据mysql_global_variables_max_connections 查看当前最大的连接数,mysql_global_status_threads_connected 记录已存在的连接数,DBA 根据上述连接数的指标来监控MySQL的连接。InnoDB是MySQL的默认引擎,使用缓冲池来缓存表和索引的数据,可以通过mysql_global_status_innodb指标进行查看InnoDB 的运行指标。上述指标采集完成以后,如图4所示,可以通过Grafana查看MySQL Server的监控。
图4 数据库监控图
本文介绍了通过Prometheus 实现对MySQL 主机和MySQL Server 的监控实践,为企业的数据存储提供技术保障。数据库的监控,在微服务的监控体系下仅仅是一小部分的内容,因此,完善整个微服务自上而下的全链路监控是保障系统稳定和用户体验必不可少的措施,也是我今后探索的方向。