Prometheus存储拓展

前言

Prometheus可以监控各种不同类型的应用、服务和基础设施。但是它自身也存在着一些瓶颈和问题,比如默认存储方案是使用内置的时序数据库TSDB进行数据存储,这在数据量、采集量偏大的时候往往是性能不够的。

Prometheus监控实现

数据类型

  • 应用程序指标:程序的各种指标,比如请求处理时间、请求速率、错误率等。这些指标通常由程序本身的客户端暴露出来
  • 系统指标:操作系统和服务器硬件的指标,如CPU使用率、内存使用率、磁盘空间等等。这些指标通常是通过操作系统级别的采集工具,比如Node Exporter暴露出来
  • 容器指标:可以监控容器的资源使用情况、运行状态等,这些可以通过容器编排工具如K8S实现
  • 数据库(中间件)指标:可以监控各种数据库的性能,如查询延迟、连接数、事务数等。大多数流行的数据库都支持导出自身指标,比如MySQL\PostgreSQL等等
  • 网络服务指标:监控网络服务的可用性和性能,比如HTTP请求的响应时间、状态码、连接数等等。这可以通过服务自身的指标暴露或通过中间件导出

组件

  • Prometheus Server:负责从各种数据源收集指标数据,并存储在本地的时序数据库中
  • Client Libraries:为了方便应用程序暴露指标,Prometheus提供了多种编程语言的客户端库,如Go Java Python等等,这些库使得应用程序能够轻松的将自身的指标暴露出来
  • Exporters:对于不同的数据源,Prometheus提供了许多指标导出器(Exporter),比如Node Exporter用于收集主机指标,Blackbox Exporter用于对无进行测探

采集过程

  1. Instumentation:仪表盘,在程序中需要使用Prometheus的客户端,进行指标的主动采集
  2. Exporting and Scraping:Server主动的定期从指定的数据源拉取指标数据,一般是30S一次,通过HTTP端点进行拉取
  3. Storage:Server将采集到的时间序列数据存储在本地的时间序列数据库中
  4. Queries and Alerting:通过PromQL对数据进行查询、分析和可视化操作

Prometheus的瓶颈

prometheus使用自己的本地存储引擎来存储时间序列数据,这个存储引擎可能会在大量写入数据的时候遇到性能问题,尤其是当需要保留长时间的历史数据时,prometheus的原生数据库TSDB是扛不住这个压力的。

prometheus的单机容量大概能支撑住每秒接受80万个数据点,当单机开始撑不住的时候可以考虑升级硬件或者使用分布式块存储。

但是其实不是所有场景都需要去拓展Prometheus的容量,因为数据量根本达不到单机的Prometheus的容量上限,假设每台机器每个周期大概采集100个指标,采集频率是10S/次,那么极限情况下,可以同时监控的机器数量是20W台,当然这里没有考虑到采集中间件的指标,实际上,很多中间件抛出指标是很多的。

解决方案

联邦集群

如果一个Prometheus实在扛不住,那么还可以考虑多Prometheus集群,也就是联邦集群方案

联邦集群可以看做是Prometheus内置的一种集群方式,核心就是Prometheus数据的级联抓取,它能够使得不同的Prometheus数据聚拢在一个中心的Prometheus中

原本一个Prometheus解决不了的问题,拆成了多个,然后又把多个Prometheus的数据聚拢到中心的Prometheus中。但是,中心的Prometheus仍然是个瓶颈。所以,在联邦机制中,中心端的Prometheus去抓取边缘Prometheus数据的时候,不应该把所有数据都抓取到中心,而是应该只抓取那些需要做聚合计算或者需要关注的指标,大部分数据应该下沉在各个边缘Prometheus中消化掉

如何做到只抓取特定的指标到中心端呢?通过match[]参数,指定过滤条件就可以实现

yaml 复制代码
scrape_configs:
  - job_name: 'federate'
    scrape_interval: 30s
    honor_labels: true
    metrics_path: '/federate'
    params:
      'match[]':
        - '{__name__=~"aggr:.*"}'
    static_configs:
      - targets:
        - '10.1.2.3:9090'
        - '10.1.2.4:9090'

联邦这种机制,可以落地的核心要求是:边缘Prometheus基本消化了绝大部分的指标数据,比如告警、看图等等,都在边缘的Prometheus上搞定了。只有少量数据,比如需要关注的指标被拉取到中心Prometheus,这样就不会触达中心端的容量上限。这就需要对Prometheus的数据聚合建立规范,什么样的数据应该在边缘端被消化,什么样的数据应该被传达到中心端

远程存储

默认情况下,Prometheus收集到监控数据之后是存储在本地,在本地查询、计算。由于单机容量有限,对于海量数据的场景,需要有其他的解决方案。最直接的想法就是:既然本地搞不定,那就在远端做一个集群,分治处理

Prometheus本身不提供集群存储能力,而是建立了一套同一的Remote Read和Remote Write接口协议,只要满足这个协议的时序库都可以对接进来,作为Prometheus remote storage使用,目前使用最广泛的应该是VM(VictoriaMetrics)和(Thanos)

推荐阅读

当说到云原生时,我们究竟在谈论什么? - 掘金

不太熟悉Git? 不妨看看这篇文章 - 掘金

一文搞定常见分布式事务实现 - 掘金

你真的理解分布式理论吗? - 掘金

深入了解异地多活 - 掘金

02.K8S架构详解 - 掘金

01.你为什么需要学习K8S - 掘金

相关推荐
易元3 分钟前
模式组合应用-桥接模式(一)
后端·设计模式
柑木7 分钟前
隐私计算-SecretFlow/SCQL-SCQL的两种部署模式
后端·安全·数据分析
灵魂猎手9 分钟前
1. Mybatis Mapper动态代理创建&实现
java·后端·源码
泉城老铁10 分钟前
在秒杀场景中,如何通过动态调整线程池参数来应对流量突增
后端·架构
小悲伤10 分钟前
金蝶eas-dep反写上游单据
后端
用户91942877459511 分钟前
FastAPI (Python 3.11) Linux 实战搭建与云部署完全指南(经验)
后端
板板正28 分钟前
Spring Boot 整合MongoDB
spring boot·后端·mongodb
bobz9651 小时前
恶补 vhost,vDPA
后端
泉城老铁1 小时前
在高并发场景下,如何优化线程池参数配置
spring boot·后端·架构
泉城老铁1 小时前
Spring Boot中实现多线程6种方式,提高架构性能
spring boot·后端·spring cloud