[Zombodb那些事]Zombodb执行引擎

news2024/11/17 18:50:41

Zombodb执行引擎

0.前言

我们在使用Zombodb时,会使用一些SQL查询,例如:

CREATE EXTENSION zombodb;
DROP EXTENSION zombodb;
CREATE INDEX idxtest_analyze_text ON test_analyze_text USING zombodb ((test_analyze_text.*));
DROP TABLE idxtest_analyze_text;
ALTER INDEX idxbook SET (options='id=<public.book_content.idxcontent>book_id');

SELECT * 
  FROM book 
 WHERE book ==> 'author:shakespeare and users.full_name:"John Doe"'

这里罗列的SQL不全,只是给大家简单看一下Zombodb的基本用法,像这些SQL从PostgreSQL(以下简称:PG)传递过来,到底经历了什么流程?上面不同类别的SQL语句到底会怎么去执行?ES的Bulk请求的上游是谁?谁来管理ES请求?==>操作符又是怎么识别的?

带着这些疑问,我们来开始Zombodb执行引擎。

Zombodb执行引擎不像PG那样复杂,能搞若干年,Zombodb的执行引擎简单用一幅图概括其核心工作。

  • PG优化器、执行器重写

    • 后面文章会详细展开

  • ES操作API

    • 没错,这里就是来管理上一篇文章写的ES Bulk请求。

看样子是比简单的,但是深挖下去,这一篇文章搞不定,所以我先来个执行引擎轮廓吧。

1fe99d5bee0dbe9e035862b0d84c983d.png

e2dfdcbdb8d1a51dba74774825656a63.png

1.Hooks

Zombodb执行引擎管理了很多Hooks,Zombodb在全局有一个可变的单例对象,所有的操作都是通过EXECUTE_MANAGER来发起调用。

简单说一下Hooks是什么,PG代码里面会提供给第三方回调接口,这便是Hooks,逻辑为:

if (hook) {
 your_hook();
} else {
 default_behavior();
}

这里写了一段伪代码,如果你定义了hook那么就会走你的逻辑,不然就走PG默认行为,所以Hooks就是一堆这种hook的组合。Zombodb这边实现了:

2fbdb862e2ae580707120244c8ebaf4f.png

  • 优化器Planner

优化器里面做了不少工作,例如:ctid重写,表达式重写等等,这一块后面打算单独讲。

  • PG执行器开始 executor_start

执行器开始在Zombodb这边实现比较简单,就是内部维护了一个query_stack结构,往里面插入即可,query_stack结构在本文后续讲,这里理解为一个Vector即可。

  • PG执行器结束 executor_end

执行器结束在Zombodb这边实现就更简单了,直接从Vector的query_stack中pop出去,就完事了。

可以看到PG执行器的Hook逻辑就是类似于现场还原的一个实现。

  • 工具类语句hook process_utility_hook

这里就是实现我们修改表、修改索引别名、删除操作。这里实现比较简单了,看一下代码就懂了。

当然还有其他我们内部定制的Hook,这些就不赘述。

2.执行引擎

接下来就是Zombodb执行引擎的结构了,内部包括:

  • 每个表的元组描述符

元组描述符在这里表示你查询的时候的某些列信息。例如:这里有一个普通的查询,这里id就是tupledesc,另一个工具类查询语句结果中的QUERY PLAN就是tupledesc,这些内容会在PG里面用TupleDescData存起来。

3000d209007278e0561b2de13293e0ed.png

  • 每个表的bulk请求上下文

bulk请求是什么,可以看上一篇文章,这里存储的是BulkContex数据结构,这个数据结构在Zombodb里面结构如下图所示,具体可以看图中注释,没有提到的便是is_shadow字段,这个表示当前索引是否是影子索引。

所谓影子索引表示的它是否被包了一层,然后用户直接看不到,需要回溯看UDF,才理解。例如下面这个便是影子索引。

---非影子索引
SELECT * 
  FROM book 
 WHERE book ==> 'shakespeare';

---影子索引
SELECT * 
  FROM book 
 WHERE my_shadow_func(book) ==> 'shakespeare';
 
CREATE OR REPLACE FUNCTION my_shadow_func(anyelement)
    RETURNS anyelement
    IMMUTABLE STRICT
    LANGUAGE c AS '$libdir/zombodb.so', 'shadow_wrapper';

f31f9f775d171a7e6e439cb4e1078da0.png

  • 使用过的所有事务id

一个完整的事务可能包括事务发起、事务中、事务提交、事务回滚等其中多个步骤。而Zombodb执行引擎里面使用了一个hashset存储之前已经提交的所有事务id,防止重复提交。对外的API如下:

事务开始:push_xid,将当前事务id放入hashset中,并发起Bulk事务正在进行的请求。

事务提交:commit,等待所有hashset中的事务id被提交,如果有失败,就会panic掉,提交后,释放执行引擎的所有成员占用的内存。

事务回滚:abort,给ES Bulk发起立刻终止请求并释放执行引擎的所有成员占用的内存。

  • 所有查询的query_desc

这个就是前面提到的query_stack,有一个数组维护,里面存储了一个tuple(查询描述符,查询状态)。

  • 事务回调是否注册标记

在PG/GP里面会有回调函数,用户可以进行注册,例如:两阶段提交中/后的处理回调,都可以自定义逻辑,例如:在Zombodb里面实现了PreCommit、Abort,这里便会调用前面的commit与abort。

设置完毕这些回调函数,需要设置注册标记为true,因为这些只需要注册一次就行(执行引擎对象是全局单例)。

f2ba3a76832b7191c61e6011848dd814.png

3.查询状态

Zombodb中提供了两个比较特殊的函数:

  • zdb.scores

  • zdb.highlights

一个可以用来返回ES的score,并放到order by之后用来排序。

另一个是使用ES的文档高亮特性,对查询结果进行高亮显示。

为何这里会有一个查询状态呢?单独还放到了执行引擎里面,像其他的zdb查询缺没有放到执行引擎里面,例如:

zdb.terms

要回答这个问题,首先我们需要知道这两个函数的实现入参都有一个ctid,而根据Zombodb代码中的注释与调用入口,可以发现这两个放到执行引擎里面,是为了方便解决HOT问题。

更复杂的解释,等后面研究一下这里面的门道吧,还有不少东西探究。

本节完~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/163868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习实战:一文详解K近邻算法,包括原理解析+实战案例

各位同学好&#xff0c;今天我向大家介绍一下python机器学习中的K近邻算法。内容有&#xff1a; K近邻算法的原理解析&#xff1b;实战案例–红酒分类预测。 案例简介&#xff1a;有178个红酒样本&#xff0c;每一款红酒含有13项特征参数&#xff0c;如镁、脯氨酸含量&#x…

从 PageHelper 到 MyBatis Plugin

在很多业务场景下我们需要去拦截 SQL&#xff0c;达到不入侵原有代码业务处理一些东西&#xff0c;比如&#xff1a;历史记录、分页操作、数据权限过滤操作、SQL 执行时间性能监控等等&#xff0c;这里我们就可以用到 MyBatis 的插件 Plugin。下面我们来了解一下 Plugin 到底是…

代码随想录算法训练营第11天 20.有效的括号、150.逆波兰表达式求值、1047. 删除字符串中的所有相邻重复项

代码随想录算法训练营第11天 20.有效的括号、150.逆波兰表达式求值、1047. 删除字符串中的所有相邻重复项 有效的括号 力扣题目链接(opens new window) 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符…

JVM基础详解

1.JVM内存结构 1.1 内存结构划分 以上代码执行过程&#xff1a; 执行 javac 命令编译源代码为字节码 执行 java 命令 创建 JVM&#xff0c;调用类加载子系统加载 class&#xff0c;将类的信息存入方法区创建 main 线程&#xff0c;使用的内存区域是 JVM 虚拟机栈&#xff0c;开…

[JAVA安全]weblogic反序列化介绍及环境搭建

weblogic反序列化介绍 weblogic是一个常用的web中间件&#xff0c;它的反序列化漏洞也算是比较经典&#xff0c;而在weblogic里面其实反序列化漏洞大致分为两种&#xff0c;一个是基于T3协议的反序列化漏洞&#xff0c;一个是基于XML的反序列化漏洞&#xff0c;以后再说吧&…

用R语言画切线和法线

文章目录7 法线梯度、切线和法线切线和法线的绘制7 法线 梯度、切线和法线 为了书写方便&#xff0c;记xix1,x2,...,xnx_ix_1,x_2,...,x_nxi​x1​,x2​,...,xn​&#xff0c;∂f∂xi∂f∂x1,∂f∂x2,⋯∂f∂xn\frac{\partial f}{\partial x_i}\frac{\partial f}{\partial x_…

springboot+rabbitmq搭建mqtt协议实现订阅发布(亲测9w消息并发)

一、mqtt协议简单介绍 mqtt是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的轻量级通讯协议&#xff0c;通过订阅相应的主题来获取消息&#xff0c;是物联网&#xff08;Internet of Thing&#xff09;中的一个标准传输协议。 二、rabbitmq的安装部署 1. …

c# 随机数,c# 生成随机数,c# 生成区间随机数,c# 生成随机数组

c# 随机数&#xff0c;c# 生成随机数&#xff0c;c# 生成区间随机数&#xff0c;c# 生成随机数组 小试牛刀 先看结果 生成200-700之间的5个随机数 第1的随机数是&#xff1a;647 第2的随机数是&#xff1a;219 第3的随机数是&#xff1a;311 第4的随机数是&#xff1a;210 第5…

Redisson的看门狗机制

背景 据Redisson官网的介绍&#xff0c;Redisson是一个Java Redis客户端&#xff0c;与Spring 提供给我们的 RedisTemplate 工具没有本质的区别&#xff0c;可以把它看做是一个功能更强大的客户端&#xff08;虽然官网上声称Redisson不只是一个Java Redis客户端&#xff09; …

记录Maven的相关操作(笔记整理)

一、安装 我使用的是免安装版的&#xff0c;直接解压缩就可以使用。 二、配置环境变量 打开环境变量配置。右键计算机→属性→高级系统设置→高级→环境变量&#xff0c;在系统变量中配置。 配置MAVEN_HOME。在系统变量中新建&#xff0c;变量名MAVEN_HOME&#xff0c;变量值…

parquet

一、parquet结构 Row Group ​ --Column Chunk&#xff1a;一列对应一个Column Chunk ​ – Page&#xff1a;压缩和编码的单元&#xff0c;parquet的 min/max 索引是针对于page的&#xff0c;存在了文件的页脚。以前的版本是存储Column Chunk和Page的索引&#xff0c;导致在…

Linux命令scp用法

本文主要讲的是scp用法如果哪里不对欢迎指出&#xff0c;主页https://blog.csdn.net/qq_57785602?typeblog首先讲述一下scp用法并不是让你连接公司服务器后用的&#xff08;不是连接公司服务器使用&#xff09;&#xff0c;如果要使用的情况下那么请看下面&#xff1a;winr打开…

【C语言篇】请把这篇文章推给现在还对指针一知半解的童鞋~超生动图解,详细讲解,易懂,易学,让天下没有难懂的指针~

&#x1f331;博主简介&#xff1a;是瑶瑶子啦&#xff0c;一名大一计科生&#xff0c;目前在努力学习C进阶,JavaSE。热爱写博客~正在努力成为一个厉害的开发程序媛&#xff01; &#x1f4dc;所属专栏&#xff1a;C/C ✈往期博文回顾:进入内存,透彻理解数据类型存在的意义,整形…

[java拓展]Mysql数据库的基础指令,和JDBC的使用

1.关于mysql数据库 &#xff08;1&#xff09;概述 DBMS数据库管理系统&#xff0c;用来管理数据库&#xff0c;执行sql语句的东西&#xff0c;Mysql&#xff0c;oracle&#xff0c;sqlite这些严格来说不是数据库而是数据库管理系统&#xff0c;其中Mysql最常用&#xff0c;而…

马来酰亚胺聚乙二醇硅烷,MAL-PEG-Silane 结构,科研试剂溶于大部分有机溶剂

马来酰亚胺聚乙二醇硅烷&#xff0c;MAL-PEG-Silane 中文名称&#xff1a;马来酰亚胺聚乙二醇硅烷 分子量&#xff1a;1k&#xff0c;2k&#xff0c;3.4k&#xff0c;5k&#xff0c;10k&#xff0c;20k。。。 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 用…

剑指offer----C语言版----第十九天----面试题25:合并两个有序的链表

目录 1. 合并两个排序的链表 1.1 题目描述 1.2 解题思路 1.3 往期回顾 1. 合并两个排序的链表 原题链接&#xff1a;21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09;1.1 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个…

new-Crack:StarUML 5.1.0 -2023

StarUML 用于敏捷和简洁建模的复杂软件建模器 当前版本&#xff1a;v5.1.0 主要特征 通用语言2 兼容 UML 2.x 标准元模型和图表&#xff1a;类、对象、用例、组件、部署、复合结构、序列、通信、状态图、活动、时间、交互溢出、信息流和剖面图。 SYSML 支持 支持使用 SysML 图…

SSM03_SpringMVC REST风格 SSM整合

01-SpringMVC简介SpringMVC是隶属于Spring框架的一部分&#xff0c;主要是用来进行Web开发&#xff0c;是对Servlet进行了封装。SpringMVC是处于Web层的框架&#xff0c;所以其主要的作用就是用来接收前端发过来的请求和数据然后经过处理并将处理的结果响应给前端&#xff0c;所…

【iHooya】1月14日寒假集训课作业解析

内部元素之和 输入一个整数矩阵&#xff0c;计算位于矩阵内部的元素之和。所谓矩阵内部的元素&#xff0c;不在第一行和最后一行的元素以及第一列和最后一列的元素。 输入 第一行分别为矩阵的行数m和列数n&#xff08;m < 100&#xff0c;n < 100&#xff09;&#xff0…

Arthas 入门到实战(一)快速入门

Arthas官方文档指出&#xff1a; 介绍&#xff1a;Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&…