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

云掣YunChe3周前技术文章136
在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的结合使用,合理分配资源,有效地提升了数据保留时间,减少数据存储空间占用,大大提高了查询效率;此外,也增强了数据监控系统的稳定性,优化了查询性能,实现更加高效可靠的多集群监控方案。


相关文章

Apache Ranger不使用root密码进行初始化

1、背景由于使用的数据库由dba进行管理,我们无法获取到对应的ranger数据库的root密码。需要使用数据库普通用户对表进行初始化2、解决ranger admin每次修改配置(install.pro...

em升级&添加节点实践

em升级&添加节点实践

一、扩容前准备 1.格式化磁盘分区并挂载(1)设置gpt分区表          &nbs...

聊一聊什么是分布式系统

聊一聊什么是分布式系统

分布式系统原理1 概念1.1 模型节点在具体的工程项目中,一个节点往往是一个操作系统上的进程。在本文的模型中,认为节点是一个完整的、不可分的整体,如果某个程序进程实际上由若干相对独立部分构成,则在模型...

Clickhouse MergeTree异常数据处理

说明clickhouse mergetree的数据文件如果遇到数据损坏,可能会导致clickhouse无法启动。本文章说明如何处理这类问题。测试我们先人为模拟破坏mergetree数据文件:detac...

Elasticsearch数据生命周期如何规划

Elasticsearch中的open状态的索引都会占用堆内存来存储倒排索引,过多的索引会导致集群整体内存使用率多大,甚至引起内存溢出。所以需要根据自身业务管理历史数据的生命周期,如近3个月的数据op...

大数据即席查询-Kylin

大数据即席查询-Kylin

一、Kylin 定义 Apache Kylin 是一个开源的分布式分析引擎,提供 Hadoop/Spark 之上的 SQL 查询接口 及多维分析(OLAP)能力以支持超大规模数据,最初由 eBay I...

发表评论    

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