VictorialMetrics源码分析之插入指标数据
为了调试方便,这里我们将 VictorialMetrics 代码使用 Goland 打开。每个组件的入口位于app//main.go,比如 vmstorage 组件的入口位于 app/vmstorage/main.go:
为了对 VM 整个流畅分析,我们可以直接在 IDE 中来启动这些组件。
直接在 vmstorage 入口的 main 函数上点击 Run go build main.go 即可启动该组件:
通过日志记录可以看出 vmstorage 会在 8401 端口监听 vmselect 的连接请求,在 8400 端口监听 vminsert的连接请求,其本身的服务会通过 8482 端口进行暴露。启动后会在根目录下面创建一个名为 vmstorage-data 的数据目录,该目录就是用来保存 VM的数据的,其中 data 目录是监控指标数据目录,indexdb 目录是索引数据目录,snapshots 是快照目录,flock.lock 为文件锁文件,用于VM 进程锁住文件,不允许别的进程进行修改目录或文件,如下所示:
数据目录 data 下面包含两个最主要的目录big 目录和small 目录,这两个目录的结构是一样的。
small 目录:内存中的数据先持久化到目录,压缩比例高,会定期检测判断是否满足 merge 条件,合并多个小文件。big 目录:small 过大后会合并到 big 目录,压缩比例极高。
索引目录 indexdb 下面包含两个目录16F29B51EDD96911、16F29B51EDD96912,这两个目录分别表示当前正在使用的索引目录,和前面一次使用的索引目录,为什么需要保留前面一次使用的呢?
这是因为 VM中会配置自动轮换的周期,比如可以配置1天、1周、1月等等,那么这个周期到了后索引数据就要轮换,就相当于会创建一个新的目录作为最新的索引数据目录,但是如果你直接将前面一个到期的索引删除,那么现在就没有任何索引了,此时如果有大量的插入或者查询操作的话比如就需要去生成大量的索引,而生成索引的是非常消耗资源的,索引会造成系统性能急剧下降,保留前面一个索引可以来判断新的数据是否能命中前面的缓存,如果命中了则直接将之前的索引拷贝到最新的索引中来,这样就大大提高了索引的效率,索引我们需要保留两个索引,之前的索引则会删除掉。
索引的名称是根据系统的纳秒时间戳原子 1后生成的16进制数据:
// lib/storage/storage.go
func nextIndexDBTableName() string {
n := atomic.AddUint64(