VictoriaMetrics 是后出的一款面向可观测指标的时序数据存储和查询引擎, 传闻比prometheus 查询性能强,存储成本还低,我们也有做指标数据平台,特来学习下
以下分析基于 v1.45.x 版本
1. 核心结论
VictoriaMetrics 的存储设计可以概括为以下几点:
- 使用
vminsert、vmstorage和vmselect分离写入、存储与查询职责; - 采用 Prometheus 风格的单值时序模型,每个数据点由时间戳和浮点数值组成;
- 根据指标名和标签生成时间序列标识
TSID; - 将标签索引与原始时序数据分开存储;
- 原始数据按
TSID聚合,并将时间戳和值分别进行列式压缩; - 数据先写入内存,刷盘后形成不可变的
Part,再通过后台 Merge 合并; - 按月建立数据分区,通过
small和big两级目录平衡近期数据的读取速度与历史数据的压缩率; - 索引和数据均采用分层文件结构,通过元索引缩小读取范围;
- 不依赖传统 WAL,在异常退出时可能丢失尚未刷盘的数据。
2. 集群架构
VictoriaMetrics 集群由三个核心组件组成。
| 组件 | 主要职责 |
|---|---|
vminsert |
接收写入请求,通过一致性哈希将数据分发到不同的 vmstorage 节点 |
vmstorage |
保存标签索引和时序数据,并执行本地检索 |
vmselect |
接收查询请求,从一个或多个 vmstorage 节点读取数据并汇总结果 |
三个组件可以分别扩容。vmstorage 采用 Shared-Nothing 架构:节点之间不共享数据,也不需要互相通信。这种结构降低了节点间协调成本,使扩容和故障隔离更简单。