VictoriaMetrics 完全指南 / 01 - VictoriaMetrics 特性与对比分析
01 · VictoriaMetrics 特性与对比分析
本章目标
- 了解 VictoriaMetrics 的诞生背景与核心定位
- 掌握其关键特性与技术优势
- 与 Prometheus、InfluxDB 进行系统性对比
- 帮助你在架构选型时做出合理决策
1.1 什么是 VictoriaMetrics
VictoriaMetrics(以下简称 VM)是一款高性能、低成本的时序数据库(Time Series Database, TSDB)和监控解决方案,由 Aliaksandr Valialkin 于 2018 年开源。它同时提供单节点版和集群版,并完全兼容 Prometheus 生态。
设计哲学
┌─────────────────────────────────────────────────┐
│ VictoriaMetrics 设计三角 │
│ │
│ 简单 (Simplicity) │
│ ▲ │
│ / \ │
│ / \ │
│ / \ │
│ / \ │
│ 性能 (Performance)──成本 (Cost Efficiency) │
└─────────────────────────────────────────────────┘
- 简单:单二进制文件部署,无外部依赖(单节点版)
- 高性能:比 Prometheus 快 10-100 倍的查询速度
- 低成本:高压缩率,磁盘占用降低 7-10 倍
1.2 核心特性
1.2.1 存储引擎
| 特性 | 说明 |
|---|---|
| Mergetree 存储 | 类似 ClickHouse 的 LSM 树变体,追加写入 + 后台合并 |
| 压缩算法 | 使用 VictoriaMetrics 自研压缩,比 Prometheus 的 TSDB 压缩率高 7-10 倍 |
| 写入模式 | 仅支持追加写入(append-only),天然适合时序数据 |
| 索引 | 倒排索引(inverted index),支持按 metric name 和 label 快速检索 |
1.2.2 协议兼容性
Prometheus remote_write ──┐
Prometheus remote_read ───┤
Prometheus scrape ────────┤
InfluxDB line protocol ───┼──▶ VictoriaMetrics
OpenTSDB ─────────────────┤
Graphite ─────────────────┤
CSV / JSON ───────────────┘
1.2.3 查询语言 MetricsQL
- 完全兼容 PromQL
- 新增 50+ 实用函数(如
rollup,default_rollup,label_match等) - 支持子查询嵌套、多级聚合
- 详见 第 05 章 MetricsQL
1.2.4 运维友好
- 单二进制文件,无需 ZooKeeper / Consul / etcd
- 内置 HTTP API,方便与各种工具集成
- 支持即时快照备份(snapshot)
- 提供丰富的自我监控指标
1.3 与 Prometheus 对比
这是选型中最常遇到的问题。以下是详细对比:
架构差异
Prometheus 架构:
┌──────────┐ pull ┌──────────┐
│ Target │ ◀──────── │Prometheus│ ──▶ 本地 TSDB
└──────────┘ └──────────┘
│
remote_write(可选)
▼
┌──────────────┐
│ 远程存储(VM)│
└──────────────┘
VictoriaMetrics 单节点架构:
┌──────────┐ remote_write ┌─────────────────┐
│Prometheus│ ──────────────▶│ VictoriaMetrics │(同时作为远程存储和查询引擎)
└──────────┘ └─────────────────┘
│ ▲
│ scrape(可选) │
└────────────────────────────┘
功能对比表
| 维度 | Prometheus | VictoriaMetrics |
|---|---|---|
| 存储模型 | 本地 TSDB | 自研压缩存储 |
| 压缩率 | 基准 | 7-10 倍于 Prometheus |
| 查询语言 | PromQL | MetricsQL(PromQL 超集) |
| 集群支持 | 需 Thanos / Cortex | 原生集群版 |
| 高可用 | 需外部组件 | 原生 replication |
| 长期存储 | 需 Thanos / remote storage | 内置 retention 配置 |
| 数据回填 | 需 promtool | 内置 vmctl 工具 |
| 多租户 | 不支持 | 集群版原生支持 |
| 抓取模式 | Pull(默认) | Pull + Push |
| 配置热加载 | /-/reload | /-/reload |
| 内存占用 | 基准 | 低 2-5 倍 |
| 磁盘 I/O | 基准 | 低 5-10 倍 |
| 查询速度 | 基准 | 快 10-100 倍(大数据集) |
| 生态 | 原生 Prometheus | 兼容 Prometheus 生态 |
| 成熟度 | CNCF 毕业项目 | 已有大规模生产验证 |
何时选择 Prometheus
- 团队对 Prometheus 生态非常熟悉
- 数据量较小(< 100 万活跃时间序列)
- 不需要长期存储或集群能力
- 希望使用原生 CNCF 生态
何时选择 VictoriaMetrics
- 时间序列数量巨大(> 100 万)
- 对存储成本敏感
- 需要长期数据保留(月/年级)
- 需要多租户支持
- 需要简单运维的集群方案
- 查询性能有较高要求
1.4 与 InfluxDB 对比
架构差异
InfluxDB(单机版):
┌──────────┐
│ InfluxDB │ ──▶ TSI Index + TSM Engine
└──────────┘
InfluxDB Enterprise:
┌──────────┐ ┌────────────┐
│ Data │◀──▶│ Meta │ (需 Raft 共识)
│ Node(s) │ │ Node(s) │
└──────────┘ └────────────┘
VictoriaMetrics:
┌──────────┐
│ VM │ ──▶ Mergetree + Inverted Index
└──────────┘ (单二进制,无需外部依赖)
功能对比表
| 维度 | InfluxDB (OSS) | VictoriaMetrics |
|---|---|---|
| 数据模型 | Tag + Field(类 SQL) | Metric + Label(Prometheus 风格) |
| 查询语言 | InfluxQL / Flux | MetricsQL(PromQL 兼容) |
| 集群版 | Enterprise(商业授权) | 开源集群版 |
| 压缩率 | 良好 | 更优(7x+) |
| 写入协议 | InfluxDB Line Protocol | 多协议支持 |
| 多租户 | Database / RP | 原生 tenantID |
| 生态集成 | Telegraf + Kapacitor | Prometheus 生态 + Grafana |
| 社区活跃度 | 较活跃 | 快速增长 |
| 许可 | MIT(OSS) | Apache 2.0 |
数据模型对比示例
InfluxDB 风格:
cpu,host=server01,region=cn-north usage_idle=95.2,usage_user=3.1 1699000000000000000
Prometheus / VM 风格:
cpu_usage_idle{host="server01", region="cn-north"} 95.2
cpu_usage_user{host="server01", region="cn-north"} 3.1
注意:InfluxDB 的 field 在 Prometheus 模型中会拆分为独立的 metric name,这意味着从 InfluxDB 迁移时需要重新设计数据模型。
何时选择 InfluxDB
- 数据是事件型的(logs, events, traces 混合)
- 团队熟悉 SQL 语法
- 需要 Flux 的复杂数据转换能力
- 数据量不大,单机版即可满足
何时选择 VictoriaMetrics
- 纯时序指标数据
- 需要开源的集群方案
- 对存储成本和查询性能有更高要求
- 已有 Prometheus 生态,希望平滑迁移
1.5 与其他方案对比速览
| 方案 | 开源集群 | 多租户 | PromQL 兼容 | 复杂度 | 压缩率 |
|---|---|---|---|---|---|
| Prometheus | ❌ | ❌ | ✅ | 低 | 中 |
| Thanos | ✅ | ❌ | ✅ | 高 | 中 |
| Cortex | ✅ | ✅ | ✅ | 高 | 中 |
| Mimir | ✅ | ✅ | ✅ | 高 | 中 |
| VM 单节点 | ❌ | ❌ | ✅ | 极低 | 高 |
| VM 集群 | ✅ | ✅ | ✅ | 低 | 高 |
| InfluxDB OSS | ❌ | ❌ | ❌ | 低 | 中 |
| InfluxDB Ent | ✅ | ✅ | ❌ | 中 | 中 |
| TimescaleDB | ✅ | ❌ | ❌ | 中 | 低 |
| ClickHouse | ✅ | ❌ | ❌ | 中 | 高 |
1.6 真实案例:从 Prometheus 迁移收益
某互联网公司监控数据概况:
| 指标 | 迁移前 (Prometheus) | 迁移后 (VM) | 变化 |
|---|---|---|---|
| 活跃时间序列 | 200 万 | 200 万 | - |
| 磁盘占用 | 1.2 TB | 150 GB | -87.5% |
| 内存占用 | 64 GB | 16 GB | -75% |
| P99 查询延迟 | 8.5 秒 | 0.6 秒 | -93% |
| 写入吞吐 | 50 万 samples/s | 200 万 samples/s | +300% |
| 月度存储成本 | ¥12,000 | ¥2,400 | -80% |
提示:以上数据基于公开社区分享,实际效果因工作负载而异。
1.7 版本演进
| 版本 | 发布时间 | 重要变更 |
|---|---|---|
| v1.0 | 2018-07 | 初始发布 |
| v1.40 | 2021-03 | 引入 vmctl 数据迁移工具 |
| v1.60 | 2021-09 | 支持多租户 |
| v1.80 | 2022-06 | MetricsQL 增强,性能大幅提升 |
| v1.90 | 2023-03 | 支持 streaming aggregation |
| v1.100 | 2024-01 | 新增 VictoriaLogs 集成 |
| v1.106 | 2025-01 | 增强安全特性,改进 vmui |
1.8 业务场景
场景一:云原生 Kubernetes 监控
- 1000+ 节点 K8s 集群
- 50 万+ Pod,每 Pod 3-5 个指标
- 需要 90 天数据保留
- 推荐方案:VM 集群版 + Prometheus Agent 模式
场景二:IoT 设备数据采集
- 100 万台设备,每 30 秒上报
- 数据量:~300 万 samples/s
- 需要 1 年数据保留
- 推荐方案:VM 单节点(高配)或集群版 + InfluxDB 协议写入
场景三:原有 Prometheus 扩展
- 当前使用 Prometheus,数据增长导致性能下降
- 不希望大幅改动现有配置
- 推荐方案:Prometheus + VM 作为 remote storage,渐进式迁移
本章小结
| 要点 | 内容 |
|---|---|
| 定位 | 高性能、低成本的 Prometheus 长期存储与替代方案 |
| 核心优势 | 高压缩率、快查询、简单运维、多协议支持 |
| vs Prometheus | VM 在大规模场景下显著优于 Prometheus,且完全兼容 |
| vs InfluxDB | VM 更适合纯时序指标场景,InfluxDB 适合事件型数据 |
| 适用场景 | K8s 监控、IoT、Prometheus 扩展、长期存储 |