无监控不运维,基于Promethus的指标监控架构长啥样?

11,109 阅读6分钟

监控什么数据

image.png

监控主要包括三方面数据:
指标监控:即在运行过程中产生的基础运行指标,例如Linux系统所占用的内存CPU负载、磁盘io线程数量,这些都是运行程序时的基础数据,我们将其称为指标。
链路追踪数据:它与业务相关,如果我们完成某个具体业务需要经过abcd等多个系统完成业务处理,那么中间的处理过程就称为链路追踪。通过链路追踪,我们可以了解在大型分布式系统下,请求从何而来、去向以及中间发生的变化。
日志收集:程序无时无刻都在产生日志。这些日志通常包含许多重要信息,我们需要收集上来,分析问题所在。
今天先将注意力放在指标监控上。

指标监控

所谓指标监控,它是对系统运行的基础指标进行收集整理和展现,通常指标都是以可视化形式展现。

image.png 如图,我们的监控系统可以收集CPU使用率、磁盘读写速率、磁盘容量大小、分时磁盘使用率等性能指标,方便运维同事了解基础运行状态。
在业界中,指标监控工具被称为Prometheus,它是一个开源的系统监控和报警系统,已经加入cncf基金会。在Prometheus之前,加入该基金会的成员是大名鼎鼎的k8s。Cncf非常有实力,它的基础特性是提供了许多种exporter,导出器完成数据指标采集,同时支持PushGateway,即推送网关让程序自定义进行数据上报。Prometheus的性能足以承载上万台规模的服务器集群,因此从性能角度来看完全没有问题。
除了Prometheus之外,我还要向大家介绍另一款组件Grafana,它是一个开源的度量分析与可视化工具,可以通过查询采集的指标数据进行可视化显示。我们刚才看到的图表是由Grafana提供的界面,可以让不同数据以不同的图表进行动态显示,可视化功能做得非常强大,并且十分美观。

首先模拟一个真实环境,假设线上环境运行了4个服务实例,它们都有自己的功能,例如服务a处理订单、服务b处理库存、服务c处理账户和服务d处理用户。这些服务实例在平时运行时没有问题,我们希望在这些服务实例上增加相应的指标监控,以了解当前服务实例的负载情况,以及应该如何操作。
首先,因为这些服务实例都支持水平扩展,所以它们都会向我们的注册中心登记。注册中心的选型非常多,例如著名的阿里巴巴nacos、由奈飞提供的Eureka,这些都是业界中最常用的开源注册中心。我们的服务实例运行后,它们会在注册中心中进行应用登记,只有在注册中心登记后,Prometheus才可以发现这些实例。

我们将关注点放在下面的虚框中,指标监控系统架构。

image.png 这里主要包含5个组件,分别是Prometheus的服务器、PushGateway(推送网关)、tsdb时序数据库(Prometheus内置),Grafana。
关于这些组件如何联动?
首先Prometheus优先提供服务,从注册中心中提取当前每组服务的具体应用实例,例如IP端口号等基本信息。获取这些信息后,关键地方在于Prometheus为了让我们收集到自己应用的监控数据,在运行应用程序时需要在应用程序的电脑上额外安装一些exporter。这些exporter会定时收集系统或者Java应用程序的各项监控指标,将其首先进行本地存储。不同的exporter有不同的职能:

  • node exporter会收集Linux系统当前的运行状态,例如CPU、内存、磁盘等,收集操作系统层面的基础信息。
  • JMS exporter顾名思义是通过jms获取Java应用程序的运行时信息。
  • 最后作为服务地可能比较特殊,有一些非常少见的指标,我们可以通过规则开发属于自己的自定义exporter,完成数据收集与上报。

这些exporter启动后,Prometheus根据服务发现时获取的IP端口信息指向这些exporter,将本地收集到的指标数据全部被Prometheus获取。同时这些数据会被自动持久化到tsdb。Tsdb是著名的时序数据库,因为指标数据无时无刻都与时间相关,所以采用tsdb的选型是非常好的决定。Prometheus会定时向这些exporter中抽取指标监控数据。

这里还有一个特例,例如在实际开发时,有很多特殊场景无法使用explorer获取,没关系,可以通过编码形式收集信息并推送给Prometheus的另一个组件PushGateway。你可以将数据认为是一个特殊的exporter,我们将数据推送给Prometheus,它会定时从push gateway中抽取。PushGateway用于处理这些特殊的监控数据指标。

新问题出现了,虽然Prometheus自带了webUi界面,但是功能非常简陋。如果我们希望提供更多维度和好用的图表面板,那么Grafana将派上用场。Grafaan可以配置Prometheus作为可视化数据源,同时grafna向Prometheus进行交互时使用一种特殊的查询语言,即PromQL(Prometheus Query Language),可以称之为Prometheus查询语言。它的作用与mysql的查询语言sql非常相似,它可以被Prometheus解析。Prometheus从自己的TSDB时序数据库中提取并返回给Grafana,Grafana拿到后再通过图表形式展现,这是一个完整的数据可视化流程。

exporter

在Prometheus的体系下,exporter收集程序具有明确的开发标准和应用场景,官方也提供了许多种不同的exporter方便程序集成。同时Prometheus也提供了大量的社区三方exporter帮助我们进行应用扩展。

Exporter场景默认端口一句话功能
Node ExporterLinux 系统9100CPU、内存、磁盘、网络、负载
Windows ExporterWindows 主机9182CPU、内存、磁盘、IIS、服务
cAdvisorDocker/容器8080容器级 CPU、内存、网络、文件系统
MySQL ExporterMySQL 数据库9104连接数、QPS、慢查询、缓存命中率
PostgreSQL ExporterPostgreSQL9187连接数、锁、缓存、复制延迟
Redis ExporterRedis 缓存9121命中率、内存、命令统计
MongoDB ExporterMongoDB9216连接数、慢查询、OPLog
Kafka ExporterKafka 集群9308消费者延迟、分区偏移、消息速率
Nginx ExporterNginx9113请求量、状态码、上游延迟
Blackbox Exporter网络探测9115HTTP/HTTPS/TCP/ICMP 存活及延迟
Blackbox Exporter网络探测9115HTTP/HTTPS/TCP/ICMP 存活及延迟
Consul ExporterConsul 服务发现9107健康检查、成员状态
Elasticsearch ExporterES9114集群健康、索引、节点负载
JMX ExporterJava 应用8080JVM 堆、线程、GC(零代码集成)