VictoriaMetrics集群架构与工作流解析

一、VictoriaMetrics 组件总体架构图

Operator 工作流程图

二、它们是如何协同工作的(工作流)

1. 数据采集链路

vmagent

  • 发现 targets → 拉取 metrics → 本地缓存/限流

  • 发送给 vminsert

vminsert

  • 接收数据 → 校验 → 压缩 → 根据租户/seriesID 分片

  • 写入对应 vmstorage

vmstorage

  • 落盘、索引、合并

  • 提供给 vmselect 查询


2. 查询链路(Grafana / API)

  1. Grafana/API 发送 promQL 查询 → vmselect

  2. vmselect 分解查询,分发到所有 vmstorage

  3. vmstorage 返回局部结果

  4. vmselect 聚合并优化后返回最终数据

  5. Grafana 展示图表


3. 告警链路

  1. vmalert 定时执行规则:

    1. vmselect/Prometheus 读取指标

    2. 检查阈值

  2. 告警触发 → vmalert 发送给 vm-alertmanager

  3. Alertmanager(vm-alertmanager)

    1. 分组、抑制、路由

    2. 发送到通知渠道(Webhook、飞书、钉钉、邮件等)

三、组件介绍

组件 作用
vmagent 高性能抓取器,拉 metrics 并写入 vminsert
vminsert 写入入口,将数据分片写到 vmstorage
vmstorage 时序数据库后端,存储压缩索引数据
vmselect 查询入口,从 vmstorage 聚合结果
vmalert 执行告警规则与 recording rules
vm-alertmanager 告警路由、通知、分组、抑制
victoriaMetrics Cluster vminsert + vmstorage + vmselect 组成的高性能可扩展 TSDB
operator 简化部署和管理。Operator 会自动生成配置、管理集群拓扑、滚动升级等。

1. VictoriaMetrics (VM Cluster)

完整的分布式版本,由以下核心组件组成(vmselect、vminsert、vmstorage)。

用于 大规模、高性能、可横向扩容的时序数据库集群


2. vminsert

写入入口

  • 接收 Prometheus、VMAgent、其他客户端的写入请求

  • 负责数据校验、压缩、分片

  • 将数据分发到多个 vmstorage 节点

  • 支持批量写入、反压、限速


3. vmstorage

数据持久化层

  • 负责存储时序数据(TSDB),包含内存 + 磁盘分段文件

  • 处理数据压缩、倒排索引、合并、长期存储

  • 集群中可水平扩展多个节点

  • 不对外暴露查询接口,只服务 vminsert / vmselect


4. vmselect

查询入口

  • 接收 PromQL 或 MetricsQL 查询

  • 将查询分发到各 vmstorage 节点

  • 聚合处理结果并返回给客户端(Grafana、Alerting、API)

  • 负责缓存、降采样、查询优化


5. vmagent

高性能抓取组件(Prometheus scrapper 替代方案)

  • 支持完整 Prometheus scrape_config

  • 执行服务发现(SD)

  • 拉取 metrics 并发送到 vminsert

  • 可横向扩展,可使用集群分片机制避免重复抓取


6. vmalert

规则计算组件

  • 执行:

    • 时序规则(recording rules)

    • 告警规则(alerting rules)

  • 从 VM / Prometheus 数据源拉取指标 → 计算 → 发到 alertmanager

  • 可将规则执行结果回写到 VM


7. vm-alertmanager(兼容 Alertmanager)

告警路由、分组、静默、通知组件

  • 接收 vmalert 发来的告警事件

  • 根据规则发送到:

  • 邮件、电话、钉钉、飞书、Webhook 等

  • 功能与 Prometheus Alertmanager 基本一致


8. VM Operator(CRD 管理器)

功能

  • 在 Kubernetes 集群中部署和管理任意数量的 VictoriaMetrics 应用程序(例如 vmsingle/vmcluster 实例以及其他组件,如 vmauth、vmagent、vmalert 等)。

  • 从 prometheus-operator无缝 迁移 ,并自动转换 prometheus 自定义资源

  • 使用crd-objects实现 VictoriaMetrics 集群的简单安装、配置、升级和管理 。

  • 能够将应用程序监控的配置(部分配置)委派给最终用户,并管理对不同配置或配置部分的访问权限。

  • 与 VictoriaMetrics vmbackupmanager集成 - 用于创建备份的高级工具。请查看 VMSingle 的备份自动化VMCluster 的备份自动化

  • k8s-stack helm chart 提供了开箱即用的监控所需的一切, 以及现成的用例和解决方案。

  • 能够自定义部署方案模板。

它管理的 CRD 类型包括:

VMServiceScrape
  • 类似于 Prometheus Operator 的 ServiceMonitor

  • 指定基于 Service 自动发现 targets

VMPodScrape
  • 类似于 PodMonitor

  • 指定基于 Pod selector 自动发现 targets

VMRule
  • 统一管理 vmalert 的规则

  • 自动下发到 vmalert

VMAlertmanager
  • 声明 Alertmanager 集群资源
VMCluster / VMSingle / VMInsert / VMSelect / VMStorage
  • 统一声明 VM 集群拓扑,由 Operator 自动创建对应 StatefulSet/Deployments

四、监控看板

vm-cluster

https://grafana.com/grafana/dashboards/11176-victoriametrics-cluster/

vm-operator

https://grafana.com/grafana/dashboards/17869-victoriametrics-operator/

五、参数优化

下面配置基于helm chart values.yaml 文件格式

1. Vmstorage

bash 复制代码
  extraArgs:
    envflag.enable: true
    envflag.prefix: VM_
    loggerFormat: json
    httpListenAddr: :8482
    dedup.minScrapeInterval: "15s"  # ha vmagent场景下数据去重。 15 秒内的重复采样数据会被认为是同一份,只存一份  

2. Vmselect

bash 复制代码
  extraArgs:
    envflag.enable: true
    envflag.prefix: VM_
    loggerFormat: json
    httpListenAddr: :8481
    search.maxQueryDuration: 10m      # 查询超时 10m
    search.latencyOffset: "30s"       # 默认值
    dedup.minScrapeInterval: "15s"    # ha vmagent场景下数据去重。 15 秒内的重复采样数据会被认为是同一份,只存一份  
# vmstorage 和vmselect 都需要配置并且必须配置成一致    
  
  env:
    - name: TZ
      value: Asia/Shanghai

3. Vmagent

bash 复制代码
secrets:
    - etcd-client-cert
  scrapeInterval: 30s
  vmAgentExternalLabelName: vmagent_ha
  statefulMode: true
  #daemonSetMode: true
  replicaCount: 2

  #relabelConfig:
  # name: "vmagent-relabel"
  # key: "relabel.yaml"
  #inlineRelabelConfig:
  # - target_label: bar1
  # - source_labels: [aa]

  additionalScrapeConfigs:
    name: additional-scrape-configs
    key: prometheus-additional.yaml

  # Sharding
  #shardCount: 2

  # remote write 目标(你的 vmselect/vminsert 地址) 支持写入kafka
  remoteWrite:
    - url: "http://vm-victoria-metrics-cluster-vminsert:8480/insert/0/prometheus"
      #vmagent_remotewrite_pending_data_bytes > 0 持续上升 , 应增加队列数 用于快速写数据
      queues: "100"
      maxBlockSize: "67108864"
      maxRowsPerBlock: "20000"
      # 查看真实 remoteWrite URL(调试时用)
      showURL: "true"
      
  extraArgs:
    envflag.enable: "true"
    envflag.prefix: "VM_"
    loggerFormat: "json"
    httpListenAddr: ":8429"
    promscrape.dropOriginalLabels: "false"
    # 关键:添加 cluster sharding 参数
    promscrape.cluster.membersCount: "2"
    # 关键:给每条 metric 打上 agent 编号
    promscrape.cluster.memberLabel: "vmagent_instance"
    # 关键:设置 memberNum = podName,VM 会自动从名字提取数字
    promscrape.cluster.memberNum: "$(POD_NAME)"
    # 去重功能
    streamAggr.dedupInterval: "15s"
    streamAggr.dropInputLabels: "replica"
    # 启用后:页面仍会显示每个 target 最近一次 error, 日志不再被刷爆
    promscrape.suppressScrapeErrors: "true"
    promscrape.cluster.memberURLTemplate: "http://vmagent-custom-agent-%d.monitoring.svc.cluster.local:8429/targets"
    # 接收多大的数据
    promscrape.maxScrapeSize: "128MB"
  extraEnvs:
    - name: POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
          
---
apiVersion: v1
kind: Secret
metadata:
  name: additional-scrape-configs
  namespace: monitoring
stringData:
  prometheus-additional.yaml: |

    - job_name: 'cadvisor'
      kubernetes_sd_configs:
      - role: node
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - action: labeldrop
        regex: "(id|container_id|image|image_id|container_hash|pod_uid|uid|node_name|name|device|interface|mountpoint|endpoint)"
      - action: drop
        source_labels: [container]
        regex: "POD|pause"
      - action: drop
        source_labels: [mountpoint]
        regex: "/var/lib/kubelet/pods/.+|/var/lib/docker/.+|/run/containerd/.+"
      - action: drop
        source_labels: [device]
        regex: "veth.*|cni.*|docker.*|tun.*"
      - action: drop
        source_labels: [name]
        regex: ".+_[0-9a-f]{8,}$"
      - action: drop
        source_labels: [__name__]
        regex: "container_fs_.*"
      - source_labels: [__name__]
        regex: ".*_bucket"
        action: drop
      - source_labels: [__name__]
        regex: "container_cpu_cfs_.*|container_blkio_.*|container_tasks_.*|container_hugetlb_.*"
        action: drop
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - target_label: __address__
        replacement: kubernetes.default.svc:443
      - source_labels: [__meta_kubernetes_node_name]
        regex: (.+)
        target_label: __metrics_path__
        replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor

4. Vmalert

bash 复制代码
  datasource:
    url: "http://vm-victoria-metrics-cluster-vmselect.monitoring:8481/select/0/prometheus"
  remoteWrite:
    url: "http://vm-victoria-metrics-cluster-vminsert.monitoring:8480/insert/0/prometheus"
  remoteRead:
    url: "http://vm-victoria-metrics-cluster-vmselect.monitoring:8481/select/0/prometheus"
    maxConnections: 4
    
  notifier:
    url: "http://vmalertmanager-custom-alertmanager.monitoring.svc:9093"
    timeout: 10s
    maxConnections: 5
    
  extraArgs:
    loggerLevel: INFO
    rule.evalDelay: "30s" #默认值需要和search.latencyOffset 设置为一致 数据有延迟的时候需要配置
    external.url: "https://victoria-alert.xxx.cn"
    
  selectAllByDefault: true
  evaluationInterval: "30s"
  scrapeConfigSelector: {}
  serviceScrapeSelector: {}
  ruleNamespaceSelector: {}
  podScrapeSelector: {}
  nodeScrapeSelector: {}
  staticScrapeSelector: {}
  probeSelector: {}
  ruleSelector: {}

5. Vmalertmanager

bash 复制代码
  # 持久化存储
  storage:
    volumeClaimTemplate:
      metadata:
        name: alertmanager-data
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 10Gi
        storageClassName: ssd-csi-udisk
相关推荐
花酒锄作田2 天前
VictoriaMetrics 尝鲜
victoriametrics
乐维_lwops1 个月前
2025年运维监控建设重点是什么?
运维·监控系统·it监控
青云交3 个月前
Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频语义理解与智能检索进阶
java·深度学习·监控系统·行为识别·智能安防·智能检索·视频语义理解
SRETalk4 个月前
夜莺监控的几种架构模式详解
prometheus·victoriametrics·nightingale·夜莺监控
安科瑞王可5 个月前
智慧赋能高压并网:分布式光伏监控系统在5.88MW物流园项目的实践解析
数据安全·智慧运维·监控系统·分布式光伏·10kv并网
棕生8 个月前
架构师面试(三十七):监控系统架构模式
监控系统·架构师面试·架构模式·轮询计算模式·中心计算模式·边缘计算模式
运维小文9 个月前
prometheus自定义监控(pushgateway和blackbox)和远端存储VictoriaMetrics
云原生·prometheus·监控·linux运维·victoriametrics
SRETalk1 年前
🎉 夜莺监控突破一万 star,这是汗水,也是鞭策
监控系统·开源监控·夜莺监控·运维监控·it监控
SRETalk1 年前
VictoriaMetrics 中文教程(10)集群版介绍
victoriametrics·victoriametrics中文教程