1. 为什么我们需要VictoriaMetrics?从Prometheus的痛点说起
如果你正在管理一个云原生环境,大概率已经在用Prometheus了。它确实很棒,生态丰富,上手也快。但干过几年运维或者SRE的朋友,估计都踩过同样的坑:数据量一大,Prometheus就开始“吃不消”了。我亲身经历过,一个中等规模的微服务集群,Prometheus的本地存储一年就能吃掉几百个G的磁盘,内存占用也经常飙高,查询稍微复杂点,页面就转圈圈,告警规则一多,计算延迟让人头疼。
这时候,大家通常的解决方案是上“Prometheus远程存储”,比如Thanos或者Cortex。我也折腾过,架构复杂,组件一堆,运维成本陡增。直到我遇到了VictoriaMetrics(后面我们亲切地叫它VM),感觉像是打开了新世界的大门。它不是一个简单的远程存储,而是一个从头设计的高性能时序数据库,目标就是解决Prometheus在海量数据场景下的核心痛点:存储成本、查询性能和运维复杂度。
简单来说,VM可以完全兼容Prometheus的查询API(还搞了个更强的MetricSQL),让你现有的Grafana面板和告警规则几乎无缝迁移。但它底层的数据引擎是全新的,采用了更激进的压缩算法和存储结构。根据官方数据和我的实测,在采集相同时间序列的情况下,VM的磁盘占用通常只有Prometheus的1/7到1/10,内存占用也能减少数倍。这意味着,你用同样的机器,能存更久的数据,查得更快,还更省电费。
它特别适合哪些团队呢?首先是数据量正在快速增长,对监控数据长期存储有刚需的团队。其次是对查询性能敏感,希望仪表板秒开、告警实时触发的团队。最后,也是最重要的,是那些希望监控系统架构简单、稳定、好维护的团队。VM的单机版一个二进制文件就能跑,集群版的架构也清晰明了,比那些动辄五六个组件的方案要友好得多。
2. 庖丁解牛:VictoriaMetrics的架构设计好在哪?
VM的设计哲学非常清晰:解耦、专精、无状态化。它的集群模式主要由三个核心组件构成,各司其职,这种设计让扩展变得像搭积木一样简单。
2.1 核心三剑客:vminsert, vmstorage, vmselect
想象一下数据处理的流水线:vminsert是入口,vmstorage是仓库,vmselect是出口。
vminsert 是个纯粹的写入代理。它接收来自Prometheus(通过remote_write)、vmagent或者其他客户端的数据。它的核心工作是根据时间序列的指标名称和所有标签(labels)计算一个哈希值,然后通过一致性哈希算法,决定这条数据应该发给后端的哪个vmstorage节点。它本身不存任何数据,是个无状态服务。这意味着你可以根据写入吞吐量的需求,轻松地部署多个vminsert实例,前面用负载均衡器(如Nginx或K8s Service)一分流,写入能力就线性增长了。
vmstorage 是真正干重活的存储节点。它负责将数据以高度压缩的格式持久化到磁盘。这是整个系统里唯一有状态的组件。但它的设计非常巧妙,采用了 Shared-nothing(无共享)架构。每个vmstorage节点都只管理自己那一份数据,节点之间老死不相往来,不通信、不复制、不共享任何东西。你可能会问,那高可用怎么办?别急,VM通过数据冗余来实现高可用,通常的做法是配置vminsert将同一份数据写入多个vmstorage副本(比如设置-replicationFactor=2)。这种架构的好处太明显了:运维极其简单。加节点?直接启动一个新的vmstorage,更新一下vminsert的节点列表然后重启(或热更新)就行。节点挂了?只要还有副本在,数据就不丢,把这个坏节点从列表里摘掉,系统照常运行。
vmselect 是查询引擎。当Grafana或者API发起一个查询请求时,请求先到


996

被折叠的 条评论
为什么被折叠?



