- VictoriaMetrics 集群模式
- VictoriaMetrics 简介
- vmstorage
- vmselect
- vminsert
- vmAgent
- vmAlert
- 添加监控
- grafana
1.0 VictoriaMetrics 简介
- vmagent 采集监控指标,vmalert 用于报警监控,vmstorage 存储指标数据,vminsert 接收指标数据,vmselect 查询指标数据。
- VictoriaMetrics(VM) 是一个支持高可用、经济高效且可扩展的监控解决方案和时间序列数据库,可用于 Prometheus 监控数据做长期远程存储。
- VictoriaMetrics 主要是一个可水平扩容的本地全量持久化存储方案,VictoriaMetrics 不仅仅是时序数据库,它的优势主要体现在一下几点:
- 对外支持 Prometheus 相关的 API,可以直接用于 Grafana 作为 Prometheus 数据源使用
- 指标数据摄取和查询具备高性能和良好的可扩展性,性能比 InfluxDB 和 TimescaleDB 高出 20 倍
- 在处理高基数时间序列时,内存方面也做了优化,比 InfluxDB 少 10x 倍,比 Prometheus、Thanos 或 Cortex 少 7 倍
- 高性能的数据压缩方式,与 TimescaleDB 相比,可以将多达 70 倍的数据点存入有限的存储空间,与 Prometheus、Thanos 或 Cortex 相比,所需的存储空间减少 7 倍
- 它针对具有高延迟 IO 和低 IOPS 的存储进行了优化
- 提供全局的查询视图,多个 Prometheus 实例或任何其他数据源可能会将数据摄取到 VictoriaMetrics
- 操作简单:
- VictoriaMetrics 由一个没有外部依赖的小型可执行文件组成
- 所有的配置都是通过明确的命令行标志和合理的默认值完成的
- 所有数据都存储在 - storageDataPath 命令行参数指向的目录中
- 可以使用 vmbackup/vmrestore 工具轻松快速地从实时快照备份到 S3 或 GCS 对象存储中
- 支持从第三方时序数据库获取数据源
- 由于存储架构,它可以保护存储在非正常关机(即 OOM、硬件重置或 kill -9)时免受数据损坏
- 同样支持指标的 relabel 操作
- VictoriaMetrics 主要是一个可水平扩容的本地全量持久化存储方案,VictoriaMetrics 不仅仅是时序数据库,它的优势主要体现在一下几点:
1.1 vm 集群架构

- 对于低于每秒一百万个数据点的摄取率,建议使用单节点版本而不是集群版本。单节点版本可根据 CPU 内核、RAM 和可用存储空间的数量进行扩展
- 集群版主要特点:
- 支持单节点版本的所有功能
- 性能和容量水平扩展
- 支持时间序列数据的多个独立命名空间(多租户)
- 支持多副本
- 组件服务:(每个服务都可以独立扩展, vmstorage 节点之间没有连接关系、互不通信并且不共享任何数据)
- vmstorage:数据存储以及查询结果返回,默认端口为 8482
- vminsert:数据录入,可实现类似分片、副本功能,默认端口 8480
- vmselect:数据查询,汇总和数据去重,默认端口 8481
- vmagent:数据指标抓取,支持多种后端存储,会占用本地磁盘缓存,默认端口 8429
- vmalert:报警相关组件,不如果不需要告警功能可以不使用该组件,默认端口为 8880
- 最小集群必须包含以下节点:
- 带有 -retentionPeriod 和 -storageDataPath 参数的单 vmstorage 节点
- 带有 -storageNode=< vmstorage_host > 的单 vminsert 节点
- 带有 -storageNode=< vmstorage_host > 的单 vmselect 节点
- 建议为每个服务组件运行至少两个节点以实现高可用性,这样当单个节点暂时不可用时,集群会继续工作,而且其余节点还可以处理增加的工作负载。如果你的集群规模较大,那么可以运行多个小型的 vmstorage 节点,因为这样可以在某些 vmstorage 节点暂时不可用时减少剩余 vmstorage 节点上的工作负载增加
- 集群大小调整和可扩展性:
- vm 集群的性能和容量可通过两种方式进行扩展
- 通过向集群中的现有节点添加更多资源(CPU、RAM、磁盘 IO、磁盘空间、网络带宽),也叫垂直可扩展性
- 通过向集群添加更多节点,又叫水平扩展性
- vm 集群的性能和容量可通过两种方式进行扩展
- 重复数据删除:
- 如果 -dedup.minScrapeInterval 命令行标志设置为大于 0 的时间,VictoriaMetrics 会去除重复数据点。例如,-dedup.minScrapeInterval=60s 将对同一时间序列上的数据点进行重复数据删除,如果它们位于同一离散的 60 秒存储桶内,最早的数据点将被保留。在时间戳相等的情况下,将保留任意数据点
- -dedup.minScrapeInterval 的推荐值是等于 Prometheus 配置中的 scrape_interval 的值,建议在所有抓取目标中使用一个 scrape_interval 配置
- 如果 HA 中多个相同配置的 vmagent 或 Prometheus 实例将数据写入同一个 VictoriaMetrics 实例,则重复数据删除会减少磁盘空间使用。这些 vmagent 或 Prometheus 实例在其配置中必须具有相同的 external_labels 部分,因此它们将数据写入相同的时间序列
- 备份:
- 建议从即时快照执行定期备份,以防止意外数据删除等错误。必须为每个 vmstorage 节点执行以下步骤来创建备份
- 通过导航到 /snapshot/create HTTP handler 来创建一个即时快照。它将创建快照并返回其名称
- 可以通过访问 /snapshot/create 这个 HTTP handler 来创建即时快照,它将创建快照并返回其名称
- 使用 vmbackup 组件从 <-storageDataPath>/snapshots/
文件夹归档创建的快照。归档过程不会干扰 vmstorage 工作,因此可以在任何合适的时间执行 - 通过 /snapshot/delete?snapshot=
或 /snapshot/delete_all 删除未使用的快照,以释放占用的存储空间 - 无需在所有 vmstorage 节点之间同步备份
- 从备份恢复:
- 使用 kill -INT 停止 vmstorage 节点
- 使用 vmrestore 组件将备份中的数据还原到 -storageDataPath 目录
- 启动 vmstorage 节点
1.2 vmstorage
- 由于 vmstorage 组件是有状态的,这里我们先使用 StatefulSet 进行部署,由于该组件也是可以进行扩展的
- 首先需要创建一个 Headless 的 Service,因为后面的组件需要访问到每一个具体的 Pod,在 vmstorage 启动参数中通过 –retentionPeriod 参数指定指标数据保留时长,1 表示一个月,这也是默认的时长,然后通过 –storageDataPath 参数指定了数据存储路径,记得要将该目录进行持久化
1 | # cat vmstorage_sts.yaml |
1.3 vmselect
- 该组件是无状态的,我们可以直接使用 Deployment 来进行管理
- 其中最重要的部分是通过 –storageNode 参数指定所有的 vmstorage 节点地址,上面我们使用的 StatefulSet 部署的,所以可以直接使用 FQDN 的形式进行访问。直接应用上面的对象
1 | # cat vmselect_deploy.yaml |
- vmui 集成到了 vmselect 组件中,可以通过:http://< vmselect >/select/0/vmui 进行访问
1.4 vminsert
- 该组件是无状态的,其中最重要的也是需要通过 –storageNode 参数指定所有的 vmstorage 节点
- 由于本身是无状态的,所以可以根据需要增加副本数量,也可以配置 HPA 进行自动扩缩容
1 | # cat vminset_deploy.yaml |
- 如果现在需要新增 vmstorage 节点,那么需要按照下面的步骤进行操作:
- 使用与集群中现有节点相同的 -retentionPeriod 配置启动新的 vmstorage 节点
- 逐步重新启动所有的 vmselect 节点,添加新的 -storageNode 参数包含
- 逐步重新启动所有的 vminsert 节点,添加新的 -storageNode 参数包含
1.5 vmAgent
- vmagent 可以帮助我们从各种来源收集指标并将它们存储在 VM 或者任何其他支持 remote write 协议的 Prometheus 兼容的存储系统中
- 特性:
- 可以替换 prometheus 的 scraping target
- 支持从 Kafka 读写数据
- 支持基于 prometheus relabeling 的模式添加、移除、修改 labels,可以在数据发送到远端存储之前进行数据的过滤
- 支持多种数据协议,influx line 协议,graphite 文本协议,opentsdb 协议,prometheus remote write 协议,json lines 协议,csv 数据等
- 支持收集数据的同时,并复制到多种远端存储系统
- 支持不可靠远端存储,如果远程存储不可用,收集的指标会在 -remoteWrite.tmpDataPath 缓冲,一旦与远程存储的连接被修复,缓冲的指标就会被发送到远程存储,缓冲区的最大磁盘用量可以用 -remoteWrite.maxDiskUsagePerURL 来限制
- 相比 prometheus 使用更少的内存、cpu、磁盘 io 以及网络带宽
- 当需要抓取大量目标时,抓取目标可以分散到多个 vmagent 实例中
- 可以通过在抓取时间和将其发送到远程存储系统之前限制唯一时间序列的数量来处理高基数和高流失率问题
- 可以从多个文件中加载 scrape 配置

1.5.1 部署 vmagent
- 接下来我们以抓取 Kubernetes 集群指标为例说明如何使用 vmagent,我们这里使用自动发现的方式来进行配置。vmagent 是兼容 prometheus 中的 kubernetes_sd_configs 配置的,所以我们同样可以使用
1.5.1.1 rbac
- 要让 vmagent 自动发现监控的资源对象,需要访问 APIServer 获取资源对象,所以首先需要配置 rbac 权限,创建如下所示的资源清单
1 | # cat vmagent_rbac.yaml |
1.5.1.2 cm
- 然后添加 vmagent 配置,我们先只配置自动发现 Kubernetes 节点的任务,创建如下所示的 ConfigMap 对象
1 | // 这里我们通过自动发现 Kubernetes 节点获取节点监控指标,需要注意 node 这种 role 的自动发现默认获取的是节点的 10250 端口,这里我们需要通过 relabel 将其 replace 为 9100 |
1.5.1.3 vmagent 集群
单个 vmagent 实例可以抓取数万个抓取目标,但是有时由于 CPU、网络、内存等方面的限制,这还不够。在这种情况下,抓取目标可以在多个 vmagent 实例之间进行拆分。集群中的每个 vmagent 实例必须使用具有不同 -promscrape.cluster.memberNum 值的相同 -promscrape.config 配置文件,该参数值必须在 0 … N-1 范围内,其中 N 是集群中 vmagent 实例的数量。集群中 vmagent 实例的数量必须传递给 -promscrape.cluster.membersCount 命令行标志。例如,以下命令可以在两个 vmagent 实例的集群中传播抓取目标
1
2vmagent -promscrape.cluster.membersCount=2 -promscrape.cluster.memberNum=0 -promscrape.config=/path/config.yml ...
vmagent -promscrape.cluster.membersCount=2 -promscrape.cluster.memberNum=1 -promscrape.config=/path/config.yml ...当 vmagent 在 Kubernetes 中运行时,可以将 -promscrape.cluster.memberNum 设置为 StatefulSet pod 名称,pod 名称必须以 0 … promscrape.cluster.memberNum-1 范围内的数字结尾,例如,-promscrape.cluster.memberNum=vmagent-0
默认情况下,每个抓取目标仅由集群中的单个 vmagent 实例抓取。如果需要在多个 vmagent 实例之间复制抓取目标,则可以通过 -promscrape.cluster.replicationFactor 参数设置为所需的副本数。例如,以下命令启动一个包含三个 vmagent 实例的集群,其中每个目标由两个 vmagent 实例抓取
1
2
3vmagent -promscrape.cluster.membersCount=3 -promscrape.cluster.replicationFactor=2 -promscrape.cluster.memberNum=0 -promscrape.config=/path/to/config.yml ...
vmagent -promscrape.cluster.membersCount=3 -promscrape.cluster.replicationFactor=2 -promscrape.cluster.memberNum=1 -promscrape.config=/path/to/config.yml ...
vmagent -promscrape.cluster.membersCount=3 -promscrape.cluster.replicationFactor=2 -promscrape.cluster.memberNum=2 -promscrape.config=/path/to/config.yml ...需要注意的是如果每个目标被多个 vmagent 实例抓取,则必须在 -remoteWrite.url 指向的远程存储上启用重复数据删除
所以如果你抓取的监控目标非常大,那么我们建议使用 vmagent 集群模式,那么可以使用 StatefulSet 方式进行部署
我们将 vmagent 配置通过 ConfigMap 挂载到容器 /config/scrape.yml ,另外通过 -remoteWrite.url=http://vminsert:8480/insert/0/prometheus 指定远程写入的地址,这里我们写入前面的 vminsert 服务,另外有一个参数 -remoteWrite.tmpDataPath ,该路径会在远程存储不可用的时候用来缓存收集的指标,当远程存储修复后,缓存的指标就会被正常发送到远程写入,所以最好持久化该目录
1 | # cat vmagent_sts.yaml |

1.5.1.4 新增其它监控
- 新增其他内容的监控,比如 APIServer、容器等等
1 | # cat vmagent_cm_update.yaml |
vmagent 是兼容传统的 prometheus 重新标记规则的,但也有一些独特的 action,比如上面配置中我们使用了一个 keep_if_equal 的操作,该操作的意思是如果指定的标签值相等则将该条数据保留下来
有时,如果某个指标包含两个具有相同值的标签,则需要删除它。这可以通过 vmagent 支持的 drop_if_equal 操作来完成。例如,如果以下 relabel 规则包含 real_port 和 required_port 的相同标签值,则它会删除指标
1
2- action: drop_if_equal
source_labels: [real_port, needed_port]该规则将删除以下指标:foo{real_port=”123”,needed_port=”123”} 但会保留以下指标: foo{real_port=”123”,needed_port=”456”}
有时可能需要只对指标子集应用 relabel,在这种情况下,可以将 if 选项添加到 relabel_configs 规则中,例如以下规则仅将 {foo=”bar”} 标签添加到与 metric{label=~”x|y”} 序列选择器匹配的指标
1
2
3- if: 'metric{label=~"x|y"}'
target_label: 'foo'
replacement: 'bar'if 选项可以简化传统的 relabel_configs 规则,例如,以下规则可以删除与 foo{bar=”baz”} 序列选择器匹配的指标
1
2- if: 'foo{bar="baz"}'
action: drop这相当于以下传统的规则
1
2
3- action: drop
source_labels: [__name__, bar]
regex: 'foo;baz'不过需要注意的是 Prometheus 还不支持 if 选项,现在只支持 VictoriaMetrics
现在更新 vmagent 的配置
1
# kbuectl apply -f vmagent_cm_update.yaml
修改配置后刷新有两种方式:
- 发送 SUGHUP 信号给 vmagent 进程
- 向 http://vmagent_pod_ip:8429/-/reload 发送一个 http 请求
- pod所在的node节点执行: curl -X POST http://10.1.58.198:8429/-/reload
- pod所在的node节点执行: curl -X POST http://10.1.85.198:8429/-/reload

1.6 vmAlert
- 前面我们已经介绍了可以使用 vmagent 代替 prometheus 抓取监控指标数据,要想完全替换 prometheus 还有一个非常重要的部分就是报警模块,之前我们都是在 prometheus 中定义报警规则评估后发送给 alertmanager 的,同样对应到 vm 中也有一个专门来处理报警的模块:vmalert
- vmalert 会针对 -datasource.url 地址执行配置的报警或记录规则,然后可以将报警发送给 -notifier.url 配置的 Alertmanager,记录规则结果会通过远程写入的协议进行保存,所以需要配置 -remoteWrite.url
- 特性:
- 与 VictoriaMetrics TSDB 集成
- VictoriaMetrics MetricsQL 支持和表达式验证
- Prometheus 告警规则定义格式支持
- 与 Alertmanager 集成
- 在重启时可以保持报警状态
- Graphite 数据源可用于警报和记录规则
- 支持记录和报警规则重放
- 非常轻量级,没有额外的依赖
- 要开始使用 vmalert,需要满足以下条件:
- 报警规则列表:要执行的 PromQL/MetricsQL 表达式
- 数据源地址:可访问的 VictoriaMetrics 实例,用于规则执行
- 通知程序地址:可访问的 Alertmanager 实例,用于处理,汇总警报和发送通知
1.6.1 alertmanager 安装
- 首先需要安装一个 Alertmanager 用来接收报警信息,前面章节中我们已经详细讲解过了,这里不再赘述了,对应的资源清单如下所示
- Alertmanager 这里我们只配置了一个默认的路由规则,根据 alertname、cluster 两个标签进行分组,然后将触发的报警发送到 email 接收器中去
1 | # cat alertmanager.yaml |
1.6.2 vmalert-cm
- 接下来需要添加用于报警的规则配置
- 这里我们添加了一条记录规则,两条报警规则
1 | # cat vmalert_cm.yaml |
1.6.3 部署 vmalert
- 资源清单中将报警规则以 volumes 的形式挂载到了容器中,通过 -rule 指定了规则文件路径,-datasource.url 指定了 vmselect 的路径,-notifier.url 指定了 Alertmanager 的地址,其中-evaluationInterval 参数用来指定评估的频率的,由于我们这里添加了记录规则,所以还需要通过 -remoteWrite.url 指定一个远程写入的地址
1 | # cat vmalert_deploy.ayml |

1.7 添加监控
1.7.1 node-exporter
- 使用 DaemonSet 控制器运行 node-exporter
1 | # cat node-exporter.yaml |
1.8 Grafana
1 | # mkdir -p /data/k8s/grafana |
1.8.1 数据源配置

1.8.1 导入模板
- 16098(Node_Exporter监控)
- 11176(VictoriaMetrics 集群自身监控)
- 13105(总览K8S整体资源)

- 本文作者: [email protected]
- 本文链接: https://www.ink8s.com/2025/08/24/victoriametrics/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!