调用层次表格

源文件 行号 函数 说明
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源码阅读的更多相关文章

  1. go 中 select 源码阅读

    深入了解下 go 中的 select 前言 1.栗子一 2.栗子二 3.栗子三 看下源码实现 1.不存在 case 2.select 中仅存在一个 case 3.select 中存在两个 case,其 ...

  2. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  3. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  4. 【原】FMDB源码阅读(一)

    [原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...

  5. 27 GroupSock概述(一)——live555源码阅读(四)网络

    27 GroupSock概述(一)——live555源码阅读(四)网络 27 GroupSock概述(一)——live555源码阅读(四)网络 简介 1.网络通用数据类型定义 2.Tunnel隧道封装 ...

  6. 21 BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类

    21_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类 BasicTaskScheduler基本任务调度器 BasicTaskScheduler基 ...

  7. 19 BasicTaskScheduler0 基本任务调度类基类(一)——Live555源码阅读(一)任务调度相关类

    这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...

  8. 17 任务调度相关类综述——Live555源码阅读(一)任务调度相关类

    这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...

  9. parseInt的源码阅读

    parseInt的源码阅读 Integer.parseInt()这个方法的功能小巧又实用,实现起来困难不大,没有很复杂.这里就来看一下Java的源码是怎么写的吧,走一边大婶写过的代码,应该会有点收获吧 ...

随机推荐

  1. AT2664 [AGC017A] Biscuits 题解

    Content 有一个长度为 \(n\) 的数列 \(a\).你希望从中选出一些数,使得这些数的和对 \(2\) 取模后的结果为 \(P\).求方案数. 数据范围:\(1\leqslant n\leq ...

  2. docker启动WARNING:IPv4 forwarding is disabled. Networking will not work.

    docker启动容器报错IPv4 forwarding is disabled. Networking will not work. [root@localhost ~]# docker run -p ...

  3. 痞子衡嵌入式:把玩i.MXRT1062 TencentOS Tiny EVB_AIoT开发板(1) - 开发环境搭建与点灯

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1062 TencentOS Tiny EVB_AIoT开发板环境搭建与点灯. 腾讯 TencentOS 团队于2021年1 ...

  4. win10+vs2015编译nanogui

    !!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist 说明: A.OS : win10 1909 ,没有配置OpenGL开发环境的 经历. B. ...

  5. 【LeetCode】509. Fibonacci Number 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetc ...

  6. 【LeetCode】946. Validate Stack Sequences 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 模拟过程 日期 题目地址:https://leetc ...

  7. 【LeetCode】692. Top K Frequent Words 解题报告(Python)

    [LeetCode]692. Top K Frequent Words 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/top ...

  8. InfoGAN

    目录 概 主要内容 Chen X., Duan Y., Houthooft R., Schulman J., Sutskever I., Abbeel P. InfoGAN: Interpretabl ...

  9. spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象

    相关 知识 >>> 相关 练习 >>> 实现要求: 在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXm ...

  10. 【MySQL作业】连接查询综合应用——美和易思连接查询综合应用习题

    点击打开所使用到的数据库>>> 1.统计每件商品的销售数量和销售金额,要求按照销售量和销售金额升序显示商品名.销售量和销售金额, 由于需要统计每件商品的销售数量和销售金额,即便某种商 ...