【VictoriaMetrics】vm-select源码阅读
调用层次表格
源文件 | 行号 | 函数 | 说明 |
---|---|---|---|
app/vmselect/main.go | 63 | main | 入口 92行调用 requestHandler |
app/vmselect/main.go | 132 | -requestHandler | 处理http协议的入口 222行调用 selectHandler |
app/vmselect/main.go | 236 | --selectHandler | 处理查询逻辑 326行调用 prometheus.QueryRangeHandler |
app/vmselect/prometheus/prometheus.go | 1197 | ---QueryRangeHandler | 处理 /api/v1/query_range 1221调用queryRangeHandler |
app/vmselect/prometheus/prometheus.go | 1227 | ----queryRangeHandler | 查询的业务逻辑 1263行调用promql.Exec |
app/vmselect/promql/exec.go | 29 | -----Exec | 根据解析好的promql,执行查询逻辑 44行执行evalExpr |
app/vmselect/promql/eval.go | 203 | ------evalExpr | 根据解析好的metricsql.Expr结构,执行查询 (先看简单的根据一个监控项名字查询的情形)208行调用evalRollupFunc |
app/vmselect/promql/eval.go | 499 | -------evalRollupFunc | 执行汇总函数 526行调用evalRollupFuncWithMetricExpr |
app/vmselect/promql/eval.go | 665 | --------evalRollupFuncWithMetricExpr | 查询单个监控项的情况 703行调用netstorage.ProcessSearchQuery |
app/vmselect/netstorage/netstorage.go | 1405 | ---------ProcessSearchQuery | 把请求发到存储层 1439行调用processSearchQuery |
app/vmselect/netstorage/netstorage.go | 1471 | ----------processSearchQuery | 请求,并阻塞等待结果 1476行调用startStorageNodesRequest 1478行调用processSearchQuery |
app/vmselect/netstorage/netstorage.go | 1502 | -----------startStorageNodesRequest | 广播到所有存储节点 这里可以说明:vm-select到vm-storage这个路径上,对于选择后端的存储并没有复杂的算法,暴力广播而已! |
app/vmselect/netstorage/netstorage.go | 1853 | ------------func (sn *storageNode) processSearchQuery | 这里调用了sn.execOnConnWithPossibleRetry 可以看见,使用了 search_v4 这条命令来请求vm-storage |
app/vmselect/netstorage/netstorage.go | 1531 | -----------func (snr *storageNodesRequest) collectResults | processSearchQuery中调用collectResults来处理广播后的结果 |
app/vmselect/promql/eval.go | 787 | ---------evalRollupWithIncrementalAggregate | 在evalRollupFuncWithMetricExpr函数761行中被调用。这个函数并行处理从storage得到的结果。 |
感受
- vm-select相当于是个复杂的metric计算引擎,内部的代码非常复杂,分了非常多的情况的分门别类的处理各种查询需求
- 对于范围查询而言:
- vm-select先解析查询语句
- 与vm-insert一样,vm-select与vm-storage使用极其简单的通讯协议来传输数据
- 先握手
- 然后使用 length + value的形式分割各个字段
- 返回的数据会使用ZSTD压缩算法来压缩
- 查询的时候,广播发送给所有存储节点,并未智能的区分storage是否有这个数据
- 得到结果后,再进行去重、汇总、写入cache、返回JSON等动作
- 存储层和计算层分开了,可以避免存储层变得过于复杂。但是存储层没有计算能力的话,部分查询可能需要把大量数据从storage节点搬迁到select节点。
- 猜测vm单机版为什么会更快?可能仅仅只是存储和查询都是进程间通讯吧!待后续阅读源码来证实。
【VictoriaMetrics】vm-select源码阅读的更多相关文章
- go 中 select 源码阅读
深入了解下 go 中的 select 前言 1.栗子一 2.栗子二 3.栗子三 看下源码实现 1.不存在 case 2.select 中仅存在一个 case 3.select 中存在两个 case,其 ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
- 【原】FMDB源码阅读(一)
[原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...
- 27 GroupSock概述(一)——live555源码阅读(四)网络
27 GroupSock概述(一)——live555源码阅读(四)网络 27 GroupSock概述(一)——live555源码阅读(四)网络 简介 1.网络通用数据类型定义 2.Tunnel隧道封装 ...
- 21 BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类
21_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类 BasicTaskScheduler基本任务调度器 BasicTaskScheduler基 ...
- 19 BasicTaskScheduler0 基本任务调度类基类(一)——Live555源码阅读(一)任务调度相关类
这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...
- 17 任务调度相关类综述——Live555源码阅读(一)任务调度相关类
这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...
- parseInt的源码阅读
parseInt的源码阅读 Integer.parseInt()这个方法的功能小巧又实用,实现起来困难不大,没有很复杂.这里就来看一下Java的源码是怎么写的吧,走一边大婶写过的代码,应该会有点收获吧 ...
随机推荐
- pl/sql属性类型
pl/sql 属性类型 %TYPE - 引用变量和数据库列的数据类型 %ROWTYPE - 提供表示表中一行的记录类型 显示输出scott.emp表中的部分数据 declare emp_number ...
- 【LeetCode】292. Nim Game 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】328. Odd Even Linked List 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- leetcode1260二维网络迁移
题目 n*m的矩阵,一个整数k,移动矩阵k次.每次移动的操作为: 向右移动(最后一列移动到第一列) 之后,第一列向下移动. 1<=N.M<=50 0<=k<=100 题解 思考 ...
- uniapp解决测评有组件导出风险,解决APP反编译,回编译后app无法打开的问题
1.APP反编译 使用hbx云打包,打包出apk 拿到apk后,先下载反编译工具 https://pan.baidu.com/s/1A5D8x_pdSELlHYl-Wl6Xnw 提取码 6vzd 使用 ...
- 2021前端面试css(三)
overflow 原理 块格式化上下文是css可视化渲染的一部分,它是一块区域,规定了内部块盒的渲染方式,以及浮动相互之间的影响关系,当元素设置了overflow 样式且值不为visible时,元素就 ...
- Java Web程序设计笔记 • 【第2章 JSP基础】
全部章节 >>>> 本章目录 2.1 JSP 简介 2.1.1 JSP 概述 2.1.2 开发第一个 JSP 页面 2.1.3 JSP 处理流程 2.1.4 实践练习 2. ...
- EFCore:关于DDD中值对象(Owns)无法更新数值
最近使用DDD+EFCore时,使用EFCore提供的OwnsOne或者OwnsMany关联值对象保存数据,没想到遇到一个很奇怪的问题:值对象中的值竟然无法被EFCore保存!也没有抛出任何异常!我瞬 ...
- MongoDB 安装及制作成windows服务
下载: 注:直接使用浏览器下载速度很慢,建议使用其他下载软件下载(比如:迅雷) 官网下载地址: https://fastdl.mongodb.org/win32/mongodb-win32-x86_ ...
- hadoop 之 nodemanager自动关闭(Secure IO is not possible without native code extensions)
场景 安装好hadoop之后,nodemanager自动关闭.查看日志如下: java.lang.ExceptionInInitializerError at org.apache.hadoop.ya ...