2025-3-20 victoriametrics高可用架构

VictoriaMetrics 高可用(HA)集群方案 #

为了提高 VictoriaMetrics 的高可用性,我们可以:

  1. 部署多个 vminsert 并使用负载均衡(如 Nginx)分发写入请求
  2. 使用负载均衡(如 Nginx)代理 vmselect 查询,保证查询的高可用
  3. 扩展 vmstorage,采用分片存储,提高存储能力和容灾能力

1. 高可用(HA)架构 #

                ┌──────────────────────────────────┐
                │            Prometheus            │
                └──────────────▲───────────────────┘
                               │ remote_write
        ┌────────────────────────────┐
        │    HAProxy/Nginx (LB)      │
        └──────────────▲─────────────┘
                       │ 负载均衡
       ┌───────────────┴──────────────┐
       │                              │
┌──────▼──────┐               ┌──────▼──────┐
│  vminsert-1 │               │  vminsert-2 │
└──────▲──────┘               └──────▲──────┘
       │ 负载均衡写入
       └──────────────┐
    ┌──────────────────────────────────┐
    │       多个 vmstorage 存储实例      │
    └──────────────────────────────────┘
    ┌──────────────────────────────────┐
    │       多个 vmstorage 备份实例      │
    └──────────────────────────────────┘
    ┌──────────────────────────────────┐
    │        HAProxy/Nginx (LB)         │
    └──────────────────────────────────┘
                      │ 负载均衡查询
       ┌───────────────┴──────────────┐
       │                              │
┌──────▼──────┐               ┌──────▼──────┐
│  vmselect-1 │               │  vmselect-2 │
└──────▲──────┘               └──────▲──────┘
  ┌────────────┐
  │   Grafana  │
  └────────────┘

2. 高可用配置 #

2.1 vminsert 负载均衡 #

我们使用 Nginx 作为 vminsert 的负载均衡器,确保 Prometheus remote_write 的高可用。

Nginx 负载均衡 vminsert 配置 #

upstream vminsert_lb {
    server vminsert1:8480 max_fails=3 fail_timeout=10s;
    server vminsert2:8480 max_fails=3 fail_timeout=10s;
    keepalive 16;
}

server {
    listen 8480;
    location / {
        proxy_pass http://vminsert_lb;
        proxy_set_header Host $host;
    }
}
  • 让 Prometheus remote_write 指向 Nginx,即 http://nginx:8480/api/v1/write
  • 负载均衡 vminsert,如果某个 vminsert 挂了,流量会自动转移到另一个。

2.2 vmselect 负载均衡 #

Grafana 查询时,需要确保 vmselect 高可用。

Nginx 负载均衡 vmselect 配置 #

upstream vmselect_lb {
    server vmselect1:8481 max_fails=3 fail_timeout=10s;
    server vmselect2:8481 max_fails=3 fail_timeout=10s;
    keepalive 16;
}

server {
    listen 8481;
    location / {
        proxy_pass http://vmselect_lb;
        proxy_set_header Host $host;
    }
}
  • Grafana 指向 Nginxhttp://nginx:8481/api/v1/query
  • 自动切换 vmselect 查询,提高可用性。

2.3 vmstorage 高可用 #

vmstorage 存储节点本身是 分布式存储,可以:

  1. 部署 多个 vmstorage,均衡存储数据。

  2. 采用

    数据备份

    ,避免数据丢失:

    • 快照备份(定期 rsync 复制数据)。
    • 对象存储(S3/OSS)同步

示例:部署多个 vmstorage #

nohup ./vmstorage -storageDataPath=/data/vmstorage -retentionPeriod=3y > vmstorage.log 2>&1 &
nohup ./vmstorage -storageDataPath=/data/vmstorage_backup -retentionPeriod=3y > vmstorage_backup.log 2>&1 &
  • 主存储/data/vmstorage
  • 备份存储/data/vmstorage_backup

3. HA 集群的 Mermaid 架构图 #

graph TD;
    subgraph Prometheus
        A[Prometheus] -- remote_write --> LB1[HAProxy/Nginx LB]
    end

    subgraph VictoriaMetrics_Cluster
        LB1 -- Distribute Data --> B1[vminsert-1]
        LB1 -- Distribute Data --> B2[vminsert-2]
        
        B1 & B2 -- Store Data --> C1[vmstorage-1]
        B1 & B2 -- Store Data --> C2[vmstorage-2]

        C1 & C2 -- Query Data --> LB2[HAProxy/Nginx LB]
        
        LB2 -- Load Balance Query --> D1[vmselect-1]
        LB2 -- Load Balance Query --> D2[vmselect-2]
    end

    subgraph Monitoring
        D1 & D2 -- Query --> E[Grafana]
    end

这张图展示了 Prometheus 和 VictoriaMetrics 高可用(HA)集群架构,并介绍了数据采集、存储、查询、可视化的流转过程。下面我详细解析图中的各个部分和它们的功能。


1. Prometheus 数据采集 #

graph TD;
    subgraph Prometheus
        A[Prometheus] -- remote_write --> LB1[HAProxy/Nginx LB]
    end

解释 #

  • Prometheus:负责采集监控数据(例如从 Kubernetes、应用、主机等来源)并通过 remote_write 将数据发送到 VictoriaMetrics 集群
  • HAProxy/Nginx LB:充当 负载均衡器,将来自 Prometheus 的写入请求分发到 多个 vminsert 实例,实现负载均衡。

2. VictoriaMetrics 数据写入和存储 #

graph TD;
    subgraph VictoriaMetrics_Cluster
        LB1 -- Distribute Data --> B1[vminsert-1]
        LB1 -- Distribute Data --> B2[vminsert-2]
        
        B1 & B2 -- Store Data --> C1[vmstorage-1]
        B1 & B2 -- Store Data --> C2[vmstorage-2]

        C1 & C2 -- Query Data --> LB2[HAProxy/Nginx LB]
        
        LB2 -- Load Balance Query --> D1[vmselect-1]
        LB2 -- Load Balance Query --> D2[vmselect-2]
    end

解释 #

  • vminsert-1 和 vminsert-2:
    • 负责接收来自 Prometheus 的数据,并将数据写入到 vmstorage 存储组件中。
    • 通过 HAProxy/Nginx LB(LB1) 实现负载均衡,保证写入请求的分发。
  • vmstorage-1 和 vmstorage-2:
    • VictoriaMetrics 的数据存储层,负责持久化存储采集到的监控数据。
    • 数据存储是分布式的,通过多个存储节点提供冗余和高可用性。
  • HAProxy/Nginx LB2:
    • 负责将 查询请求(来自 Grafana 或其他客户端)负载均衡地分发到多个 vmselect 实例,确保查询的高可用性。

3. 数据查询与可视化 #

graph TD;
    subgraph Monitoring
        D1 & D2 -- Query --> E[Grafana]
    end

解释 #

  • vmselect-1 和 vmselect-2:
    • 负责 查询 存储在 vmstorage 中的数据。
    • 通过 HAProxy/Nginx LB2 负载均衡,多个 vmselect 实例共同处理查询请求。
  • Grafana:
    • Grafana 作为 可视化工具,通过 PromQL 查询数据并展示为仪表盘(Dashboard),便于用户实时查看监控数据。

4. 数据流和交互过程 #

  1. Prometheus 采集数据
    • Prometheus 从各种源(例如 K8s、Docker、主机等)采集监控指标。
  2. Prometheus 通过 remote_write 发送数据
    • Prometheus 将数据通过 remote_write 推送到 HAProxy/Nginx LB1,由它将数据分发到 vminsert 实例。
  3. vminsert 将数据写入存储
    • vminsert 将收到的数据存储到 多个 vmstorage 实例vmstorage-1vmstorage-2),实现数据持久化。
  4. 查询数据
    • 用户通过 Grafana 查询数据,Grafana 将查询请求发送到 HAProxy/Nginx LB2,后者将请求负载均衡到 多个 vmselect 实例
  5. 数据展示
    • vmselectvmstorage 查询数据并返回结果,Grafana 对这些数据进行可视化展示,供用户查看。

5. 关键组件和功能 #

功能组件作用
数据采集Prometheus + remote_write采集监控数据,并远程写入 VictoriaMetrics
数据写入vminsert将数据写入到 vmstorage 存储
数据存储vmstorage持久化存储监控数据,支持水平扩展
查询负载均衡HAProxy/Nginx LB2将查询请求负载均衡分发到 vmselect 实例
查询vmselect查询存储在 vmstorage 的监控数据
可视化Grafana查询数据并进行可视化展示

6. 适用场景 #

大规模监控系统,适用于 Prometheus 集群VictoriaMetrics 集群的高可用方案 ✅ 高可用性:多实例、负载均衡和分布式存储,确保数据的可靠存储和查询 ✅ 长期存储:能够存储大规模时间序列数据,适用于长时间的数据保留(例如 3 年以上) ✅ 高并发查询:通过负载均衡和多查询节点分摊查询负载,提高查询性能


总结 #

这张图展示了一个 高可用的 Prometheus 和 VictoriaMetrics 架构,包括了数据采集、存储、查询和可视化的完整流转过程。架构设计中通过 HAProxy/Nginx LB 负载均衡组件确保了 写入查询 流量的高可用性,同时通过 多个 vminsertvmselect 实例 提供了数据存储和查询的冗余。最终,用户通过 Grafana 实现对存储数据的可视化查看。

4. 关键优化点 #

4.1 避免单点故障 #

  • vminsertvmselectvmstorage 均可水平扩展
  • vmstorage 数据多副本,防止数据丢失。

4.2 提高查询性能 #

  • 负载均衡 vmselect,多个 vmselect 提供高可用查询能力。
  • vmstorage 使用 SSD 以提高查询速度

4.3 提高写入性能 #

  • 通过多个 vminsert 并行写入,提高吞吐量。

  • Prometheus

    remote_write 批量提交

    remote_write:
      - url: "http://nginx:8480/api/v1/write"
        queue_config:
          capacity: 5000
          max_shards: 20
          max_samples_per_send: 2000
          batch_send_deadline: 5s
    

5. 方案总结 #

高可用

  • 负载均衡 vminsert,防止 Prometheus 写入失败。
  • 负载均衡 vmselect,保证查询服务可用。
  • vmstorage 多实例存储,数据备份防止丢失。

弹性扩展

  • vminsertvmselectvmstorage 均可 横向扩展,适应大规模数据量。

长期存储

  • vmstorage 数据保留 3 年,可扩展至 S3/OSS 存储,长期保存数据。

6. 适用场景 #

🚀 适用于大规模 Kubernetes 监控 🚀 适用于多集群 Prometheus 监控统一存储 🚀 适用于长期存储海量指标数据