VictoriaMetrics阅读笔记

2022-03-23 00:00:00 数据 函数 版本 都是 节点

前言

由于组内搭建了一套VictoriaMtrics(简称为vm)的时序数据存储系统,好奇存储内部是如何实现的,所以打算看下源码,目前在github(https://github.com/VictoriaMetrics/VictoriaMetrics)上有两个版本,一个是单点版本(vminsert,vmstorage,vmselect都是部署在单个节点上的),一个cluster版本(vminsert,vmstorage,vmselect分开部署)。cluster版本要切为cluster分支(原本看单点版本看的一脸懵逼==,好险后发现其实代码逻辑都是差不多的)

cluster版本的vminsert

vminsert的作用是负责把上游的过来的数据(http)做一些解析/过滤之类的活之后通过rpc把数据发送给vmstorage

  1. 接受客户端的请求
  2. 根据lables哈希得到存储节点(这里用了一致性哈希)
  3. 然后flush内存把buffer发到对应节点

cluster版本的vmstorage

vmstorage是负责存储数据的节点,接受vminsert和vmselect的请求,进行存储/查询

因为从vminsert接受的数据里并没有打上TSID之类的信息,所以vmstorage需要先把对应的TSID才能找到对应应该存储的地方。TSID是一条时间序列的标识。TSID的注入会涉及到查询(相同的label的曲线需要有相同的TSID),同时vmstorage为了加速TSID的查找配置了内存缓存等一些加速措施。

type TSID struct {
    // 项目和账户,cluster版的vmstorage支持多租户的存储。
    AccountID uint32
    ProjectID uint32
    // 有相同label keys的数据会有相同的MetricGroupID
    MetricGroupID uint64
    JobID uint32
    InstanceID uint32
    // 自增ID,这个自增是单节点的自增
    MetricID uint64
}

相关文章