百度可观测系列 | 采集亿级别指标,Prometheus 集群方案这样设计
connygpt 2024-12-16 11:37 8 浏览
【百度云原生导读】在前一篇《基于 Prometheus 的大规模线上业务监控实践》中,我们为大家介绍了针对大规模业务监控场景,百度云原生团队基于 Prometheus 技术方案的一些探索,包括基于 Prometheus 进行指标降维、Prometheus 的自动分片采集、以及基于 Flink 流式计算构建的预计算。
本文将深入采集专题,为大家介绍如何构建采集亿级别指标的高可靠Prometheus 集群。
采集亿级别指标,通常会面临三大类问题:一是网络带宽打满、Prometheus大内存、Prometheus计算 CPU 利用率高等一系列资源类问题;二是如何构建高可用、高可靠的集群,如何确保监控数据的不丢不重等高可用类问题;三是集群的自动弹性扩缩,如何进一步降低运维成本等运维类问题。只有解决好这三类核心问题才能构建出一套理想的 Prometheus 采集集群。
为此,百度云原生团队针对 Prometheus 提出了“流计算加速”、“高可用HA”、“感知采集压力的自动分片管理”等多项“外科手术式打击”般的精准解决方案,最终实现了亿级别指标的采集。
下文将从“资源、高可用、运维”三个方面,为大家带来我们的实战经验。
资源
采集开压缩,降低网络带宽压力
按照单指标100b大小、5s采集一次计算,采集亿级别指标,采用千兆网卡也存在网卡被打满现象;另外监控作为服务的旁路系统,首先要保证的是不能影响业务的正常使用。Prometheus 自身支持带压缩的采集,只需将 Exporter 中 HTTP Content-Encoding 设置为 Gzip 即可开启。经实际测试,开启压缩后,压缩率通常在几十分之一,这样就可降低网络带宽压力;如果 Exporter 吐出数据块相同部分较多,压缩将更加有效。
指标压缩+加快数据落盘,避免大内存问题
Prometheus 大内存问题是被经常诟病的问题之一,随着数据采集时长增加,Prometheus CPU 和内存都会升高,但内存会首先达到瓶颈,这会导致 Prometheus 发生OOM 造成重启,采集发生中断。为解决这个问题,我们可以从以下两方面入手:
减少维度数量,缩短指标、维度长度来减少内存使用:Prometheus 将最近拉取的数据保存在内存中,提供实时数据的高效查询;另外加载查询历史数据时,需要将历史数据加载到内存中。如果维度数量多或者指标、维度字符长度过长,内存使用量就会越大。因此可以通过减少维度数量、或者缩短指标、维度字符长度来降低内存使用量。需要注意的一点是缩短指标和维度时,对于指标能够反映出其所属的域以及指标单位,对于维度可反映该实例的维度特征。
加快 block 数据落盘频率来释放内存:Prometheus 内存消耗主要是因为每隔2小时做一次 block 数据落盘,落盘之前所有数据都在内存里面,默认是2h落盘一次。因此可以通过调整 Prometheus 内存数据保存时长,加快落盘频率来释放内存。在生产环境可根据实际情况进行缩短,如调整到半小时级别。
引入流式计算,降低 CPU 使用
Prometheus 提供了预聚合 (Recording Rule) 可以让我们对一些常用的指标或者计算相对复杂的指标提前计算,然后将这些数据存储到新的数据指标中,查询这些计算好的数据将比查询原始的数据更快更便捷。但 Prometheus 提供的预聚合采用的是“批计算”,Prometheus 首先会缓存所有指标,在窗口将要关闭时进行实时查询计算,这对于承担大规模采集任务的 Prometheus 是致命的,因为在每次执行计算时,会消耗大量的CPU,同时计算的延迟特别大,对于万级别的指标量计算延迟将达到分钟级别,考虑到后续报警等通路的延迟,这样的延迟在预计算侧显然是不能接受的。
针对预计算慢的问题,通过自研 Adapter 模块将“批计算”改为“流计算”来加速。以计算每个周期的总请求数为例,使用 PromQL 可以通过前后两个周期的 Sum 值相减来计算,并在 PromQL 中指定需要保留的维度,但 PromQL 计算时减法、求和是发生在计算窗口关闭时;而使用 Adapter 的流计算,其具体做法是:
1. Adapter 模块与 Prometheus 同 Pod 部署,并实时读取 Prometheus 的 WAL 数据;
2. Adapter 模块缓存了该 Prometheus 上个采集周期所有时序数据的值,读取到本周期的值后减去上个周期值,作为该时序数据本周期的增量值;
3. 求得本周期增量值后,根据用户配置的汇聚规则直接将该增量值累加为和值;
4. 当计算窗口关闭时,可直接输出累加的和值;
可以看到 Adapter 通过以数据驱动的流处理达到了计算加速的效果。同时 Adapter 模块同时还可执行指标的黑白名单过滤、指标标签的 Relabel 等操作。常规的 Prometheus数据发送是通过 Remote Write 方案,使用该方案需要对时序数据经过多次的序列化与反序列化,同时还有数据传输上的消耗,使用 Adapter 直接读取 WAL 数据则避免了这些消耗,降低了 CPU 的使用。
高可用 HA
Prometheus 有本地存储数据能力,但 Prometheus 之间没有数据同步能力。所以要想在保证可用性的前提下再保持高可用,使用 HA 是最佳的方案。将采集的任务分 Shard,每个 Shard 包含两个 Prometheus 副本。每个副本都有自己对应的 Sidecar Adapter。Adapter 做选主逻辑,只有主 Adapter 对应的 Prometheus 副本数据能推送到后续通路,这样可以保证一个异常,另一个也能推送成功,确保数据的不丢不重。在实现 Adapter 的选主可以有多种方案,比如 Raft、依赖 Zookeeper 等。由于部署在 K8s 集群中,从时效性、可运维性等方面考虑,基于 K8s Lease 资源,实现租约机制的选主方案是最佳方案。采用该方案在 Prometheus 异常、Adapter 异常甚至两者都异常时都可在5s内实现主备切换,确保了采集数据的不丢失。
与常见的 Prometheus 高可用方案 Federate、Cortex、Thanos 相比,使用基于Adapter 做数据去重的方案可以避免如下问题:Federate 方案需要逐层做数据聚合,将减少的后的数据传输到中央 Prometheus 中,故其适用于最终分析的数据量偏少的场景。Thanos 的数据去重是查询时数据去重,这意味着 Thanos 会存储多份的冗余数据,存储的开销也会相应地更大 。
采用云原生部署,降低运维成本
作为新一代的开源监控解决方案,Prometheus 自身具有强大的采集性能,单实例采集能力可达百万级别指标。如果采集亿级别指标,粗略估算需要几百台服务器;再考虑采集集群的容灾、冗余等问题,消耗的服务器资源甚至可达上千台。若维护这上千台服务器需要耗费大量的成本。为降低运维成本,在这里我们采用 容器+K8S 的云原生部署模式,将 Prometheus 部署到 K8S 集群中。
考虑到 Exporter 吐出的指标量会随着新指标、新维度的出现发生变化,导致 Prometheus 的采集压力发生变化。我们还自研了 PromAgent 与 PromScheduler 模块,PromAgent实时感知 Prometheus 采集压力的变化,并上报给 PromScheduler;PromScheduler 收到采集压力数据后,其分片管理功能根据自动分配算法进行自动伸展。
结语
在本文中,我们聚焦于采集专题,介绍了采集亿级别指标的 Prometheus 集群设计方案,包括“资源、高可用、运维“这三方面。在后续的系列文章中,我们将继续从计算、存储和报警等各环节出发,继续探讨如何基于 Prometheus 构建高性能、低延迟、高可用的监控系统,敬请期待。
了解更多微服务、云原生技术的相关信息,请关注我们的微信公众号【百度云原生】!
相关推荐
- 3分钟让你的项目支持AI问答模块,完全开源!
-
hello,大家好,我是徐小夕。之前和大家分享了很多可视化,零代码和前端工程化的最佳实践,今天继续分享一下最近开源的Next-Admin的最新更新。最近对这个项目做了一些优化,并集成了大家比较关注...
- 干货|程序员的副业挂,12个平台分享
-
1、D2adminD2Admin是一个完全开源免费的企业中后台产品前端集成方案,使用最新的前端技术栈,小于60kb的本地首屏js加载,已经做好大部分项目前期准备工作,并且带有大量示例代码,助...
- Github标星超200K,这10个可视化面板你知道几个
-
在Github上有很多开源免费的后台控制面板可以选择,但是哪些才是最好、最受欢迎的可视化控制面板呢?今天就和大家推荐Github上10个好看又流行的可视化面板:1.AdminLTEAdminLTE是...
- 开箱即用的炫酷中后台前端开源框架第二篇
-
#头条创作挑战赛#1、SoybeanAdmin(1)介绍:SoybeanAdmin是一个基于Vue3、Vite3、TypeScript、NaiveUI、Pinia和UnoCSS的清新优...
- 搭建React+AntDeign的开发环境和框架
-
搭建React+AntDeign的开发环境和框架随着前端技术的不断发展,React和AntDesign已经成为越来越多Web应用程序的首选开发框架。React是一个用于构建用户界面的JavaScrip...
- 基于.NET 5实现的开源通用权限管理平台
-
??大家好,我是为广大程序员兄弟操碎了心的小编,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节省开发效率,实现不加班不熬夜不掉头发,是我的目标!??今天小编推荐一款基于.NE...
- StreamPark - 大数据流计算引擎
-
使用Docker完成StreamPark的部署??1.基于h2和docker-compose进行StreamPark部署wgethttps://raw.githubusercontent.com/a...
- 教你使用UmiJS框架开发React
-
1、什么是Umi.js?umi,中文可发音为乌米,是一个可插拔的企业级react应用框架。你可以将它简单地理解为一个专注性能的类next.js前端框架,并通过约定、自动生成和解析代码等方式来辅助...
- 简单在线流程图工具在用例设计中的运用
-
敏捷模式下,测试团队的用例逐渐简化以适应快速的发版节奏,大家很早就开始运用思维导图工具比如xmind来编写测试方法、测试点。如今不少已经不少利用开源的思维导图组件(如百度脑图...)来构建测试测试...
- 【开源分享】神奇的大数据实时平台框架,让Flink&Spark开发更简单
-
这是一个神奇的框架,让Flink|Spark开发更简单,一站式大数据实时平台!他就是StreamX!什么是StreamX大数据技术如今发展的如火如荼,已经呈现百花齐放欣欣向荣的景象,实时处理流域...
- 聊聊规则引擎的调研及实现全过程
-
摘要本期主要以规则引擎业务实现为例,陈述在陌生业务前如何进行业务深入、调研、技术选型、设计及实现全过程分析,如果你对规则引擎不感冒、也可以从中了解一些抽象实现过程。诉求从硬件采集到的数据提供的形式多种...
- 【开源推荐】Diboot 2.0.5 发布,自动化开发助理
-
一、前言Diboot2.0.5版本已于近日发布,在此次发布中,我们新增了file-starter组件,完善了iam-starter组件,对core核心进行了相关优化,让devtools也支持对IAM...
- 微软推出Copilot Actions,使用人工智能自动执行重复性任务
-
IT之家11月19日消息,微软在今天举办的Ignite大会上宣布了一系列新功能,旨在进一步提升Microsoft365Copilot的智能化水平。其中最引人注目的是Copilot...
- Electron 使用Selenium和WebDriver
-
本节我们来学习如何在Electron下使用Selenium和WebDriver。SeleniumSelenium是ThoughtWorks提供的一个强大的基于浏览器的开源自动化测试工具...
- Quick 'n Easy Web Builder 11.1.0设计和构建功能齐全的网页的工具
-
一个实用而有效的应用程序,能够让您轻松构建、创建和设计个人的HTML网站。Quick'nEasyWebBuilder是一款全面且轻巧的软件,为用户提供了一种简单的方式来创建、编辑...
- 一周热门
- 最近发表
- 标签列表
-
- kubectlsetimage (56)
- mysqlinsertoverwrite (53)
- addcolumn (54)
- helmpackage (54)
- varchar最长多少 (61)
- 类型断言 (53)
- protoc安装 (56)
- jdk20安装教程 (60)
- rpm2cpio (52)
- 控制台打印 (63)
- 401unauthorized (51)
- vuexstore (68)
- druiddatasource (60)
- 企业微信开发文档 (51)
- rendertexture (51)
- speedphp (52)
- gitcommit-am (68)
- bashecho (64)
- str_to_date函数 (58)
- yum下载包及依赖到本地 (72)
- jstree中文api文档 (59)
- mvnw文件 (58)
- rancher安装 (63)
- nginx开机自启 (53)
- .netcore教程 (53)