Prometheus结合VictoriaMetrics:更高效、稳定的多集群监控方案

云掣YunChe11个月前技术文章2826
在Prometheus的架构中,其核心组件包括Prometheus Server、Exporters、Alertmanager等,它采用基于拉的模型收集指标数据,并存储在本地TSDB中,支持通过PromQL查询语言进行数据查询或聚合。作为开源监控系统,Prometheus因其灵活的数据采集、存储、查询和告警功能,在云原生环境中得到了广泛的应用。然而,随着监控规模的不断扩大,Prometheus在数据保留时间、系统稳定性和扩展性等方面面临困境。


VictoriaMetrics作为Prometheus的长期存储解决方案,其架构主要包括vmstorage、vminsert、vmselect等组件,通过一致性hash和副本机制保证数据的可用性和一致性,并采用无共享架构提高集群的可用性。其性能、性价比和易扩展性,可以成为大规模监控任务的强有力替代方案,使用VictoriaMertrics统一维护管理告警,能有效减轻日常维护任务的负担。
因此,在多集群监控的场景中,我们可以将Prometheus和VictoriaMetrics结合,为多集群监控提供有效的解决方案。


 Prometheus集群管理的痛点


数据储存能力缺失
Prometheus仅存指标数据,而监控往往需要采集多样的结构化、半结构化甚至无结构化的数据,这意味着在构建监控方案时,Prometheus只能提供部分存储能力。
数据储存时间短暂
监控系统往往需要考虑数据存留的时间,且在不同场景下存留时间会出现不同的需求,Prometheus设计时并没有针对这些需求做特殊的考虑和设计。
告警操作流程复杂
在管理多个Kubernetes集群时,需要为每个集群单独配置/维护告警,显得尤为繁琐。


 建设方案

方案简介

为了实现将Prometheus和VictoriaMetrics结合的方案,并且尽量减少对集群资源的占用,我们将架构做如下优化:

  • 集群中仅部署Promethues及Exporters,并且尽量减少需要在集群中部署的组件。
  • 通过Promethues的remote_write功能,将监控数据统一写入到VictoriaMetrics。
  • 使用vmalert配置告警,并且发送到alertmanager进行告警推送。


架构图如下所示 ⬇️ :
图片


  建设内容


 Prometheus与VictoriaMetrics的集群部署
部署前准备:


  • 系统环境配置:确保系统满足Prometheus和VictoriaMetrics的运行要求。

  • 网络规划:合理规划网络拓扑,确保各组件间通信顺畅。

  • 资源分配:根据监控规模和数据量,合理分配CPU、内存和存储资源。


Prometheus配置重点:


  • remote_write配置:在Prometheus配置文件中添加remote_write配置,指定VictoriaMetrics集群的地址和认证信息,使Prometheus能够将数据远程写入VictoriaMetrics集群。

  • 服务发现:使用Prometheus的服务发现机制自动发现监控目标。


VictoriaMetrics集群部署:


  • 组件部署:按照官方文档或最佳实践,部署vmstorage、vminsert、vmselect等组件,并配置相应的副本数和资源限制。

  • 配置优化:根据业务需求和数据量,调整组件的配置参数,如复制因子、数据块大小等,以优化存储效率和查询性能。

 Prometheus部署


这里我们采用helm的方式来部署prometheus,具体使用的chart包为kube-prometheus-stack。
添加Helm仓库并获取values文件:




# 添加Helm仓库helm repo add prometheus-community https://prometheus-community.github.io/helm-charts# 获取values文件helm show values prometheus-community/kube-prometheus-stack  > kube-prometheus-stack-values.yaml
修改values文件:
这里不建议开启grafana组件和alertmanager组件,相关组件将会配置到监控集群中以节省资源并统一进行管理,如有需求也可以根据需求进行变化。











# 关闭service Monitor选择器serviceMonitorSelectorNilUsesHelmValues: false# 关闭pod Monitor选择器podMonitorSelectorNilUsesHelmValues: false# 添加remotewrite配置# 这里domain为VictoriaMetrics的地址remoteWrite:- url: http://domain.com/api/v1/write# 为集群采集到的数据添加标识externalLabels:datacluster: clustername
其他选项根据自己的需求进行调整即可。


  • service monitor选择器和pod monitor选择器可以不关闭,关闭后Prometheus会识别集群内所有的servermonitor和podmonitor。如果不关闭则servermonitor和podmonitor需要带有特定标签才会被识别。

  • externalLabels是为了在数据采集到VictoriaMetrics后区分监控数据是从那个集群发送的,具体的key: values可自行选择。配置externalLabels所有的监控数据都会带上配置的label。

 VictoriaMetrics部署


这里我们采用helm的方式来部署VictoriaMetrics ,具体使用的chart包为victoria-metrics-single。
添加Helm仓库并获取values文件:





# 添加Helm仓库helm repo add vm https://victoriametrics.github.io/helm-charts/
# 获取values文件helm show values vm/victoria-metrics-single  > victoria-metrics-single-values.yaml
修改values文件:











# 配置存储storageClass:"local-path"size: 50Gi# ingress配置ingress:enabled: trueannotations: {}hosts:- name: vmselect.cefso.onlinepath: /port: http
查看数据:
配置完成后即可在VictoriaMetrics查看prometheus监控数据。
图片

查看监控数据相关的label即可发现,数据上包含设置的externalLabels。

图片


 VictoriaMetricsAlert部署


获取values文件:


# 获取values文件helm show values vm/victoria-metrics-alert  > victoria-metrics-alert-values.yaml
修改values文件(添加告警规则):































# victoria metrics地址datasource:url:"http://vmselect.cefso.online"
# alertmanger地址notifier:alertmanager:url:"http://alertmanager.cefso.online"
#配置ingressingress:enabled: truehosts:- name: vmalert.cefso.onlinepath: /port: http#配置告警规则configMap:""config:alerts:groups:- name: k3s节点状态rules:- alert: k3s节点状态expr: up{datacluster="k3s",job="node-exporter"}<= 0for: 1mlabels:status: warningannotations:summary:"k3s节点状态异常"description:"异常节点{{$labels.instance }}"
查看告警规则:
部署完成后即可登录到vmalert查看相关告警规则,这里需要注意当配置告警规则的时候,可以通过externalLabels来实现不同集群配置不同的告警规则。如果一个告警规则需要在多个集群内同时生效,修改告警规则中的externalLabels匹配范围即可。后续需要增加告警规则,只需要更新 victoria-metrics-alert-values.yaml,并且更新victoria-metrics-alert即可。

图片

图片


 

知识拓展



 优化建议


 Prometheus与VictoriaMetrics数据保留时间调整
由于期望数据由VictoriaMetrics进行保存而不是Prometheus(VictoriaMetrics的数据压缩可以达到10倍以上的压缩率,大大节省存储空间,同时Prometheus官方也不建议使用Promethues自身TSDB作为数据的长期存储),所以Promtheus的数据保留时间可以不进行调整,而VictoriaMetrics的数据保留时间可以根据需求进行调整。



# 修改victoria-metrics-single-values.yaml文件中相关字段# -- Data retention period in monthretentionPeriod: 1
 在Victoria Metrics Alert配置告警
使用Victoria Metrics Alert统一管理告警,避免由于集群数量增加而导致告警难以维护。同时需要合理规划Prometheus的externalLabels 避免后续由于externalLabels 规划不合理导致的监控数据难以维护。










- name: k3s节点状态rules:- alert: k3s节点状态expr: up{datacluster="k3s",job="node-exporter"}<= 0for: 1mlabels:status: warningannotations:summary:"k3s节点状态异常"description:"异常节点{{$labels.instance }}"


  多集群监控实战


监控目标定义


  • 明确需要监控的多集群环境,包括Kubernetes集群、Docker容器、物理机等。
  • 根据监控目标选择合适的Exporters进行数据采集。


数据采集


  • Prometheus通过配置的Exporters采集监控目标的指标数据。
  • 数据采集完成后,Prometheus将数据通过remote_write接口远程写入VictoriaMetrics集群。


数据存储与查询


  • VictoriaMetrics集群接收Prometheus写入的数据,并将其存储在vmstorage节点中(上面示例中采用单节点部署,所以没有vmstorage节点,生产环境和大规模集群可以使用多节点部署,提高可靠性)。
  • 用户通过vmselect节点使用PromQL或MetricsQL查询语言查询监控数据,实现数据的实时分析和可视化展示。


告警与通知


  • 使用vmalert组件配置告警规则,基于PromQL/MetricsQL表达式监控指标状态。
  • 当指标状态触发告警规则时,vmalert将告警信息发送给Alertmanager进行处理和通知。
  • Alertmanager根据配置的通知渠道(如邮件、Slack等)发送告警通知给相关人员。

  性能优化与故障排查


性能优化


  • 资源分配:根据监控数据量和查询负载动态调整组件的资源分配,确保系统稳定运行。
  • 数据压缩与合并:利用VictoriaMetrics的数据压缩和后台合并机制减少存储空间占用和提高查询效率。
  • 查询优化:通过合理使用PromQL/MetricsQL查询语言的特性和技巧优化查询性能。


故障排查


  • 监控自身健康:通过VictoriaMetrics的内置监控功能监控集群的健康状态及时发现潜在问题。
  • 日志与诊断:利用组件的日志文件进行问题诊断快速定位并解决故障。
  • 数据一致性检查:定期检查数据一致性确保监控数据的准确性和可靠性。



 总结
Prometheus结合VictoriaMetrics的多集群监控方案解决Prometheus在数据保留、系统稳定性和扩展性等方面的问题:通过Prometheus和VictoriaMetrics的结合使用,合理分配资源,有效地提升了数据保留时间,减少数据存储空间占用,大大提高了查询效率;此外,也增强了数据监控系统的稳定性,优化了查询性能,实现更加高效可靠的多集群监控方案。



相关文章

MySQL gh-ost DDL 变更工具

MySQL gh-ost DDL 变更工具

1. MDL 锁介绍MySQL 的锁可以分为四类:MDL 锁、表锁、行锁、GAP 锁,其中除了 MDL 锁是在 Server 层加的之外,其它三种都是在 InnoDB 层加的。下面主要介绍一下:MDL...

数仓主流架构简介之一

数仓主流架构简介之一

一、Lambda架构Apache Storm的创建者Nathan Marz于 2011 年开发,旨在解决大规模实时数据处理的挑战。Lambda数据架构提供了一个可扩展、容错且灵活的系统来处理大量数据。...

阿里金融云经典网络和线下某银行实现网络互通

阿里金融云经典网络和线下某银行实现网络互通

需求某银行需要和某阿里金融云账号下的经典网络实例内网打通。已知不考虑将该服务器从经典网络类型迁移至VPC类型。阿里金融云环境下,之前是支持拉线下到经典网络专线的,但是目前和阿里侧核查,确认已不支持,仅...

开源大数据集群部署(四)Freeipa部署(kerberos+ldap)

开源大数据集群部署(四)Freeipa部署(kerberos+ldap)

1、 FreeIPA介绍Kerberos协议只是一种协议标准的框架,而MIT Kerberos则是实现了该协议的认证服务,是Kerberos的物理载体。将它与Hadoop服务进行集成便能够很好地解决安...

MongoDB的碎片化问题

一、碎片化问题1.1 为什么会出现碎片化的问题在生产业务中,一般会对集合数据进行频繁的增删改,常见的碎片化原因有:1、记录被remove,但是其空间没有被复用drop命令会直接删除集合的物理文件,空间...

K3S部署和使用

K3S部署和使用

k3s介绍k3s是一个高可用的、经过CNCF认证的Kubernetes发行版,专为无人值守、资源受限、偏远地区或物联网设备内部的生产工作负载而设计。k3s安装参考文件使用配置文件安装k3s为了保证k3...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。