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

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

相关文章

spark配置任务日志(Client模式& Cluster模式)

在Spark中,日志级别可以通过log4j.properties或log4j.xml文件来配置。对于spark-submit命令启动的应用程序,可以通过以下两种方式来修改日志级别:对于Client模式...

8.0 新特性-Generated Invisible Primary Key

8.0 新特性-Generated Invisible Primary Key

说明MySQL Innodb 引擎采用的是 IOT(索引组织表)存储方式,主键的重要性就不言而喻。在早期版本用户如果没有显式指定主键,会自动生成隐藏主键 row_id 来组织 B+ 树,隐藏主键 ro...

MySQL gh-ost DDL 变更工具

MySQL gh-ost DDL 变更工具

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

两款方案详解,企业线下数据库迁移至云上ScyllaDB(1)

两款方案详解,企业线下数据库迁移至云上ScyllaDB(1)

方案一通过扩缩容(上线新节点和下线老节点)方式迁移,这个过程数据库通过数据传输到新节点。整个过程不停机上下线节点的数据传输时存在压力。某个节点存在不可控的故障导致节点无法启动时,数据存在丢失的风险。新...

Elasticsearch8.5及Kibana8.5安装部署

Elasticsearch8.5及Kibana8.5安装部署

一、环境准备1、Centos7系统2、切换英文系统[root@master02 ~]# tail -n2 /etc/profile export LANG="en_US.UTF-8"3、下载、安...

zabbix监控导出生产环境数据

zabbix监控导出生产环境数据

问题需求导出zabbix数据库中 某个主机组下的端口监控 、 URL监控信息处理过程由于数据量较大,手动统计比较费时,因此考虑通过直接从数据库取出相关数据查找想关联的表,找到各监控项位于哪个数据库表内...

发表评论    

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