2025-3-20 victoriametrics 架构

VictoriaMetrics 是一个高性能、开源的时序数据库,设计用来处理大规模的时序数据。它支持 Prometheus 数据格式,并具有非常高的写入和查询性能。VictoriaMetrics 特别适用于大规模环境中的时序数据存储和查询,能够提供跨多个集群的时序数据存储和查询能力。

VictoriaMetrics 架构 #

VictoriaMetrics 的架构可以分为几个主要组件,每个组件在存储、查询和管理数据方面都发挥着不同的作用。

1. VictoriaMetrics Components: #

  • vmstorage:负责存储时序数据,并提供高效的数据压缩和存储管理功能。所有的时序数据都会被写入 vmstorage 中,并且在底层存储中进行压缩以节省存储空间。
  • vmselect:用于执行查询操作,并从 vmstorage 获取数据。它负责解析 Prometheus 查询(PromQL)并返回查询结果。vmselect 是查询请求的入口。
  • vminsert:负责接收数据并将其写入到 vmstorage。它接受来自 Prometheus 或其他系统的时序数据,并将其插入到存储系统中。
  • VictoriaMetrics Cluster:通过多个 vmselectvminsert 实例部署来扩展系统的写入和查询能力。这使得 VictoriaMetrics 能够水平扩展,在大规模环境中高效地处理时序数据。
  • Scrape:像 Prometheus 一样,VictoriaMetrics 也可以从不同的数据源抓取时序数据,进行数据存储。

2. VictoriaMetrics 存储架构#

  • 数据存储:VictoriaMetrics 使用基于磁盘的列式存储结构,支持高效的数据压缩。其数据以时间序列的形式存储,并根据时间进行分片存储,以便在高并发查询时提高查询性能。
  • 数据压缩:为了节省存储空间,VictoriaMetrics 采用了自定义的压缩算法(如 Gorilla 算法)来压缩时序数据。压缩后的数据不仅减少了存储的开销,还提高了读取性能。
  • 长期存储:可以将数据长期存储在磁盘中,或者通过集成外部存储后端(如 S3)实现更长期的数据存储。VictoriaMetrics 也支持与 Thanos 兼容的 API,允许数据存储在对象存储中,从而支持跨数据中心存储和数据恢复。

3. 数据流#

  • vminsert 接收来自 Prometheus 或其他数据源的时序数据,并将其写入到 vmstorage
  • vmselect 接收查询请求,并根据查询条件从 vmstorage 中提取数据进行查询响应。
  • 查询过程中,vmselect 会将查询请求传递给多个 vmstorage 实例(如果是集群部署)以获得需要的数据。
  • vmselect 提供高效的查询能力,并支持 PromQL 语法,可以像 Prometheus 一样进行查询和数据展示。

典型架构图 #

graph TB
    subgraph Data_Collection
        direction TB
        P[Prometheus Scraping Targets]
    end

    subgraph VictoriaMetrics_Cluster
        direction TB
        A[vminsert]
        B[vmstorage]
        C[vmselect]
    end

    subgraph Monitoring_And_Alerting
        direction LR
        G[Grafana]
        A1[Alertmanager]
    end

    P --> A
    A --> B
    G --> C
    C --> B
    A1 --> A
    C --> G

关键组件功能和数据流: #

  1. 数据收集(Prometheus Scraping Targets):VictoriaMetrics 可以通过 vminsert 接收来自 Prometheus 的数据,或者其他应用将数据推送到 vminsert 中。
  2. 数据存储(vmstorage):vmstorage 组件负责数据的存储,所有接收到的时序数据都会被写入到 vmstorage 中,存储格式采用压缩存储以减少存储开销。
  3. 数据查询(vmselect):vmselect 负责处理来自客户端(如 Grafana)的查询请求,并查询数据存储中的时序数据,支持 PromQL 查询语言。
  4. 查询结果展示和告警:通过 Grafana 等可视化工具展示查询结果,同时,Alertmanager 用来处理 Prometheus 的告警规则并发送告警。

优缺点: #

优点: #

  1. 高性能:在数据写入和查询方面都提供了非常高的性能,特别是针对大规模时序数据场景。
  2. 高压缩比:使用自定义的压缩算法,存储空间消耗较低,适合大规模的时序数据。
  3. 水平扩展:支持通过增加多个 vmselectvminsert 实例来扩展存储和查询能力,具有很好的伸缩性。
  4. 支持 Prometheus 格式:与 Prometheus 兼容,可以直接替代 Prometheus 存储,并且支持 PromQL 查询。
  5. 支持持久化存储:支持将数据持久化存储在本地磁盘或外部对象存储中(如 S3)。

缺点: #

  1. 功能较简单:虽然 VictoriaMetrics 在性能和存储管理上很强,但它的功能相对简单,缺乏 Prometheus 中的一些复杂功能(如规则引擎等)。
  2. 查询语法不支持全部 Prometheus 功能:部分 Prometheus 的高级功能可能不完全支持,虽然它支持 PromQL,但某些查询可能在功能上有所限制。
  3. 配置复杂性:对于大型环境的部署和集群管理,配置相对复杂,需要合理规划各个组件的部署和资源分配。

总结: #

VictoriaMetrics 是一个高效且适合大规模时序数据存储和查询的系统。它提供了高性能的时序数据存储和查询,适合大规模数据存储和处理需求,尤其在 Prometheus 生态中可以很方便地替代 Prometheus 存储和提供长时间的数据查询能力。

VictoriaMetrics 中,vminsert 组件负责接收时序数据并存入存储后端。你可以通过 Prometheus remote_write 方式,将 Prometheus 采集到的数据推送到 vminsert,从而让 VictoriaMetrics 作为长时间存储(长期存储 3 年的数据)。


如何让 Prometheus 将数据写入 VictoriaMetrics (vminsert)? #

1. 在 Prometheus 配置 remote_write #

你需要在 Prometheusprometheus.yml 配置文件中添加 remote_write,指向 VictoriaMetricsvminsert 端点,例如:

global:
  scrape_interval: 15s  # 采集间隔

remote_write:
  - url: "http://<vminsert_ip>:8480/insert/0/prometheus"
    queue_config:
      capacity: 5000
      max_shards: 10
      max_samples_per_send: 1000
      batch_send_deadline: 5s
  • url: 指向 vminsert 组件的 8480 端口,并使用 /insert/0/prometheus 端点接收 Prometheus 格式的数据。
  • queue_config: 设置 Prometheus 推送数据的队列参数,提高性能和稳定性。

2. 启动 vminsert #

VictoriaMetrics 服务器上运行 vminsert,监听 8480 端口,例如:

./vminsert -storageNode=victoriametrics:8400
  • -storageNode=victoriametrics:8400:将数据写入 VictoriaMetrics 存储后端(通常是 victoriametrics 进程)。

3. 启动 victoriametrics #

VictoriaMetrics 本体负责存储数据,你需要启动它:

./victoria-metrics -retentionPeriod=3y
  • -retentionPeriod=3y:设置数据保留时间为 3 年

4. 验证数据是否写入 #

在 Prometheus UI 或 VictoriaMetrics Web UI (http://<vm_ip>:8428/vmui) 里,查询数据,确保数据正常写入。


总结 #

  • Prometheus 采集数据,然后 通过 remote_write 推送数据vminsert
  • vminsert 负责接收数据 并存储到 VictoriaMetrics 后端。
  • VictoriaMetrics 负责存储和查询数据,支持高效压缩和长时间存储(如 3 年)。

这种方式适合大规模环境,比 Thanos 方案更简单,资源占用更低。你是要用 VictoriaMetrics 作为长期存储吗?