VictoriaMetrics 开源仓库导读:单机与集群架构、多协议摄入与构建发布的源码级剖析
发布时间:2026/9/13 17:58:07 锦皓数字建站

VictoriaMetrics 开源仓库导读单机与集群架构、多协议摄入与构建发布的源码级剖析【免费下载链接】VictoriaMetricsVictoriaMetrics: fast, cost-effective monitoring solution and time series database项目地址: https://gitcode.com/GitHub_Trending/vi/VictoriaMetrics本篇基于 VictoriaMetrics 仓库根目录 README.md 展开系统梳理这一高性能、低成本、可水平扩展的时序数据库的产品定位与核心特性并结合 app/victoria-metrics/main.go、app/vminsert/main.go、app/vmstorage/main.go 等源码与 Makefile、deployment/docker/compose-vm-cluster.yml 等配置帮助你在阅读文档之外进一步掌握其单机/集群双形态的实现结构、多协议摄入的落地位置以及从源码构建、测试、打包发布的完整工程链路。产品定位与资源索引VictoriaMetrics 官方将其定位为“fast, cost-effective, and scalable solution for monitoring and managing time series data”即一个面向时序数据的高性能、高性价比、可规模化的监控解决方案。README 给出的资源索引包括二进制发布各操作系统/架构的预编译包以及 Docker Hub、Quay 上的官方镜像部署形态单机版Single-node与集群版Cluster均采用 Apache License 2.0 开源上手入口仓库内 docs/victoriametrics/Quick-Start.md 提供了“下载二进制、一条命令启动、内置 vmui 查看指标”的最短路径docs/victoriametrics/README.md 则是官方文档的主入口版本演进项目迭代速度快README 建议定期查看 CHANGELOG 并执行升级仓库内 docs/victoriametrics/changelog/ 保存了变更日志文档企业版在开源版基础上提供额外特性可评估免费试用许可。值得注意的仓库事实当前发布线以v1.151.0为版本标识例如 deployment/docker/compose-vm-cluster.yml 中各组件镜像均标记为v1.151.0实际可用版本请以发布页与 changelog 为准。单机版与集群版两种部署形态的架构README 明确说明“single-node 与 cluster 两个版本均开源”。结合仓库源码两种形态在代码层面共享同一套lib核心库存储、查询、摄入协议解析等差异主要在进程组织方式。单机版一个二进制内嵌 insert、select、storage 三层单机版入口为 app/victoria-metrics/main.go。从源码结构看它直接import并初始化了三大子系统的包vmstorage.Init(*vmselectMaxConcurrentRequests, *vmselectMaxQueueDuration, promql.ResetRollupResultCacheIfNeeded) vmselect.Init(*vmselectMaxConcurrentRequests, *vmselectMaxQueueDuration) vminsertcommon.StartIngestionRateLimiter(*maxIngestionRate) vminsert.Init()随后通过统一的requestHandler按顺序把 HTTP 请求分发给三层if vminsert.RequestHandler(w, r) { return true } if vmselect.RequestHandler(w, r) { return true } if vmstorage.RequestHandler(w, r) { return true }也就是说同一个进程同时承担写入接入vminsert、查询执行vmselect与数据持久化vmstorage三重角色。几个可直接验证的实现细节默认监听地址-httpListenAddr未显式设置时默认为:8428app/victoria-metrics/main.go默认数据目录-storageDataPath默认为victoria-metrics-dataapp/vmstorage/main.go这与 README“无依赖、单二进制、命令行 flag 配置”的卖点一致——默认配置即为“fine-tuned”状态不写配置文件也能跑默认保留期-retentionPeriod默认1M1 个月最小 24 小时超出保留期的数据自动删除另有-futureRetention默认2d约束“未来时间戳”数据的保留app/vmstorage/main.go并发查询上限-search.maxConcurrentRequests的默认值由min(cgroup.AvailableCPUs()*2, 16)动态计算app/victoria-metrics/main.go因为单个查询就可能打满全部 CPU 核心摄入限速-maxIngestionRate限制每秒接收样本数超限后暂停摄入app/victoria-metrics/main.go。集群版vminsert / vmselect / vmstorage 职责分离集群版把三层拆成独立进程。各组件 README 用一句话概括了职责app/vminsert/README.md“vminsert 将摄入的数据路由到 vmstorage”与 app/vmstorage/README.md“vmstorage 接收 vminsert 的写入并落盘同时响应 vmselect 的查询”。集群版的关键 flag 在源码中可以逐一确认vminsert 与 vmselect 都通过-storageNode指定 vmstorage 地址列表可重复传参或逗号分隔vmstorage 对 vminsert 默认监听:8400、对 vmselect 监听:8401、HTTP 服务监听:8482见 app/vmstorage/main.go 中的 flag 定义。仓库内置了一套可直接运行的集群编排在仓库根目录执行make docker-vm-cluster-up即可拉起完整拓扑。从 deployment/docker/compose-vm-cluster.yml 可以看到数据流vmagent --remoteWrite.urlhttp://vmauth:8427/insert/0/prometheus/api/v1/write - vmauth路由与负载均衡auth.config 配置 - vminsert-1/2--storageNodevmstorage-N:8400 - vmstorage-1/2--storageDataPath/storage各承担 1/N 数据 vmselect-1/2--storageNodevmstorage-N:8401 - vmauth 平衡查询请求 Grafana :3000预置集群大盘编排文件中还配有注释说明每个角色的分工“Each shard receives 1/N of all metrics sent to vminserts”“vmselect collects results from configured --storageNode shards”并挂载了 deployment/docker/prometheus-vm-cluster.yml 抓取配置、deployment/docker/auth-vm-cluster.yml 路由配置以及 dashboards/ 下的一组 Grafana 大盘 JSON。若只需单机版演示则可用 deployment/docker/compose-vm-single.yml。多协议摄入README 特性清单在源码中的落点README “Prominent features” 章节列出的最重要能力之一是“Various Protocols”——支持 Prometheus 抓取、remote write、exposition 格式导入、InfluxDB line protocol、Graphite plaintext、OpenTSDB telnet/HTTP、JSON line、CSV、原生二进制格式、DataDog、NewRelic、OpenTelemetry 等十余种数据入口还支持 NFS 类存储、指标 relabel、基数限制器。这些入口并非文档空谈而在 app/vminsert/main.go 中有完整对应。Init()函数按 flag 开关启动各类监听服务func Init() { relabel.Init() common.InitStreamAggr() opentelemetry.Init() protoparserutil.StartUnmarshalWorkers() if len(*graphiteListenAddr) 0 { graphiteServer graphiteserver.MustStart(*graphiteListenAddr, ...) } if len(*influxListenAddr) 0 { influxServer influxserver.MustStart(*influxListenAddr, ...) } if len(*opentsdbListenAddr) 0 { ... } if len(*opentsdbHTTPListenAddr) 0 { ... } promscrape.Init(func(_ *auth.Token, wr *prompb.WriteRequest) { prompush.Push(wr) }) ... }各协议对应的 flag 与建议端口均取自 app/vminsert/main.go 的 flag 描述协议Flag常用端口Graphite plaintext-graphiteListenAddr:2003InfluxDB line protocolTCP/UDP-influxListenAddr:8089OpenTSDB telnet put-opentsdbListenAddr:4242OpenTSDB HTTP /api/put-opentsdbHTTPListenAddr:4242InfluxDB over HTTP无需额外 flag直接发http://vm:8428/write—每条协议的解析与入库逻辑位于 app/vminsert/ 下的独立子包graphite/、influx/、opentsdb/、datadogv1/、datadogv2/、newrelic/、opentelemetry/、prometheusimport/、promremotewrite/、vmimport/、zabbixconnector/等协议编解码则统一放在 lib/protoparser/共 80 余个文件覆盖 Prometheus、InfluxDB、OpenTSDB、OpenTelemetry 等格式。单机版同样复用这套 vminsert 包因此“多协议”能力在两种形态下一致。数据源端的抓取由lib/promscrape完成上述代码中promscrape.Init(...)把抓取结果回灌进prompush.Push这正是 README 所述“内置 Prometheus 兼容抓取器”的实现。此外 lib/ingestserver/ 提供 Graphite/Influx/OpenTSDB 的 TCP/UDP 原始协议服务端封装与lib/prompb/Prometheus remote write protobuf 定义共同构成摄入侧的完整依赖链。自监控Self-scraping的实现细节README 把“Easy to setup”与“备份/快照”等列为亮点而快速上手的常用姿势之一是启动时开启-selfScrapeInterval让 VictoriaMetrics 定期抓取自身/metrics。该功能的完整实现在 app/victoria-metrics/self_scraper.go开关与标签-selfScrapeInterval默认 0关闭自抓取指标统一附加jobvictoria-metrics-selfScrapeJob与instanceself-selfScrapeInstance两个标签可按需改写写入路径每一轮 ticker 触发时先从appmetrics.WritePrometheusMetrics收集自身指标解析成 Prometheus rows经vmstorage.VMInsertAPI.WriteRows写入本机存储app/victoria-metrics/self_scraper.go——即自监控数据也走与外部写入相同的存储通道元数据与基数保护开启指标元数据时会通过WriteMetadata一并落库写入前经过timeserieslimits.IsExceeding校验超标签数/长度的序列直接跳过停机语义收到停止信号后最后再写一次StaleNaN值stale marker保证查询侧不会把已停止的指标当作“仍在线”。配合 app/victoria-metrics/main.go 中的优雅停机序列停 HTTP 服务 → 停 vminsert → 停 vmstorage → 删除非正常停机标记文件MustRemoveUncleanShutdownMarker可以推断其停机流程对数据落盘一致性做了显式保证这也是官方强调“graceful shutdown 是数据安全要求”的代码依据。写入与存储的关键 flag源码取值README 提到的“cardinality limiter 等众多特性”在源码中有明确参数对应整理如下单机版/集群版 vmstorage 共享这些 flag 定义摄入侧限制app/vminsert/main.go-maxLabelsPerTimeseries默认 40单条时间序列最大标签数超限序列被丢弃并计入vm_rows_ignored_total{reasontoo_many_labels}-maxLabelNameLen默认 256标签名最大长度-maxLabelValueLen默认 4096标签值最大长度。存储侧限制app/vmstorage/main.go-storage.maxHourlySeries/-storage.maxDailySeries最近 1 小时/24 小时可新增的唯一序列数上限用于限制基数与 churn rate超限序列被记录日志并丢弃-storage.minFreeDiskSpaceBytes默认 100MB数据目录剩余磁盘低于该值时存储进入只读、拒绝新数据-dedup.minScrapeInterval在离散时间窗内对同一序列只保留最后一个样本实现查询前按抓取周期去重-inmemoryDataFlushInterval默认 5s内存数据强制落盘周期保证 OOM、SIGKILL 等非正常停机下的数据存活窗口。这些 flag 与 docs/victoriametrics/single-server-victoriametrics.md 中的完整参数文档互为印证适合在容量规划与安全加固时逐项对照。企业版特性README 单列一节介绍 Enterprise 版本在开源能力之上追加异常检测对指标数据中的复杂异常进行自动化告警规则生成仓库中对应 docs/anomaly-detection/ 一整套文档含组件说明、预设、快速上手与 UI 指南备份自动化对应vmbackupmanager组件仓库内为 app/vmbackupmanager/README.md开源侧的 app/vmbackup/ 与 app/vmrestore/ 已提供手动备份/恢复工具多保留期Multiple retentions不同数据集可配置不同保留期以降低成本降采样Downsampling降低历史数据的存储成本并提升大区间查询性能LTS 稳定版与核心开发团队的技术支持。开源与企业边界在文档中亦有对照docs/victoriametrics/enterprise.md、docs/victoriametrics/victoria_metrics_common_flags.md 与 docs/victoriametrics/victoria_metrics_enterprise_flags.md 分别列出通用 flag 与企业专属 flag。性能与压缩README 声明的基准结论README “Benchmarks” 一节以官方博客与会议演讲为据给出了如下定性结论均为转载官方已发布基准的描述具体数据以官方文章为准内存占用低数百万活跃序列场景下内存需求显著低于同类方案官方称相对 InfluxDB 约低 10 倍、相对 Prometheus/Thanos/Cortex 至多低 7 倍写入与查询性能高高基数写入/查询基准中相对 TimescaleDB、InfluxDB 有明显优势压缩率高同存储容量下可存放的数据点显著多于 TimescaleDB磁盘占用相对 Prometheus 系方案约低 7 倍对慢 IO 友好针对高延迟、低 IOPS 的 HDD 与云网络存储做了优化单机版在官方对比中可以替代中等规模的 Thanos/M3DB/Cortex/InfluxDB/TimescaleDB 集群。这些结论的验证路径在仓库中也有对应物benchmarks/ 提供基准脚本Makefile、plot-load.shlib/ 下各模块普遍附带*_timing_test.go计时测试make benchmark目标即运行go test -bench.全量基准。仓库结构与构建发布链路围绕 README 的“二进制发布 源码构建”两条获取途径仓库目录组织如下对应 [environment 结构]app/全部可执行程序入口包括victoria-metrics单机版、vminsert、vmselect、vmstorage集群三件套、vmagent、vmalert、vmalert-tool、vmauth、vmbackup、vmrestore、vmctl以及日志产品线victoria-logs/系列vlagent/vlinsert/vlselect/vlstorage 等lib/核心库storage/80 个文件时序存储实现、protoparser/协议解析、promscrape/抓取器177 个文件、httpserver/、flagutil/、fs/等单机版与集群版共享apptest/端到端测试套件make apptest执行apptest/README.md 说明其用法测试覆盖备份恢复、去重、多租户、复制、限流、vmctl 迁移等场景deployment/Docker Compose 编排deployment/docker/、K8s/Helm 说明deployment/k8s/helm/与市场模板deployment/marketplace/DigitalOcean、Vultrdashboards/随仓库分发的 Grafana 大盘 JSON集群大盘、vmagent、vmalert、vmauth 等README 建议生产环境安装并保持更新docs/全量文档源码含快速上手、关键概念、指标接入、vmctl 迁移指南与 changelog。构建与发布由根目录 Makefile 驱动关键目标make all本地构建全部-prod二进制victoria-metrics、vmagent、vmalert、vmalert-tool、vmauth、vmbackup、vmrestore、vmctlmake crossbuild/make release交叉编译并打包 tar.gz/zip 与 sha256 校验和文件覆盖 linux386/amd64/arm/arm64/ppc64le/s390x、darwinamd64/arm64、freebsd、openbsd、windows 等组合——这解释了发布页上“一个操作系统架构一个压缩包”的来源make test/make test-race/make test-pure/make test-full分别对应常规单测、竞态检测、无 CGO 模式与带覆盖率统计的完整测试make check-allfmt vet golangci-lint、make check-licenseswwhrd 许可证检查工程质量的守门目标。版本号通过-ldflags注入lib/buildinfo.Version见 Makefile 的GO_BUILDINFO与 lib/buildinfo/version.go因此victoria-metrics-prod -version输出的版本信息即来自构建时的 git tag 描述。社区、贡献与品牌规范README 尾部还包含两项对贡献者有实际价值的信息社区渠道Slack经 Inviter 加入、X (Twitter)、LinkedIn、Reddit、Telegram英/俄、Mastodon贡献流程见 CONTRIBUTING.md 与 docs/victoriametrics/CONTRIBUTING.md代码行为准则见 CODE_OF_CONDUCT.mdLogo 使用规范仓库内 VM_logo.zip 含三种方向的 Logo格式包括 JPEG预览、PNG透明底、AI矢量源文件。规范要求仅使用 Lato Black 字体保持留白、不得改动元素间距与对齐可等比缩放官方色板为黑#000000、紫#4d0e82、橙#ff2e00、白#ffffff。在文档或幻灯片引用项目标识时建议遵循该规范。小结从 README 到源码的三步深入路径理解形态单机版 一个进程内串起 vminsert/vmselect/vmstorage 三层app/victoria-metrics/main.go集群版 三层拆分为独立进程经-storageNode互联参考编排 deployment/docker/compose-vm-cluster.yml理解能力边界多协议摄入的开关与端口、写入限制、保留与去重等 flag 均可在 app/vminsert/main.go 与 app/vmstorage/main.go 中按名查到定义与默认值再与 docs/victoriametrics/single-server-victoriametrics.md、docs/victoriametrics/Cluster-VictoriaMetrics.md 对照使用验证与复现make all构建、make test/make apptest验证、make release打包全部流程都在 Makefile 内可见无需阅读外部 CI 配置即可理解产物tar.gz/zip checksums是如何产生的。【免费下载链接】VictoriaMetricsVictoriaMetrics: fast, cost-effective monitoring solution and time series database项目地址: https://gitcode.com/GitHub_Trending/vi/VictoriaMetrics创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。