VictoriaMetrics阅读笔记
前言
由于组内搭建了一套VictoriaMtrics(简称为vm)的时序数据存储系统,好奇存储内部是如何实现的,所以打算看下源码,目前在github(https://github.com/VictoriaMetrics/VictoriaMetrics)上有两个版本,一个是单点版本(vminsert,vmstorage,vmselect都是部署在单个节点上的),一个cluster版本(vminsert,vmstorage,vmselect分开部署)。cluster版本要切为cluster分支(原本看单点版本看的一脸懵逼==,好险后发现其实代码逻辑都是差不多的)
cluster版本的vminsert
vminsert的作用是负责把上游的过来的数据(http)做一些解析/过滤之类的活之后通过rpc把数据发送给vmstorage
- 接受客户端的请求
- 根据lables哈希得到存储节点(这里用了一致性哈希)
- 然后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
}
相关文章