惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tor Project blog
V2EX - 技术
V2EX - 技术
S
Security Affairs
Help Net Security
Help Net Security
Webroot Blog
Webroot Blog
N
News and Events Feed by Topic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Blog — PlanetScale
Blog — PlanetScale
S
SegmentFault 最新的问题
T
Threat Research - Cisco Blogs
Scott Helme
Scott Helme
IT之家
IT之家
W
WeLiveSecurity
U
Unit 42
博客园 - 聂微东
Vercel News
Vercel News
爱范儿
爱范儿
GbyAI
GbyAI
H
Hacker News: Front Page
Y
Y Combinator Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
PCI Perspectives
PCI Perspectives
博客园 - 三生石上(FineUI控件)
博客园_首页
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Microsoft Security Blog
Microsoft Security Blog
宝玉的分享
宝玉的分享
MyScale Blog
MyScale Blog
A
About on SuperTechFans
Cloudbric
Cloudbric
博客园 - 叶小钗
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
Troy Hunt's Blog
The GitHub Blog
The GitHub Blog
A
Arctic Wolf
Latest news
Latest news
AWS News Blog
AWS News Blog
MongoDB | Blog
MongoDB | Blog
量子位
Spread Privacy
Spread Privacy
D
DataBreaches.Net
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Schneier on Security
Recorded Future
Recorded Future
T
Threatpost
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

博客园 - 左扬

VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 与其他 TSDB 对比:Prometheus/InfluxDB/Thanos/VM VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 写入吞吐/查询延迟/内存占用的数学模型 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 模块依赖图——从 import 语句看组件关系 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— Goroutine 池/atomic/零拷贝/sync.Pool VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 多租户架构——accountID/projectID 与 tenant 隔离 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 版本演进:1.146.0 LTS 重大更新解析 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 整体数据流:一条监控数据的完整生命周期 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— 架构演进:从 TSDB 到 MergeSet 的设计取舍 VictoriaMetrics 1.146.0 源码专题【左扬精讲】—— Single-Node vs Cluster 模式本质区别 Rust 专题【左扬精讲】—— 从语法到灵魂:Ownership、Borrowing 与多语言对比 kubernetes 源码【左扬精讲】—— kube-scheduler 启动流程源码分析 Rust 专题【左扬精讲】—— 选择控制语句、运算符与格式化输出 Rust 专题【左扬精讲】—— 所有权详解 Rust 专题【左扬精讲】—— 作用域详解 Rust 专题【左扬精讲】—— 变量、常量与标量数据类型 kubernetes 源码 / Operator 专题【左扬精讲】—— Deployment Controller 源码分析:从对象创建到滚动更新 kubernetes 源码 / Operator 专题【左扬精讲】—— Operator 开发中的 Webhook:从准入控制到生产部署 Kubernetes源码 / Operator 专题【左扬精讲】—— 实现 Application Controller:从零构建生产级控制器 Kubernetes 编程 / Operator 专题【左扬精讲】—— 定义 Application 资源 + 添加自定义新 API 完整指南 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 八):内部架构与核心组件 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 八): —— 从入口到调度的全链路源码剖析(k8s v1.36.1) DeepSeek-R1 多模态 R1 / VLM-GRPO【左扬精讲】—— Qwen2-VL 微调与视觉推理强化学习实战 DeepSeek-R1 工业 RAG + 微调混合系统【左扬精讲】—— R1 系列收官之作:从 Prompt → RAG → 微调 选型决策树 DeepSeek-R1 推理时扩展【左扬精讲】—— o1 / R1 慢思考机制:Self-Consistency + ToT + PRM 详解 DeepSeek-R1 端侧 LLM 工程【左扬精讲】—— llama.cpp 调参与 Apple Silicon / 国产 NPU / Android 端侧落地全攻略 DeepSeek-R1 vLLM + k8s 生产部署【左扬精讲】—— 从单卡 7B 到 100 卡 671B MoE 集群的工业化部署实战 DeepSeek-R1 评估与系统(Evaluation & Systems)【左扬精讲】—— 从 GSM8K/MMLU 到 LLM-as-Judge 的工业级评估方法论 DeepSeek-R1 模型训练与算法【左扬精讲】—— GRPO 进阶算法:DAPO / PRIME / RLVR / PRM 四大 2025 前沿改进 DeepSeek-R1 模型训练与算法【左扬精讲】—— 数据蒸馏:用 DeepSeek-R1-671B 生成 800K 高质量 CoT 样本的完整流水线 DeepSeek-R1 优化与微调实战【左扬精讲】—— 从 R1 强化学习新范式到 GRPO 微调一站式入门 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 七):自定义插件开发实战 —— 手写一个 Score 插件并注册到集群 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 六):Scheduler Profile 与多调度器 —— 如何配置多个 profile 实现多租户、Coordinated LeaderElection Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 五):SchedulingQueue 与 QueueingHint —— 三段队列的细节、v1.36 新引入的 QueueingHint 工作机制 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 四):抢占(Preemption)算法剖析 —— DefaultPreemption 如何选 victim、PodDisruptionBudget 如何约束 Kubernetes 源码【左扬精讲】—— kube-scheduler(调度专题 · 二):内置插件逐个精读 — NodeResourcesFit / NodeAffinity / TaintToleration / PodTopologySpread / VolumeBinding / InterPodAffinity Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):调度器内置插件 逐个精读 k8s 源码级精讲(二十六):调度器内置插件逐个精读 Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):调度器内置插件精读 — NodeResourcesFit / NodeAffinity / TaintToleration / PodTopologySpread / VolumeBinding / InterPodAffinity Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):Scheduling Framework 扩展点逐个源码拆解 Kubernetes 源码 / Operator 专题【左扬精讲】——kube-scheduler(调度专题):初识调度模型、内部架构与事件驱动机制 Kubernetes 编程 / client-go 专题【左扬精讲】—— 四种客户端:为什么、怎么选、怎么用 Kubernetes 编程 / Operator 专题【左扬精讲】—— controller-runtime、kubebuilder、operator-sdk 三大框架深度对比 Kubernetes 编程 / Operator 专题【左扬精讲】—— 深入理解 ManagedFields 字段冲突协调机制 Kubernetes 编程 / Operator 专题【左扬精讲】—— k8s Finalizers 深度解析:对象的生命周期与删除控制 Kubernetes 编程 / Operator 专题【左扬精讲】—— OwnerReference 字段与级联删除机制 Kubernetes 编程 / Operator 专题【左扬精讲】—— 深入学习 Server-Side Apply:managedFields 替代 last-applied-configuration 的演进方向 Kubernetes 编程 / Operator 专题【左扬精讲】—— k8s Annotations 与元数据体系(Operator 专题) Kubernetes 编程 / Operator 专题【左扬精讲】—— RESTMapper:把 Group / Version / Kind / Resource 四元组翻译成 REST 路径的"查字典"大师 Kubernetes 编程 / Operator 专题【左扬精讲】—— Converter 资源版本转换器 Kubernetes 编程 / Operator 专题【左扬精讲】—— Application 业务扩展:从单 Deployment 到多 Workload 的复合 Operator 演进 Kubernetes 编程 / Operator 专题【左扬精讲】—— OwnerReference / Finalizer / 准入控制:k8s 资源生命周期的三大支柱 Kubernetes 编程 / Operator 专题【左扬精讲】—— controller-runtime 框架内幕:从 Manager 到 Reconcile 的全栈拆解 Kubernetes 编程 / Operator 专题【左扬精讲】—— 生产级 Operator 最佳实践:并发安全、资源清理与高可用设计 Kubernetes 编程 / Operator 专题【左扬精讲】—— application-operator Reconcile 循环源码精讲:从 client-go Informer 到 workqueue 的全链路解剖 Kubernetes 编程 / Operator 专题【左扬精讲】—— 从零搭建一个 application-operator 新项目:脚手架、API 设计与基于原生 DeploymentStatus/ServiceStatus 的状态建模 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:生产级 Controller 实践:并发安全、资源清理与高可用设计 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析: Controller 调试与诊断工具:从日志分析到问题定位 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:DynamicClient 操作 CRD:无需代码生成的动态操作 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:控制器与 APIServer 完整交互流程:从 Watch 到缓存同步 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:错误处理与重试机制:WorkQueue 限速器详解 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Leader 选举机制:高可用控制器的必备技能 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Controller 开发模式完整实战 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:SharedInformerFactory 与等待缓存同步 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:从认证配置到 Deployment 操作 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:版本对应、架构组件与组件关系 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Informer 源码深度解析:从底层原理到实战应用 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Reflector 源码深度解析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:ListWatcher 源码深度解析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:Indexer 与 ThreadSafeStore 核心原理与源码深度剖析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:DeltaFIFO 核心原理与源码深度剖析 Kubernetes 编程 / Operator 专题【左扬精讲】—— Client-go 源代码分析:workqueue 核心原理与实战 Kubernetes 编程 / Operator 专题【左扬精讲】—— runtime.Codec 资源编解码:serializer 与 codec 差异、编解码数据结构、codec 核心调用链路 Kubernetes 编程 / Operator 专题【左扬精讲】—— Scheme 资源注册机制全解 Kubernetes 编程 / Operator 专题【左扬精讲】—— Kubernetes 自定义资源的内部版本与外部版本:从源码看版本定义机制 Kubernetes 编程 / Operator 专题【左扬精讲】—— Kubernetes 1.36.1 核心 API 数据结构全解 Kubernetes 编程 / Operator 专题【左扬精讲】—— Kubernetes 构建过程 【AIOPS】一文读懂LLM【左扬精讲】:从诞生到普及,解锁大语言模型的核心密码 【AIOPS】AI Agent 专题【左扬精讲】核心功能篇:MCP-VictoriaMetrics Hooks 源码精讲:Hooks 可观测性的无侵入式实现 【AIOPS】AI Agent 专题【左扬精讲】核心功能篇:MCP-VictoriaMetrics Golang 配置解析源码精讲 ——SRE 自定义 Agent 核心技巧 【AIOPS】AI Agent 专题【左扬精讲】核心功能篇:MCP-VictoriaMetrics Golang 并发模型解析 ——SRE 应对高并发采集的调优思路 【AIOPS】AI Agent 专题【左扬精讲】基础架构篇:MCP-VictoriaMetrics Golang 源码整体架构拆解 ——SRE 必懂的核心模块与数据流 OpenTelemetry 开发实战【左扬精讲】—— 云原生可观测体系构建与分布式追踪二次开发 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 7 —— 基于流量预测模型的智能弹性扩缩容 Operator 实战(AIOps 模型训练与智能扩容(下篇)—— 预测式弹性扩缩容 Operator 落地实现) Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 7 —— 基于流量预测模型的智能弹性扩缩容 Operator 实战(AIOps 模型训练与智能扩容(上篇)—— 时序预测模型构建与离线训练) Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 6 —— 基于运维专家知识库的智能故障诊断与排查 Operator 实战 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 5 —— 基于大语言模型(LLM)的实时日志流智能监测 Operator 实现 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 4 —— 基于 Operator 实现大模型私有化部署与管理 Kubernetes 编程 / Operator 专题【左扬精讲】—— Operator 开发实战项目 3(上篇)—— 面向 AI / 算力调度场景:GPU 竞价实例资源池统一调度管理 Operator 开发 Kubernetes编程 / Operator专题【左扬精讲】—— Operator 开发实战项目 2 —— 面向零售 / 电商潮汐流量难题:多云多集群数据中心级全链路弹性伸缩 DataCenter Scaler Operator 从 0 到 1 全链路开发 Kubernetes编程 / Operator专题【左扬精讲】—— 深入理解Kubebuilder注解:为什么Operator开发离不开这些特殊注释 Kubernetes编程 / Operator专题【左扬精讲】—— Operator 开发实战项目1 —— Applicaion Operator(通用应用生命周期管理 Operator 实战) Pod 镜像拉取失败?kubectl edit pods修改镜像地址的底层原理与实操 (该方法仅为临时应急方案,并非长期解决方案) Kubernetes编程/Operator专题精讲—— 理解控制器模式 —— 控制器模式的核心原理与实现逻辑(从原理到实践) 【AIOPS】AI Agent 专题【左扬精讲】模型微调实战:一站式平台 LLaMA-Factory 【AIOPS】AI Agent 专题【左扬精讲】基于 k8s+vLLM+Ray 分布式部署全指南:架构设计、资源调度与性能优化 【AIOPS】AI Agent专题【左扬精讲】非量化版DeepSeek分布式部署全指南:精度保障、显存规划与Ollama/vLLM选型 【AIOPS】AI Agent 专题【左扬精讲】零开发框架实现 ReAct Agent(Go SRE友好)
VictoriaMetrics 1.146.0 源码【左扬精讲】—— 开篇总览
左扬 · 2026-06-27 · via 博客园 - 左扬

VictoriaMetrics 1.146.0 源码【左扬精讲】—— 开篇总览

这是 VictoriaMetrics 深度技术系列的开篇索引文章。如果你正在寻找一个高性能、节省资源的时序数据库(TSDB)解决方案;如果你想知道 Prometheus 的"增强版"到底强在哪里;如果你渴望深入理解 MergeSet 存储引擎、LSM-less 设计、7x RAM 节省背后的工程原理——那么这个系列将带你从源码层面彻底读懂 VictoriaMetrics。

本系列基于 VictoriaMetrics v1.146.0 LTS 版本(Long-Term Support),共规划 200 篇正文 + 10 篇附录,覆盖架构设计、组件原理、存储引擎、查询引擎、工具链、运维实践、排障调优等 14 个维度。每一篇都从源码出发,兼顾理论深度和实战落地。

VictoriaMetrics 时序数据库 Prometheus MergeSet 云原生监控 Go 存储引擎 v1.146.0 LTS

学习重点提示

系列核心价值(必须掌握)

  • 架构设计哲学:理解 VM 为什么能做到比 Prometheus 省 7x RAM(MergeSet vs TSDB、LSM-less 设计)
  • 存储引擎原理:MergeSet 只合并不分层的 LSM-less 设计,commonPrefix 压缩,NearestDelta 编码
  • 完整组件体系:vminsert/vmselect/vmstorage 三层架构,12 种协议接入,Cluster 模式
  • 性能优化方法论:TSIDCache 37% 策略、blockCache 三层设计、rawItemsShards 分片

系列扩展知识(了解即可)

  • VictoriaLogs 日志一体化监控
  • Enterprise vs OpenSource 功能差异
  • vmagent/vmalert/vmauth/vmbackup 工具链
  • 与其他 TSDB(InfluxDB/Thanos/Mimir)的对比

文章目录

一、VictoriaMetrics 是什么?为什么它是 Prometheus 的"超级增强版"?

思考记忆提示本节是系列的"入口"——弄清楚 VM 是什么、解决了什么问题,才能理解后面每篇的定位

  • VictoriaMetrics 是一个高性能、低资源占用的时序数据库,兼容 Prometheus 生态
  • 核心优势:比 Prometheus 省 7x RAM、支持集群模式、无限 cardinality、长期存储
  • 面试高频提问:VictoriaMetrics 和 Prometheus 的区别是什么?什么时候选择 VM 而不是 Prometheus?

VictoriaMetrics(简称 VM)是一个开源的时序数据库(Time Series Database, TSDB),专门为云原生监控场景设计。它与 Prometheus 完全兼容,支持 Prometheus remote_write 协议、Grafana 数据源、以及 PromQL 查询语言。但 VM 的野心不止于"兼容"——它要做的是在保持兼容性的同时,大幅超越 Prometheus 的性能和资源效率

我的理解的意思是说

可以把 VictoriaMetrics 想象成一个超级版 Prometheus

  • Prometheus 是单机版数据库——数据存在本地,不能水平扩展,内存受限于单机
  • VictoriaMetrics 是分布式版 Prometheus——支持集群模式,可以横向扩展,同时内存占用还更少
  • 类比:如果 Prometheus 是"一台服务器",VictoriaMetrics 就是"一个服务器集群",但消耗的电力(资源)反而更少

VictoriaMetrics 由 Aliaksandr Valialkin 于 2019 年创建,最初是为了解决 Promscale(InfluxDB on PostgreSQL)的性能和存储成本问题。经过多年发展,VM 已经成为 CNCF 生态中最受欢迎的时序数据库之一,GitHub 超过 15k stars,被 Spotify、Roblox、Grammarly、DoorDash 等知名公司采用。

1.1 VictoriaMetrics 的四大核心优势

为什么选择 VictoriaMetrics 而不是 Prometheus 原生?以下四个优势是 VM 脱颖而出的关键:

设计精髓

VictoriaMetrics 的设计哲学是:在不牺牲兼容性的前提下,用更少的资源做更多的事。这体现在四个维度:存储效率(MergeSet 压缩)、内存效率(LSM-less + 缓存策略)、查询性能(并行 k-way 归并)、扩展性(Cluster 模式)。

维度PrometheusVictoriaMetrics提升幅度
RAM 占用 全量数据常驻内存 TSIDCache 37% + blockCache 分层 省 7x
水平扩展 不支持(单机) Cluster 模式支持 无限扩展
长期存储 需要 Thanos/Mimir 内置 retention 原生支持
Cardinality 有限制 BloomFilter 动态调整 更高上限

1.2 与 Prometheus 的关系:不是替代,是增强

理解 VictoriaMetrics 和 Prometheus 的关系非常重要:VM 不是要替代 Prometheus,而是要解决 Prometheus 的局限性。Prometheus 仍然是一个优秀的抓取和告警工具,但它的本地存储不适合大规模长期存储。VictoriaMetrics 提供了两种集成方式:

  • 方式一:Prometheus 远程写入 VM(推荐)
    Prometheus 继续负责抓取和告警评估,数据通过 remote_write 协议写入 VictoriaMetrics。VM 作为长期存储和高效查询的后端。
  • 方式二:vmagent 替代 Prometheus
    使用 vmagent(VM 原生的轻量级抓取代理)替代 Prometheus,负责抓取和远程写入。

注意

VictoriaMetrics 不是 Prometheus 的 fork,而是一个完全独立的实现。VM 使用了完全不同的存储引擎(MergeSet vs Prometheus TSDB),但通过完整实现 Prometheus 的 API(/api/v1/*)和协议(remote_write)来实现兼容性。

必记闭环逻辑(核心考点)

VictoriaMetrics 是一个与 Prometheus 完全兼容的时序数据库,通过 MergeSet 存储引擎和 LSM-less 设计实现比 Prometheus 省 7x RAM,同时支持 Cluster 模式无限水平扩展。它不是 Prometheus 的替代品,而是 Prometheus 的"超级增强版后端"。

二、200 篇系列全景导航:14 个维度速览

思考记忆提示本节是系列的"地图"——快速定位你需要的文章,避免迷失在 200 篇的海洋里

  • 系列按 14 个维度组织,总计 200 篇正文 + 10 篇附录
  • 每个维度有明确的定位:理论深度 vs 实战落地
  • 面试高频提问:这个系列覆盖了 VM 的哪些方面?如何快速找到我需要的文章?

200 篇听起来很多,但通过 14 个维度的组织,每一篇都有清晰的定位。以下是每个维度的定位和推荐阅读顺序:

2.1 维度速览表

维度篇数定位推荐阅读
A. 架构设计篇 15 全局架构、设计哲学、组件关系 #01-#15 必读(建立全局认知)
B. 组件深潜篇 25 按组件垂直深挖源码实现 #16-#40(深入理解核心组件)
C. 存储引擎篇 15 storage/mergeset/encoding/cache #41-#55 核心(理解性能基础)
D. 查询引擎篇 15 promql/metricsql/netstorage #56-#70(查询优化必读)
E. 工具链篇 20 vmagent/vmalert/vmauth/vmbackup #71-#90(运维必备)
F. 集成生态篇 10 Grafana/k8s/Prometheus Operator #91-#100(快速上手)
G. 排障调优篇 15 慢查询/cardinality/OOM/写入瓶颈 #101-#115 实操(问题诊断)
H. 进阶专题篇 15 decimal/bytesutil/fastcache/fs #116-#130(深入理解)
I. 运维实践篇 15 迁移/k8s 部署/容量规划 #131-#145(生产环境)
J. 生产极限篇 15 10 亿 series/百万 samples-s #146-#160(大规模场景)
K. 源码追踪篇 15 完整链路追踪:HTTP 到 Part 文件 #161-#175 硬核(源码阅读)
L. VictoriaLogs 协同篇 10 LogQL/指标日志关联 #176-#185(一体化可观测性)
M. 压轴总结篇 15 PromQL 深潜/性能极限/工程哲学 #186-#200(收尾升华)
N. 附录篇 10 速查地图/API 端点/错误码 A1-A10 工具书(日常参考)

我的理解的意思是说

200 篇系列就像一本《VictoriaMetrics 源代码专题研究》

  • A 架构设计篇 = 书的"前言和概述",告诉你 VM 是什么、为什么设计成这样
  • B 组件深潜 + C 存储引擎 = 书的"核心技术章节",深入每个组件的源码
  • G 排障调优 + I 运维实践 = 书的"实战案例章节",告诉你怎么用
  • K 源码追踪 = 书的"深入研究章节",完整追踪一条数据的旅程
  • N 附录 = 书的"工具书部分",快速查阅 API、错误码等

建议先读 A 架构设计篇(建立全局认知),再按需深入其他章节。

2.2 推荐阅读路径

根据不同的学习目标,这里提供三条推荐阅读路径:

  • 路径一:快速入门(5 篇,约 3 小时)
    #01 设计哲学 → #02 全局架构 → #04 整体数据流 → #11 开源生态 → #12 源码阅读路线图
  • 路径二:深度理解(20 篇,约 2 天)
    完成路径一后,继续 #41 MergeSet vs LSM Tree → #51 压缩算法 → #54 TSIDCache → #64 并发控制 → #77-78 vmalert 架构
  • 路径三:生产专家(50+ 篇,约 1 周)
    完成路径二后,系统阅读 #101-#160 排障调优和运维实践,#161-#175 源码追踪

必记闭环逻辑(核心考点)

200 篇系列按 14 个维度组织,覆盖理论深度(A-M)和实战落地(G/I)。推荐从 A 架构设计篇开始(建立全局认知),按需深入组件原理(#16-#55)和源码追踪(#161-#175),附录(A1-A10)作为日常工具书参考。

三、组件体系全貌:从 HTTP 入口到 Part 文件的全链路

思考记忆提示本节是系列的"骨架"——理解组件体系,后续各篇才有上下文

  • VM 分为三层:vminsert(写入)→ vmstorage(存储)→ vmselect(查询)
  • Single-Node 模式三合一,Cluster 模式可分离部署
  • 面试高频提问:VictoriaMetrics 的组件有哪些?Cluster 模式下各组件如何协作?

VictoriaMetrics 的组件体系非常清晰。无论你是使用 Single-Node 模式还是 Cluster 模式,理解这三级架构都是理解 VM 的基础。

3.1 三层架构概述

  VictoriaMetrics 架构分层
│
├── [1] 应用层 (app/)
│   ├── vminsert    — 写入接入层(Prometheus/InfluxDB/DataDog/OTel 等 12+ 协议)
│   ├── vmselect    — 查询执行层(PromQL/MetricsQL/GraphiteQL + 查询调度)
│   └── vmstorage   — 数据存储层(Cluster 模式核心)
│
├── [2] 存储核心层 (lib/storage/)
│   ├── Storage          — 全局协调器:分区/缓存/基数限制
│   ├── Table            — 表级抽象:按月分区生命周期
│   ├── Partition        — 分区级抽象:In-Memory/Small/Big Parts + indexDB
│   └── indexDB          — 倒排索引引擎:8 种索引前缀
│
├── [3] MergeSet 存储引擎 (lib/mergeset/)
│   ├── Table            — 分片/合并调度/刷盘策略
│   ├── Part             — metaindex + index + items + lens 四文件
│   └── InmemoryPart     — 内存未排序 Part,1 秒刷新
│
└── [4] 压缩编码层 (lib/encoding/)
    ├── MarshalType       — 6 种压缩类型
    └── NearestDelta 算法 — Counter/Gauge 自适应差分编码 + ZSTD

3.2 Single-Node vs Cluster 模式

设计精髓

VictoriaMetrics 的核心设计哲学之一是简洁性:Single-Node 模式用同一个进程处理写入、存储、查询三种职责,适合中小规模场景;Cluster 模式将三种职责分离到独立进程,支持水平扩展。这种"单进程可工作,分布式更强大"的设计让 VM 既能简单起步,又能随业务增长平滑升级。

特性Single-NodeCluster
进程数 1 个进程 3 种角色:vminsert、vmstorage、vmselect
扩展方式 垂直扩展(加 CPU/内存/磁盘) 水平扩展(增加 vmstorage/vmselect 节点)
适用规模 < 100 万 series 100 万 ~ 10 亿 series
部署复杂度 极简(一行命令启动) 中等(需要配置负载均衡)
多租户 不支持 支持(accountID/projectID 隔离)

小贴士

如果你的监控规模在 100 万 series 以内,Single-Node 模式通常是最佳选择——部署简单、资源占用低、维护成本小。随着规模增长,再考虑迁移到 Cluster 模式。

3.3 数据写入流程

一条监控数据从 HTTP 入口到永久存储,需要经过以下步骤:

  ┌─────────────────────────────────────────────────────────────────────────┐
│                      VictoriaMetrics 数据写入流程                          │
│                                                                         │
│  ┌──────────────┐    Remote Write     ┌──────────────┐                  │
│  │  Prometheus  │ ─────────────────► │   vminsert   │                  │
│  │  (或 vmagent) │   /api/v1/write  │ (写入接入层)  │                  │
│  └──────────────┘                    └──────┬───────┘                  │
│                                             │                           │
│                                             ▼                           │
│                                    ┌──────────────┐                     │
│                                    │   Storage    │                     │
│                                    │  .addRows() │                     │
│                                    └──────┬───────┘                     │
│                                             │                           │
│                    ┌────────────────────────┼────────────────────────┐  │
│                    │                        │                        │  │
│                    ▼                        ▼                        ▼  │
│           ┌──────────────┐        ┌──────────────┐        ┌──────────────┐
│           │ InMemoryPart │        │  InMemoryPart│        │  InMemoryPart│
│           │  (1秒刷新)   │        │  (1秒刷新)   │        │  (1秒刷新)   │
│           └──────┬───────┘        └──────┬───────┘        └──────┬───────┘
│                  │  rawItemsShards      │  rawItemsShards       │        │
│                  │  (CPU 分片并行)       │  (CPU 分片并行)        │        │
│                  ▼                       ▼                        ▼        │
│           ┌──────────────┐        ┌──────────────┐        ┌──────────────┐
│           │    Part      │        │    Part      │        │    Part      │
│           │ (四文件结构)  │        │ (四文件结构)  │        │ (四文件结构)  │
│           │ metaindex    │        │ metaindex    │        │ metaindex    │
│           │ index        │        │ index        │        │ index        │
│           │ items        │        │ items        │        │ items        │
│           │ lens         │        │ lens         │        │ lens         │
│           └──────────────┘        └──────────────┘        └──────────────┘
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

我的理解的意思是说

写入流程可以想象成快递分拣中心

  • vminsert = 前台接待:接收各种格式的"快递"(Prometheus/InfluxDB/DataDog),统一登记
  • Storage.addRows() = 分拣系统:把数据按 CPU 核心分到不同的"分拣台"(rawItemsShards)
  • InMemoryPart = 临时货架:每 1 秒把货架上的数据打包成一个包裹(Part)
  • Part = 正式包裹:四文件结构(metaindex/index/items/lens),可以长期存储

关键是:分拣台(rawItemsShards)是按 CPU 核心数分片的,所以 VM 的写入性能可以随 CPU 核心数线性扩展。

必记闭环逻辑(核心考点)

VictoriaMetrics 的三层架构(vminsert/vmstorage/vmselect)可以分离部署(Cluster 模式)也可以合一(Single-Node 模式)。数据写入经过:HTTP 入口 → Storage.addRows() → rawItemsShards CPU 分片 → InMemoryPart 1秒刷新 → Part 四文件持久化。

四、核心性能优势:为什么 VM 能做到省 7x RAM?

思考记忆提示本节是系列的"亮点"——理解 VM 的核心优势,为后续深入理解存储引擎做铺垫

  • 省 RAM 的三个关键设计:MergeSet(LSM-less)+ TSIDCache 37% + blockCache 分层
  • 这些设计是相互配合的,不是孤立的优化
  • 面试高频提问:VictoriaMetrics 为什么能比 Prometheus 省这么多内存?TSIDCache 37% 是怎么来的?

"比 Prometheus 省 7x RAM"是 VictoriaMetrics 最广为人知的优势。但这不是单一优化点,而是多个设计决策协同工作的结果。

4.1 三大核心设计

设计精髓

VictoriaMetrics 省 RAM 的核心哲学是:数据按需加载,而非全量常驻。Prometheus 把所有数据块加载到内存(mmap),而 VM 只把热点数据(通过 TSIDCache 和 blockCache)保留在内存,冷数据放在磁盘按需读取。这是典型的"内存-磁盘分层"设计,比 Prometheus 的"内存优先"更节省资源。

设计一:MergeSet vs LSM Tree(LSM-less 设计)

传统的 LSM Tree(如 RocksDB)采用分层合并策略:L0 → L1 → L2 → ... 每层大小呈指数增长,合并时需要同时读取多层数据,内存压力大。VictoriaMetrics 的 MergeSet 采用了只合并不分层的 LSM-less 设计:

  • 新数据先写入内存(InMemoryPart,每 1 秒刷新到磁盘成为 Small Part)
  • 多个 Small Part 合并成 Big Part(但不会合并到更大的层)
  • 查询时只需读取最新的 Big Part + 最近的 Small Part,不需要遍历所有层级

设计二:TSIDCache 37% 策略

VictoriaMetrics 把 -memory.allowedDataPointers 的 37% 用于 TSIDCache。TSIDCache 是 metricName → TSID 的映射缓存:

  • 写入时:先查 TSIDCache,有则直接用,无则创建新 TSID
  • 查询时:根据 metricName 查 TSIDCache,快速定位时间序列
  • 37% 是一个经验值:经过大量测试发现这个比例能最大化缓存命中率

设计三:blockCache 三层设计

blockCache 分为三层,每层缓存不同类型的数据:

层级缓存内容内存占比
ibCache 数据块内容(items.bin) 25%
idxbCache 索引块内容(index.bin) 10%
ibSparseCache ibCache 的稀疏访问优化 5%

4.2 与 Prometheus TSDB 的对比

注意

Prometheus 的内存占用主要来自两个方面:(1) 索引块(Index)全量 mmap 到内存;(2) 数据块(Chunks)按时间窗口预加载。而 VictoriaMetrics 通过 TSIDCache 只缓存热点索引,通过 blockCache 只缓存热点数据块,显著降低了内存占用。

对比维度Prometheus TSDBVictoriaMetrics MergeSet
索引存储 Index 段文件全量 mmap 倒排索引 + TSIDCache 热缓存
数据存储 Chunks 按时间窗口预加载 Parts 按需加载到 blockCache
内存策略 内存优先,尽量放内存 分层缓存,热数据在内存
磁盘空间 标准压缩 commonPrefix + NearestDelta + ZSTD

我的理解的意思是说

两种内存策略可以类比为图书馆管理

  • Prometheus = 把整本书放在桌上:一本书(一个时间序列)要么全在内存,要么不在。书桌上的书越来越多,内存就满了。
  • VictoriaMetrics = 图书馆借阅系统:只有正在看的书(热点数据)在桌上,其他书在书架上(磁盘)。书架上有很多书(TSIDCache 的索引),但桌子只需要放当前在看的章节(blockCache 的数据块)。

TSIDCache 37% 就像是"书的目录卡片抽屉"——虽然书不在桌上,但根据卡片(metricName → TSID)可以快速找到书在哪。

必记闭环逻辑(核心考点)

VictoriaMetrics 省 7x RAM 来自三大设计的协同:(1) MergeSet LSM-less 只合并不分层,减少遍历开销;(2) TSIDCache 37% 策略优先缓存 metricName → TSID 映射;(3) blockCache 三层(ibCache 25% + idxbCache 10% + ibSparseCache 5%)按需缓存数据块。

五、典型应用场景:谁在使用 VictoriaMetrics?

思考记忆提示本节帮助你理解 VM 的适用场景,避免"锤子思维"——把所有问题都当作钉子

  • VM 适合:大规模长期监控、多租户环境、Grafana 集成
  • VM 不适合:超低延迟交易系统、需要强事务的场景
  • 面试高频提问:什么场景适合用 VictoriaMetrics?它和 InfluxDB/Thanos 怎么选?

VictoriaMetrics 已经在生产环境中被多家知名公司使用。以下是典型的应用场景:

5.1 适用场景

  • 大规模 Prometheus 长期存储:当 Prometheus 的本地存储无法满足长期数据保留需求时,VM 作为 remote_write 后端提供无限存储。
  • 高 Cardinality 环境:如 Kubernetes 监控、Service Mesh 可观测性,标签值众多导致 Prometheus OOM,VM 通过 BloomFilter 动态调整基数限制。
  • 多租户监控平台:通过 accountID/projectID 实现资源隔离,适合 SaaS 或内部监控平台。
  • Grafana 集成:原生支持 Prometheus 数据源,Grafana 用户零成本迁移。

5.2 知名用户案例

公司使用规模使用场景
Spotify 数十亿 series 音频流媒体基础设施监控
Roblox 数百万 series 游戏平台实时监控
Grammarly 中等规模 写作工具基础设施监控
DoorDash 大规模 外卖平台配送监控

小贴士

如果你正在使用 Prometheus + Thanos/Mimir,并且遇到了扩展性或成本问题,VictoriaMetrics 是一个值得评估的替代方案。VM 的存储效率通常比 Thanos + Prometheus 高 5-10 倍。

必记闭环逻辑(核心考点)

VictoriaMetrics 的最佳场景是大规模 Prometheus 长期存储(> 100 万 series)、高 Cardinality 环境和多租户监控平台。它不适合需要强事务或超低延迟的交易系统。Spotify、Roblox、Grammarly、DoorDash 等公司已在生产环境验证了 VM 的能力。

六、学习路线图:如何高效阅读这个系列

思考记忆提示本节提供学习路径建议,帮助你高效利用这个系列

  • 建议从 A 架构设计篇(#01-#15)开始,建立全局认知
  • 按需深入 C 存储引擎篇(#41-#55),理解性能基础
  • 面试高频提问:如何快速理解 VictoriaMetrics?如何阅读它的源码?

200 篇系列内容很多,如何高效学习?以下是推荐的学习路径:

6.1 第一阶段:建立全局认知(#01-#15,约 1 周)

这一阶段的目标是理解 VictoriaMetrics 是什么、整体架构是怎样的、为什么能省 7x RAM。重点文章:

  • #01 设计哲学:理解 VM 的核心优势来源
  • #02 全局架构:Single-Node vs Cluster 模式
  • #04 整体数据流:数据从写入到存储的全链路
  • #05 版本演进:了解 1.146.0 LTS 的重大变化
  • #09 性能模型:理解性能常数的来源

6.2 第二阶段:深入核心原理(#41-#70,约 2 周)

这一阶段的目标是理解 MergeSet 存储引擎和查询引擎的内部原理。重点文章:

  • #41 MergeSet vs LSM Tree:理解 VM 的核心存储设计
  • #47 commonPrefix 压缩:存储空间减少 30-50% 的原理
  • #51 6 种压缩算法:NearestDelta 是核心
  • #56 PromQL 执行引擎:查询如何执行
  • #77-78 vmalert 架构:告警评估的完整链路

6.3 第三阶段:实战运维能力(#101-#145,约 2 周)

这一阶段的目标是具备生产环境的故障诊断和运维能力。重点文章:

  • #104 Cardinality 爆炸:最常见的 OOM 原因
  • #105 slow query 诊断:querytracer 使用
  • #107 内存调优:memory.Allowed() 计算
  • #131 从 Prometheus 迁移:vmctl 使用
  • #135 容量规划:硬件选型参考

6.4 第四阶段:源码追踪(#161-#175,约 2 周)

这一阶段的目标是具备独立阅读和理解源码的能力。重点文章:

  • #161 HTTP 到 Part 文件:完整写入链路追踪
  • #162 PromQL 到结果:完整查询链路追踪
  • #163 Part 四文件结构:二进制格式详解
  • #165 indexDB 8 种索引前缀:Tag 查询完整路径
  • #170 TSIDCache 37% 计算:内存分配逻辑

我的理解的意思是说

学习 VictoriaMetrics 就像学习一门武功:

  • 第一阶段(#01-#15) = 看武功秘籍的"总纲",了解整套武功的框架和精髓
  • 第二阶段(#41-#70) = 修炼"内功心法"(存储引擎)和"招式"(查询引擎)
  • 第三阶段(#101-#145) = 下山历练,解决实际问题
  • 第四阶段(#161-#175) = 回山闭关,亲手推导武功秘籍

不要跳阶段!没有全局认知,直接看源码会迷失;没有实战经验,直接追踪源码会缺乏上下文。

必记闭环逻辑(核心考点)

高效学习路径:先用 A 架构设计篇建立全局认知(#01-#15),再用 C 存储引擎篇理解性能基础(#41-#55),接着通过 G/I 排障调优和运维实践培养实战能力(#101-#145),最后用 K 源码追踪深入理解内部原理(#161-#175)。

七、FAQ:常见疑问

思考记忆提示FAQ 是全系列的"临考前速背"模块,覆盖最常见的问题

  • Q1-Q4 围绕基础认知:VM 是什么、和 Prometheus 的关系
  • Q5-Q10 围绕架构设计:Cluster 模式、多租户、存储引擎
  • Q11-Q15 围绕性能优化:内存调优、查询优化、cardinality
  • Q16-Q20 围绕运维实践:部署、迁移、监控

Q1. VictoriaMetrics 和 Prometheus 是什么关系?

VM 是 Prometheus 的长期存储后端,不是替代品。Prometheus 仍然负责抓取(scraping)和告警评估(alerting),数据通过 remote_write 协议写入 VictoriaMetrics。VM 提供了比 Prometheus 原生存储更高的扩展性和更低的资源占用。

Q2. 为什么 VictoriaMetrics 能比 Prometheus 省 7x RAM?

来自三大设计的协同:MergeSet LSM-less + TSIDCache 37% + blockCache 三层。Prometheus 把所有索引和数据块 mmap 到内存,而 VM 只把热点数据(TSIDCache + blockCache)保留在内存,冷数据放在磁盘按需读取。

Q3. Single-Node 和 Cluster 模式有什么区别?什么时候用哪个?

Single-Node 适合 < 100 万 series,Cluster 适合 100 万 ~ 10 亿 series。Single-Node 是单进程,部署简单;Cluster 模式把 vminsert/vmstorage/vmselect 分离部署,支持水平扩展。

Q4. VictoriaMetrics 支持多租户吗?

Cluster 模式原生支持多租户,通过 accountID/projectID 实现隔离。每个租户的数据在存储层完全隔离,适合 SaaS 或内部多业务线监控平台。

Q5. MergeSet 和 LSM Tree 有什么区别?

MergeSet 采用 LSM-less 设计:只合并不分层。LSM Tree(如 RocksDB)有 L0→L1→L2→... 多层合并,开销大;MergeSet 只有 Small Parts 和 Big Parts 两类,查询时只需读最新的 Big Part + 最近的 Small Parts。

Q6. 什么是 commonPrefix 压缩?为什么能节省 30-50% 空间?

commonPrefix 压缩利用标签值的共同前缀来减少存储。例如:metric{job="prometheus",instance="localhost:9090"}metric{job="prometheus",instance="localhost:9091"} 共享 metric{job="prometheus",instance="localhost:909"} 前缀,只需存储一次。

Q7. TSIDCache 37% 是怎么来的?

37% 是经验值,经过大量测试发现这个比例能最大化缓存命中率。TSIDCache 缓存 metricName → TSID 映射,是写入和查询的关键路径。37% 的比例在 cache hit rate 和 memory usage 之间取得了最优平衡。

Q8. BloomFilter 在 VictoriaMetrics 中起什么作用?

BloomFilter 用于基数限制(cardinality limiting),防止高 cardinality 数据打爆 VM。每个小时和每天的 BloomFilter 会记录见过的 metricIDs,如果某小时 metricID 数量超过限制,会拒绝写入。

Q9. VictoriaMetrics 有 WAL(Write-Ahead Log)吗?

没有!这是 VM 的设计选择。Prometheus TSDB 使用 WAL 来保证崩溃恢复,但 WAL 会增加写入延迟。VM 通过 InMemoryPart 每秒刷盘的设计,在保证数据安全的同时避免了 WAL 的开销。

Q10. InMemoryPart 刷盘失败会丢数据吗?

正常情况下不会丢数据。InMemoryPart 在内存中维护多个副本,刷盘时会先写临时文件再原子重命名。如果进程崩溃,正在刷盘的数据可能丢失,但这是 Prometheus remote_write 协议允许的"最多一次"语义范围内。

Q11. Cardinality 爆炸的根本原因是什么?

高 cardinality 来自标签值组合过多。例如:metric{job="foo",instance="ip-1"}metric{job="foo",instance="ip-2"}... 每个 instance 都是一个唯一的 time series。如果有 1 万个 instance,就是 1 万个 series。

Q12. 如何诊断 slow query?

使用 QueryTracer 分析查询各阶段耗时。VM 的 QueryTracer 会在查询的每个阶段记录耗时:parse → plan → execution → merge。打开 debug 日志可以看到详细的阶段信息。

Q13. blockCache 三层(ibCache/idxbCache/ibSparseCache)分别缓存什么?

ibCache 缓存数据块(items.bin),idxbCache 缓存索引块(index.bin),ibSparseCache 是 ibCache 的稀疏访问优化。三者合计占用 memory.allowedDataPointers 的 40%。

Q14. 如何规划 VictoriaMetrics 的内存容量?

内存规划公式:TSIDCache(37%) + blockCache(40%) + 工作内存(23%) ≈ memory.allowed。对于 100 万 series,建议预留 4GB+ 内存;500 万 series 建议 16GB+;1000 万 series 建议 32GB+。

Q15. retention 设置后数据会立即删除吗?

不会立即删除,数据会在后台慢慢清理。VM 每小时检查一次是否有过期数据,清理过程是异步的。磁盘空间释放可能有延迟,这是正常行为。

Q16. 如何从 Prometheus 迁移到 VictoriaMetrics?

使用 vmctl prometheus 命令迁移。vmctl 可以从 Prometheus 的 TSDB 快照中读取数据,批量写入 VictoriaMetrics。迁移过程中 Prometheus 可以继续运行,迁移完成后切换 remote_write 目标。

Q17. vmagent 和 Prometheus 抓取有什么区别?

vmagent 更轻量、更高效,但功能比 Prometheus 少。vmagent 是 VM 官方推荐的抓取代理,支持 relabel 和 service discovery,但不支持告警评估(那是 vmalert 的职责)。

Q18. VictoriaMetrics 的 /metrics 端点有哪些关键指标?

重点关注:vm_rows_inserted_total、vm_cache_size_bytes、vm_merges_total、vm_parts_automerge。这些指标可以监控写入吞吐、缓存效率和合并状态。

Q19. vmalert 和 Prometheus AlertManager 怎么配合?

vmalert 执行告警评估,AlertManager 处理告警路由和通知。vmalert 评估规则后生成告警,发送给配置的 AlertManager(可以是 Prometheus AlertManager 或 vmalert 内置的通知器)。

Q20. 如何在 Kubernetes 中部署 VictoriaMetrics?

推荐使用 Helm Chart 或 VictoriaMetrics Operator。官方 Helm Chart 提供了完整的配置选项;VictoriaMetrics Operator 可以通过 CRD 管理 VM 资源,与 Prometheus Operator 配合使用。

全篇必记总纲

VictoriaMetrics 是 Prometheus 的超级增强版:通过 MergeSet LSM-less 设计、TSIDCache 37% 策略、blockCache 三层缓存实现比 Prometheus 省 7x RAM。Single-Node 适合中小规模,Cluster 支持无限水平扩展和多租户。200 篇系列覆盖架构设计、存储引擎、查询引擎、运维实践全维度。

八、Roadmap:后续预告

思考记忆提示后续预告帮助读者规划学习路径

  • 按顺序阅读:先 A 架构设计篇,再深入其他维度
  • 附录(A1-A10)是日常工具书,不需要按顺序阅读

本篇是 VictoriaMetrics 深度技术系列的开篇索引,接下来我们将按以下顺序展开:

  • A. 架构设计篇(#01-#15):设计哲学、全局架构、存储引擎对比、性能模型
  • B. 组件深潜篇(#16-#40):协议接入、写入核心链路、倒排索引
  • C. 存储引擎篇(#41-#55):MergeSet 原理、Part 结构、压缩算法
  • D. 查询引擎篇(#56-#70):PromQL、MetricsQL、查询优化
  • E. 工具链篇(#71-#90):vmagent、vmalert、vmbackup、vmctl
  • F. 集成生态篇(#91-#100):Grafana、k8s、Prometheus Operator
  • G. 排障调优篇(#101-#115):慢查询、OOM、cardinality、内存调优
  • H-M 进阶专题:decimal、bytesutil、persistentqueue、源码追踪
  • N. 附录篇(A1-A10):速查地图、API 端点、错误码

本文参考与源码链接:
  • VictoriaMetrics 官方 GitHub 仓库
  • VictoriaMetrics 官方文档
  • VictoriaMetrics 架构设计文章
  • CHANGELOG v1.146.0