VictoriaMetrics原理及实践

2022-10-31 14:54:29 浏览数 (1)

简介

VictoriaMetrics,是一个快速高效、经济并且可扩展的监控解决方案和时序数据库。

谈到VictoriaMetrics就必须要提到Prometheus,VictoriaMetrics是一个新兴的监控解决方案。它借助Prometheus强大的exporter生态、成熟的规范、服务发现等优点等,融入到Prometheus生态中。VictoriaMetrics官网很多兼容Prometheus参数解释都是直接跳转到Prometheus官网。

VictoriaMetrics可以作为Prometheus的长期远程存储方案,当然VictoriaMetrics也可以完全取代Prometheus,因为VictoriaMetrics基本支持Prometheus配置文件、PromQL、各类API、数据格式等等。

作为一款新兴TSDB,参考DB-Engines的TSDB排行,最近两年VictoriaMetrics热度很高:

VictoriaMetrics 优点

  • 远程存储:可作为单一或多个Prometheus的远程存储
  • 安装简单:单节点架构一条命令就可以部署完毕(集群方式稍微复杂一些,但也很好理解)
  • 兼容性:PromQL兼容和增强的MetricsQL
  • Grafana兼容:VM可替换Grafana的Prometheus数据源(经测试,线上数据源直接替换后100%兼容)
  • 低内存:更低的内存占用,官方对比Prometheus,可以释放7倍左右内存空间(线上对比大概4倍)
  • 高压缩比:提供存储数据高压缩,官方说可以比Prometheus减少7倍的存储空间(线上对比大概是4~5倍)
  • 高性能:查询性能比Prometheus更快
  • 支持水平扩容&HA:基于VM集群版实现
  • 支持多租户:主要针对集群版

VictoriaMetrics 缺点

  • 图形化做的不好,虽然有vmui,但功能很少
  • 告警功能需要单独配置vmalert,而且vmalert只有api管理和查看,暂时没用图形界面
  • 没有类似Prometheus的WAL日志,突然故障可能会丢失部分数据

VictoriaMetrics 分类

VM分为,单节点(single-node)版和集群(cluster)版,两套方案,根据业务需求选择即可。

单节点版:直接运行一个二进制文件,既可以运行,官方建议采集数据点(data points)低于100w/s,推荐VM单节点版,简单好维护,但不支持告警。

集群版:支持数据水平拆分,把功能拆分为vmstorage、 vminsert、vmselect,如果要替换Prometheus,还需要vmagent、vmalert。

VictoriaMetrics 架构

VM 分为单节点和集群两个方案,根据业务需求选择即可。单节点版直接运行一个二进制文件既,官方建议采集数据点(data points)低于 100w/s,推荐 VM 单节点版,简单好维护,但不支持告警。集群版支持数据水平拆分。下图是 VictoriaMetrics 集群版官方的架构图。

主要包含以下几个组件:

  • vmstorage:数据存储以及查询结果返回,默认端口为 8482。
  • vminsert:数据录入,可实现类似分片、副本功能,默认端口 8480。
  • vmselect:数据查询,汇总和数据去重,默认端口 8481。
  • vmagent:数据指标抓取,支持多种后端存储,会占用本地磁盘缓存,默认端口 8429。
  • vmalert:报警相关组件,不如果不需要告警功能可以不使用该组件,默认端口为 8880。

集群方案把功能拆分为 vmstorage、 vminsert、vmselect 组件,如果要替换 Prometheus,还需要使用 vmagent、vmalert。从上图也可以看出 vminsert 以及 vmselect 都是无状态的,所以扩展很简单,只有 vmstorage 是有状态的。

vmagent 的主要目的是用来收集指标数据然后存储到 VM 以及 Prometheus 兼容的存储系统中(支持 remote_write 协议即可)。

下图是 vmagent 的一个简单架构图,可以看出该组件也实现了 metrics 的 push 功能,此外还有很多其他特性:

  • 替换 prometheus 的 scraping target
  • 支持基于 prometheus relabeling 的模式添加、移除、修改 labels,可以方便在数据发送到远端存储之前进行数据的过滤
  • 支持多种数据协议,influx line 协议,graphite 文本协议,opentsdb 协议,prometheus remote write 协议,json lines 协议,csv 数据
  • 支持收集数据的同时,并复制到多种远端存储系统
  • 支持不可靠远端存储(通过本地存储 -remoteWrite.tmpDataPath ),同时支持最大磁盘占用 相比 prometheus 使用较少的内存、cpu、磁盘 io 以及网络带宽

VictoriaMetrics 单节点版

下面模拟1个node-exporter,被Prometheus采集数据,然后Prometheus把数据写到VM远程存储。通过Grafana分别对2种数据源(Prometheus、VictoriaMetrics)进行展示,验证VM的兼容性。最终使用VM完全替换Prometheus,可以达到架构简单、更低的资源占用。

node-export 配置

兼容性

API兼容性

1、VM支持Prometheus querying API,主要如下:

代码语言:shell复制
/api/v1/query
/api/v1/query_range
/api/v1/series
/api/v1/labels
/api/v1/label/…/values
/api/v1/status/tsdb
/api/v1/targets

2、也有(query和query_range)部分增强功能,如下:

代码语言:shell复制
查询细化:/api/v1/query_range?extra_label=user_id=123&query=<query> 
相对时间:/api/v1/query_range?start=-30m&query=...
小数取舍:/api/v1/query?query=avg_over_time(temperature[1h])&round_digits=2

注:除非必要,建议不用,这样就算回到Prometheus技术栈也没问题

3、还新增部分VM自身数据统计API:

代码语言:shell复制
/api/v1/series/count :返回VM时间序列的总数
/api/v1/labels/count :列出VM所有label数量统计,如上面的instance、ip、job等就是label
/api/v1/status/active_queries :返回当前VM运行的查询语句
/api/v1/status/top_queries:返回查询TopN,展示维度topByCount(查询次数)、topByAvgDuration(平均查询时间)、topBySumDuration(总查询时间)

服务发现兼容性

VM基本兼容Prometheus大多数常用的服务发现与抓取类型,部分线上已测试,更多可兼容类型如下:

代码语言:shell复制
static_config(已测试)
file_sd_config(已测试)
kubernetes_sd_config
ec2_sd_config
gce_sd_config
consul_sd_config(已测试)
dns_sd_config
openstack_sd_config
docker_sd_config
dockerswarm_sd_config
eureka_sd_config
digitalocean_sd_config
http_sd_config

存储目录简介

0 人点赞