VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 与其他 TSDB 对比——Prometheus/InfluxDB/Thanos/VM

VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 与其他 TSDB 对比——Prometheus/InfluxDB/Thanos/VM

当你需要为监控系统选择存储后端时,是否曾在 Prometheus、InfluxDB、Thanos 和 VictoriaMetrics 之间犹豫不决?

每个系统都有各自的优势和适用场景,理解它们的设计差异,才能做出正确的选择。

读完本篇,你应该能回答:四大 TSDB 的核心设计差异是什么?各自的优劣势是什么?在什么场景下应该选择哪个系统?为什么 VictoriaMetrics 被称为 "Prometheus 的超集"?

VictoriaMetrics Prometheus InfluxDB Thanos TSDB对比 选型指南 v1.146.0

学习重点提示建议先通读全文,再重点回顾标注内容

重点掌握(必须)

  • 存储引擎对比:TSDB Head vs LSM Tree vs MergeSet
  • 内存模型对比:全量 mmap vs 按需缓存
  • 水平扩展对比:不支持 vs Enterprise vs Sidecar vs 原生 Cluster
  • 选型指南:根据场景选择合适的 TSDB

次重点(了解即可)

  • 数据模型差异
  • 查询语言对比
  • 运维复杂度对比

文章目录

一、问题的起点:四大 TSDB 概述

思考记忆提示理解四大 TSDB 的定位是选型的基础——它们面向不同的场景

  • Prometheus = 单机存储的事实标准
  • InfluxDB = 企业级时序分析平台
  • Thanos = Prometheus 的扩展方案
  • VictoriaMetrics = 高性能 Prometheus 替代方案

1.1 四大 TSDB 一览

说明

以下表格中的 GitHub Stars 数量和诞生年份未经验证,可能与实际情况不符。Stars 数量随时间变化,建议直接访问各项目 GitHub 页面核实。

系统定位诞生年份GitHub Stars主要用户
Prometheus 云原生监控标准 CNCF 所有项目
InfluxDB 企业级时序分析 大型企业
Thanos Prometheus 扩展 大规模部署
VictoriaMetrics 高性能监控存储 官方文档列出 Grammarly、Roblox、Wix、Spotify 等为案例
我理解源码的意思是说

VictoriaMetrics 的存储引擎设计,可以直接从源码里读出来。我们不看任何类比,直接看四个关键文件,就能理解 MergeSet 为什么这样设计:

源码视角一:MergeSet 只合并不分层的核心逻辑

lib/mergeset/table.go 第 1-80 行,会发现 MergeSet 的核心设计原则:数据只通过合并(merge)操作整理,绝不原地更新或分层。写入路径上,一个 InMemory Part 刷盘后变成 Small Part,若干 Small Part 合并成 Big Part——整个过程是单向的,没有 LSM Tree 的 L0→L1→L2 分层概念。

源码视角二:Part 合并的触发条件

lib/storage/partition.go 第 41 行和第 524 行:

const defaultPartsToMerge = 15

if len(rrss.rowssToFlush) >= defaultPartsToMerge {
    // 触发合并
}

当一个分区的 Part 数量达到 15 时,自动触发合并。这就是 MergeSet 控制 Part 数量的机制。

源码视角三:为什么这样设计适合时序数据

时序数据的三个特点决定了 MergeSet 的设计选择:

  • 追加写入为主:几乎不更新和删除,所以不需要 LSM Tree 的更新能力
  • 查询通常是范围查询:MergeSet 的线性扫描路径更简单,没有跨层合并开销
  • 热点数据集中在近期:InMemory Part 和 Small Part 承载热点数据,Big Part 承载冷数据

源码视角总结:2 个设计原则

  • 1 个写入原则:defaultPartsToMerge = 15 触发合并,控制 Part 数量
  • 1 个读取原则:所有 Part 在同一层查询,无跨层合并

避坑提醒(源码视角):

  • 不要以为 MergeSet 等于没有合并:合并是核心机制,由 defaultPartsToMerge = 15 控制
  • 不要混淆 MergeSet 和 LSM Tree:MergeSet 没有分层,LSM Tree 有分层

二、存储引擎对比:TSDB Head vs LSM Tree vs MergeSet

思考记忆提示存储引擎是 TSDB 的核心——理解它就理解了性能差异的根因

  • Prometheus TSDB = Head Block + mmap
  • InfluxDB TSM = LSM Tree 变体 + WAL
  • VM MergeSet = 只合并不分层

2.1 存储引擎对比表

特性Prometheus TSDBInfluxDB TSMVictoriaMetrics MergeSet
数据结构 Head Block + TSDB Block TSM File (LSM Tree) InMemory + Small/Big Part
合并策略 Leveled Compaction Leveled Compaction 单向合并(无分层)
刷盘策略 Head 满后刷盘 MemTable 满后刷盘 每秒刷盘(WAL-less)
写入性能 高(WAL 同步) 极高(WAL-less)
查询性能 中等(多层 Block) 中等(LSM 分层) 高(无分层)
空间放大 中等

2.2 核心差异分析

┌─────────────────────────────────────────────────────────────────────────┐
│                    存储引擎核心差异                                           │
│                                                                          │
│  Prometheus TSDB:                                                        │
│  ┌─────────────────────────────────────────────────────────────────┐     │
│  │  MemPart ──→ TSDB Block L0 ──→ TSDB Block L1 ──→ ...        │     │
│  │  (Head)        (mmap)         (mmap)                            │     │
│  │                                                                   │     │
│  │  特点:Head 满后刷盘,Block 按时间分界,分层合并                  │     │
│  └─────────────────────────────────────────────────────────────────┘     │
│                                                                          │
│  InfluxDB TSM:                                                          │
│  ┌─────────────────────────────────────────────────────────────────┐     │
│  │  MemTable ──→ TSM L0 ──→ TSM L1 ──→ TSM L2 ──→ ...          │     │
│  │  (WAL)          (10MB)     (100MB)    (1GB)                   │     │
│  │                                                                   │     │
│  │  特点:WAL 持久化保证可靠性,LSM 分层合并                        │     │
│  └─────────────────────────────────────────────────────────────────┘     │
│                                                                          │
│  VictoriaMetrics MergeSet:                                              │
│  ┌─────────────────────────────────────────────────────────────────┐     │
│  │  InMemoryPart ──→ Small Part ──→ Big Part                      │     │
│  │  (1秒刷盘)          (合并)         (合并)                        │     │
│  │                                                                   │     │
│  │  特点:没有分层!所有 Part 在同一层,只合并不更新                 │     │
│  └─────────────────────────────────────────────────────────────────┘     │
│                                                                          │
│  关键洞察:                                                              │
│  - Prometheus/InfluxDB 用分层 LSM Tree,换取写入性能,引入读放大         │
│  - VM 用无分层 MergeSet,换取读性能,引入少量写放大                       │
│  - 时序数据以读为主(监控告警),VM 的设计更匹配访问模式                   │
└─────────────────────────────────────────────────────────────────────────┘

设计精髓

MergeSet 的核心洞察:时序数据的访问模式天然适合只合并不分层的架构。时序数据有三个特点:

  • 追加写入为主:几乎不更新和删除(除非 delete series)
  • 查询通常是范围查询:最近 N 分钟/小时/天
  • 热点数据集中在近期:历史数据查询少

这意味着:分层 LSM Tree 的"更新"能力在时序场景下几乎无用武之地,反而引入了空间放大和读放大。MergeSet 放弃了更新能力,换取了更简单的查询路径和更低的资源消耗。

三、内存模型对比:全量 mmap vs 按需缓存

思考记忆提示内存模型是 VM 的核心优势——理解它就理解了 VM 按需缓存的设计

  • Prometheus = 全量 mmap(所有索引常驻)
  • InfluxDB = 分层缓存(可配置)
  • VictoriaMetrics = 按需缓存(TSIDCache 37%)

3.1 内存模型对比表

特性PrometheusInfluxDBVictoriaMetrics
索引策略 全量 mmap 分层缓存 按需缓存(37%)
数据缓存 依赖 Page Cache 可配置缓存层 blockCache 三层
内存可控性 不可控 可配置 精确控制
内存占用 取决于 mmap 范围 高(Enterprise) 按 memory.Allowed() 配置
省内存能力 基准 ~1x 按需缓存(memory.Allowed() 控制)

3.2 核心差异详解

┌─────────────────────────────────────────────────────────────────────────┐
│                    内存模型核心差异                                           │
│                                                                          │
│  Prometheus(mmap):                                                     │
│  ┌─────────────────────────────────────────────────────────────────┐     │
│  │  所有索引 ──→ mmap ──→ Page Cache ──→ 查询加载                 │     │
│  │                                                                   │     │
│  │  问题:索引全量加载,查询越多内存占用越大                         │     │
│  │  优点:查询一定命中缓存(内核管理)                               │     │
│  └─────────────────────────────────────────────────────────────────┘     │
│                                                                          │
│  VictoriaMetrics(按需缓存):                                            │
│  ┌─────────────────────────────────────────────────────────────────┐     │
│  │  热点索引 ──→ TSIDCache 37% ──→ 内存                         │     │
│  │  冷数据   ──→ indexDB ──→ 按需加载                            │     │
│  │                                                                   │     │
│  │  优点:内存占用可控,按需加载                                   │     │
│  │  问题:冷数据查询需要读磁盘                                     │     │
│  └─────────────────────────────────────────────────────────────────┘     │
│                                                                          │
│  关键洞察:                                                              │
│  - Prometheus 的 mmap 适合"查询所有数据"场景                            │
│  - VM 的按需缓存适合"查询热点数据"场景                                  │
│  - 监控数据的访问模式天然是热点访问(近期数据查询多)                      │
└─────────────────────────────────────────────────────────────────────────┘

四、水平扩展对比:四种扩展模式的本质差异

思考记忆提示水平扩展能力决定了系统能支持多大——这是选型的关键因素

  • Prometheus = 不支持水平扩展
  • InfluxDB = Enterprise 专属
  • Thanos = Prometheus + Sidecar 代理
  • VictoriaMetrics = 原生 Cluster 支持

4.1 水平扩展对比表

特性PrometheusInfluxDBThanosVictoriaMetrics
扩展模式 不支持 Enterprise 专属 Sidecar + 对象存储 原生 Cluster
数据分片 Hash + 时间 Prometheus 本地 一致性哈希
查询聚合 内置 Query Layer vmselect
副本复制 Enterprise 对象存储 Enterprise
多租户 Federation 支持 不支持 支持

4.2 核心差异分析

┌─────────────────────────────────────────────────────────────────────────┐
│                    扩展模式核心差异                                           │
│                                                                          │
│  Prometheus(单机):                                                     │
│  ┌─────────────────────────────────────────────────────────────────┐     │
│  │  Prometheus ──→ 本地存储                                        │     │
│  │                                                                   │     │
│  │  扩展方式:Federation(联邦)                                   │     │
│  │  Prometheus A ──→ Prometheus Center ──→ Prometheus B             │     │
│  │                                                                   │     │
│  │  本质:不是真正的扩展,只是视图聚合                               │     │
│  └─────────────────────────────────────────────────────────────────┘     │
│                                                                          │
│  Thanos(Prometheus + 对象存储):                                         │
│  ┌─────────────────────────────────────────────────────────────────┐     │
│  │  Prometheus A ──→ Sidecar ──→ 对象存储                          │     │
│  │  Prometheus B ──→ Sidecar ──→ 对象存储                          │     │
│  │                        │                                          │     │
│  │                        ▼                                          │     │
│  │                    Query Layer ──→ 聚合查询                      │     │
│  │                                                                   │     │
│  │  本质:还是在每个 Prometheus 本地存储,Sidecar 只是备份           │     │
│  └─────────────────────────────────────────────────────────────────┘     │
│                                                                          │
│  VictoriaMetrics(原生 Cluster):                                        │
│  ┌─────────────────────────────────────────────────────────────────┐     │
│  │  vminsert ──→ 一致性哈希 ──→ vmstorage A                       │     │
│  │                                   │                              │     │
│  │                                   └──→ vmstorage B              │     │
│  │                                                                   │     │
│  │  vmselect ──→ 聚合查询 ──→ 返回结果                           │     │
│  │                                                                   │     │
│  │  本质:真正的分布式存储,数据按 tenant 分片                      │     │
│  └─────────────────────────────────────────────────────────────────┘     │
│                                                                          │
│  关键洞察:                                                              │
│  - Prometheus/Thanos 本质还是单机存储,只是加了视图聚合或备份              │
│  - VM 原生 Cluster 是真正的分布式存储,数据天然分片                        │
│  - 对于需要真正水平扩展的场景,VM 是更好的选择                             │
└─────────────────────────────────────────────────────────────────────────┘

小贴士扩展模式选择建议

根据扩展需求选择:

  • < 100 万 series:Prometheus 足够
  • 100-500 万 series:Thanos 或 VM Single-Node
  • > 500 万 series:VM Cluster
  • Enterprise 功能需求:InfluxDB Enterprise 或 VM Enterprise

五、数据模型与查询语言对比

思考记忆提示数据模型和查询语言决定了系统的表达能力——迁移成本也与此相关

  • Prometheus/VM = 标签模型 + PromQL
  • InfluxDB = Tag/Field 模型 + InfluxQL/Flux

5.1 数据模型对比

特性PrometheusInfluxDBVictoriaMetrics
数据模型 Metric + Labels Measurement + Tag + Field Metric + Labels
标签类型 字符串 Tag(索引)/Field(不索引) 字符串
字段支持 单一值 多字段 单一值
时间戳精度 毫秒 纳秒(可配置) 纳秒

5.2 查询语言对比

特性PromQLInfluxQLMetricsQL
来源 Prometheus InfluxDB VictoriaMetrics
兼容性 标准 InfluxDB 专属 PromQL 超集
独有函数 基础聚合 连续查询 running_max/min/sum
迁移难度 N/A 低(PromQL 兼容)

注意

VictoriaMetrics 兼容 PromQL,并扩展了 MetricsQL,提供更多高级函数。如果当前使用 Prometheus,迁移到 VM 几乎没有学习成本。如果当前使用 InfluxDB,迁移到 VM 需要将 InfluxQL 转换为 PromQL。

六、选型指南:根据场景选择合适的 TSDB

思考记忆提示选型是本文的最终目标——理解差异后做出正确决策

  • 小规模 = Prometheus
  • 大规模高性能 = VictoriaMetrics
  • 企业级功能 = InfluxDB Enterprise
  • 已有 Prometheus 扩展 = Thanos

6.1 选型决策树

┌─────────────────────────────────────────────────────────────────────────┐
│                    TSDB 选型决策树                                           │
│                                                                          │
│                          开始                                                │
│                            │                                                │
│                            ▼                                                │
│                    规模是多少?                                             │
│                            │                                                │
│           ┌────────────────┼────────────────┐                              │
│           │                │                │                               │
│           ▼                ▼                ▼                               │
│      < 100万          100-500万        > 500万                            │
│       series           series           series                              │
│           │                │                │                               │
│           ▼                ▼                ▼                               │
│      Prometheus       Thanos或         VM Cluster                         │
│                       VM Single                                         │
│                            │                                              │
│                            ▼                                              │
│                    需要水平扩展吗?                                          │
│                            │                                              │
│           ┌────────────────┴────────────────┐                            │
│           │                              │                                 │
│           ▼                              ▼                                 │
│         是                              否                                  │
│           │                              │                                 │
│           ▼                              ▼                                 │
│      VM Cluster                   Prometheus + Thanos                      │
│           或                              或                                 │
│      Thanos                          VM Single                             │
│                                                                          │
└─────────────────────────────────────────────────────────────────────────┘

6.2 详细选型指南

场景推荐原因
小规模监控(<100万 series) Prometheus 简单、成熟、生态完善
中等规模(100-500万 series) VictoriaMetrics 省内存、高性能、PromQL 兼容
大规模(>500万 series) VictoriaMetrics Cluster 原生分布式、多租户、高可用
已有 Prometheus 迁移 VictoriaMetrics PromQL 完全兼容、迁移成本低
企业级功能(RBAC、审计) InfluxDB Enterprise / VM Enterprise 完整的企业特性
长期存储 + 全球聚合 Thanos 或 VM + 对象存储 对象存储成本低
需要 SQL 查询 InfluxDB(InfluxQL) InfluxQL 更接近 SQL
DevOps/云原生监控 VictoriaMetrics CNCF 生态、Kubernetes 原生

设计精髓

选型的核心原则是匹配场景,平衡成本

  • Prometheus:简单场景首选,不需要额外组件
  • VictoriaMetrics:性能和规模优先,Prometheus 的超集
  • Thanos:已有 Prometheus 基础设施,想扩展长期存储
  • InfluxDB:需要企业特性或 SQL -like 查询

七、FAQ:常见疑问

思考记忆提示FAQ 是全篇的"临考前速背"模块,20 组覆盖全链路

  • Q1-Q5 围绕存储引擎:TSDB Head vs LSM Tree vs MergeSet
  • Q6-Q10 围绕内存模型:全量 mmap vs 按需缓存
  • Q11-Q15 围绕扩展能力:四种扩展模式对比
  • Q16-Q20 围绕选型建议:场景与系统匹配

Q1. Prometheus 能支持多少时间序列?

官方建议 < 100 万 series,实际取决于可用内存。Prometheus 的 mmap 索引会占用额外内存,具体占用取决于标签数量和数据量。

Q2. VictoriaMetrics 为什么比 Prometheus 省内存?

因为 VM 使用按需缓存策略,不是全量 mmap。Prometheus 的 mmap 会导致所有索引数据被内核加载到 Page Cache,而 VM 使用多个独立缓存(TSID 缓存 37%、MetricID 缓存 6.25%、MetricName 缓存 10%,见 lib/storage/storage.go 第 338-370 行),冷数据按需从磁盘加载。

Q3. Thanos 和 VictoriaMetrics 有什么区别?

Thanos 是 Prometheus 的扩展,VM 是独立的存储引擎。Thanos 通过 Sidecar 代理 Prometheus 的数据,本质上还是依赖 Prometheus 的 TSDB。VictoriaMetrics 自己实现 MergeSet 存储引擎,不依赖 Prometheus。

Q4. 从 Prometheus 迁移到 VictoriaMetrics 容易吗?

非常容易,PromQL 完全兼容。VictoriaMetrics 兼容 Prometheus 的所有协议和数据格式。使用 vmagent 或 Remote Write 代理新数据,使用 vmctl 迁移历史数据,Grafana 数据源无缝切换。

Q5. InfluxDB 和 VictoriaMetrics 哪个性能更好?

Benchmark 显示,在相同硬件下 VM 的写入吞吐和查询延迟都优于 InfluxDB。具体倍数取决于数据特征和测试场景,建议参考官方或第三方实测数据。

Q6. 什么场景下应该选择 Thanos?

已有 Prometheus 基础设施,需要扩展长期存储和全局视图。Thanos 的优势是可以复用现有的 Prometheus 配置,不需要迁移。

Q7. 什么场景下应该选择 InfluxDB?

需要企业级特性(RBAC、审计、连续查询)或 SQL-like 查询。InfluxDB Enterprise 提供完整的企业功能,但成本较高。

Q8. VictoriaMetrics 支持高可用吗?

支持,Enterprise 版本提供副本复制和故障转移。Cluster 模式下可以将数据复制到多个 vmstorage 节点,实现高可用。

Q9. MergeSet 和 LSM Tree 哪个更好?

取决于场景:时序数据更适合 MergeSet,事务型数据更适合 LSM Tree。时序数据的特点是追加写入为主、很少更新,MergeSet 的只合并不分层设计更匹配这个访问模式。

Q10. VictoriaMetrics 的压缩率是多少?

压缩率取决于数据特征。Counter 类型(平滑变化)压缩率高,Histogram 类型压缩率低。具体压缩率建议通过实测获取。

Q11. Prometheus 的 Federation 和 VictoriaMetrics 的 Cluster 有什么区别?

Prometheus Federation 只是视图聚合,VM Cluster 是真正的数据分片。Federation 只是将多个 Prometheus 实例的查询结果聚合起来,每个实例仍然是完整的数据副本。VM Cluster 将数据按 tenant 分片到不同节点。

Q12. 哪个系统运维最简单?

Prometheus 最简单,VictoriaMetrics 次之,InfluxDB/Thanos 最复杂。Prometheus 是单一二进制,不需要额外组件。VictoriaMetrics 也是单一二进制,但需要 Cluster 时组件较多。InfluxDB Enterprise 架构复杂,需要专人维护。

Q13. 哪个系统生态最好?

VictoriaMetrics 在 CNCF Landscape 中处于 Observability 分类。Prometheus 是 CNCF 毕业项目,Grafana 原生支持。VictoriaMetrics 完全兼容 Prometheus 生态,具体 CNCF 会员状态请参考 CNCF Landscape 官方页面。

Q14. VictoriaMetrics 的缺点是什么?

主要缺点:1)相对较新;2)Enterprise 版本需要付费;3)文档相对较少。Prometheus 生态更成熟。

Q15. 如何从 InfluxDB 迁移到 VictoriaMetrics?

使用 vmctl influx 命令迁移数据。vmctl 支持从 InfluxDB 导出数据,然后导入到 VictoriaMetrics。需要将 InfluxQL 转换为 PromQL。

Q16. 存储成本对比如何?

VictoriaMetrics 的高压缩率和按需缓存设计降低了存储成本。具体数字取决于数据特征,建议通过实测获取。

Q17. 可以同时使用 Prometheus 和 VictoriaMetrics 吗?

可以,Prometheus Remote Write 支持多目的地。可以配置 Prometheus 同时写入 Prometheus 本地存储和 VictoriaMetrics。

Q18. VictoriaMetrics 支持哪些协议?

VictoriaMetrics 支持多种协议。包括 Prometheus remote_write、InfluxDB line protocol 等,具体支持的协议数量请参考官方文档 docs.victoriametrics.com

Q19. 迁移到 VictoriaMetrics 需要停机吗?

不需要,可以热迁移。配置 Prometheus Remote Write 同时写入旧系统和 VM,切换 Grafana 数据源到 VM,然后停止旧系统。

Q20. VictoriaMetrics 的未来发展如何?

VictoriaMetrics 持续更新中,路线图包括 VictoriaLogs 集成等。更多路线图信息请参考官方文档。

全篇必记总纲

四大 TSDB 的选择核心是匹配场景:小规模用 Prometheus(简单成熟),大规模高性能用 VictoriaMetrics(按需缓存 + 原生 Cluster),已有 Prometheus 扩展用 Thanos(复用配置),企业级功能用 InfluxDB Enterprise。VM 是 Prometheus 的超集,PromQL 完全兼容,迁移成本最低,推荐作为 Prometheus 的长期替代方案。

八、Roadmap:后续预告

本篇覆盖了四大 TSDB 的对比分析,后续将深入各个专题:

  • #11 开源生态:VM 在 CNCF 生态中的位置——理解 VM 的生态位
  • #12 源码阅读路线图:如何高效阅读 VM 源码——最佳实践
  • #192 Prometheus TSDB vs VM:Benchmarks 数字真相——深度对比
  • #41 MergeSet vs LSM Tree:存储引擎专题——MergeSet 源码深度解析
  • #146 10 亿 Series 规模:超大规模 VM 部署架构——生产极限专题

本文参考与源码链接:
  • VictoriaMetrics 官方对比文档
  • Prometheus 官网
  • InfluxDB 官网
  • Thanos 官网

posted @ 2026-06-29 01:24  左扬  阅读(35)  评论(0)    收藏  举报