首页 > 其他分享 >StoneDB 读、写操作的执行过程

StoneDB 读、写操作的执行过程

时间:2022-12-26 12:33:01浏览次数:59  
标签:Tianmu 网格 查询 引擎 StoneDB 操作 执行 数据包 DP

StoneDB 读、写操作的执行过程_基于知识


StoneDB 是一款兼容 MySQL 的开源 HTAP 数据库。StoneDB 的整体架构分为三层,分别是应用层、服务层和存储引擎层。应用层主要负责客户端的连接管理和权限验证;服务层提供了 SQL 接口、查询缓存、解析器、优化器、执行器等组件;Tianmu 引擎所在的存储引擎层是 StoneDB 的核心,数据的组织和压缩、以及基于知识网格的查询优化均是在 Tianmu 引擎实现。


本文主要为大家介绍 StoneDB 的读操作、写操作执行过程,方便大家了解引擎架构、内部逻辑和各个功能模块。


StoneDB 读、写操作的执行过程_mysql_02



Tianmu 引擎架构



1.Tianmu 存储引擎在 Server 组件中的位置

StoneDB 读、写操作的执行过程_github_03



2.Tianmu 引擎架构图

StoneDB 读、写操作的执行过程_数据_04



3.Tianmu 引擎各个模块介绍



Tianmu Parser

解析客户端传来的 SQL ,进行关键字提取、解析,生成解析树。解析的词包括 select、update、delete、or、group by 等,对不支持的语法会向客户端抛出异常:ERROR:You have an error in your SQL syntax.

比如,执行如下语句:

select *  from user where userId =1234;


在分析器中就通过语义规则器将 select、from、where 这些关键词提取和匹配出来, MySQL 会自动判断关键词和非关键词,将用户的匹配字段和自定义语句识别出来。这个阶段也会做一些校验,比如校验当前数据库是否存在 user 表,同时假如 user 表中不存在 userId 这个字段同样会报错:unknown column in field list.


解析入口:

parse_sql()


Tianmu Optimizer

对于来自客户端的请求,首先由查询优化器进行基于知识网格的优化,产生执行计划后再交给执行引擎去处理。基于知识网格中的信息进行粗糙集(Rough Set)构建,并确定此次请求所需使用到的数据包。


优化入口:

optimize_select()



Insert Buffer

InnoDB 的 insert buffer 是为辅助索引的插入做的优化设计,而 Tianmu 的 insert buffer 是为整张表的插入做的优化设计。当向表插入数据时,数据先暂存到 Tianmu 的 insert buffer,然后再从 insert buffer 批量刷新到磁盘,从系统的表现来看是吞吐量提高了。如果不经过 insert buffer,而是直接写入磁盘,由于 Tianmu 不支持事务,只能一行接着一行往磁盘写入,系统的吞吐量是不高的,插入效率固然不高。Tianmu 的 insert buffer 由变量 stonedb_insert_delayed 控制,默认为 on 表示开启。


插入缓存入口:

Engine::insert_buffer



Knowledge Grid Manager

Tianmu 引擎利用知识网格架构来对查询优化器、计划执行和压缩算法等提供支持。知识网格是 Tianmu 引擎进行快速数据查询的关键,在查询计划分析与构建过程中,通过知识网格可以消除或大量减少需要解压的数据块,降低 IO 消耗,提高查询响应时间和网络利用率。对于大部分统计/聚合性查询,Tianmu 引擎往往只需要使用知识网格就能返回查询结果(而不需要读取数据), 这种情况下在 1s 时间内就可以返回查询结果。


入口函数:

RCAttr::ApproxAnswerSize



Knowledge Grid

Knowledge Grid,即知识网格,是 Tianmu 引擎进行快速数据查询的关键,在查询计划分析与构建过程中,通过知识网格可以消除或大量减少需要解压的数据块,降低 IO 消耗,提高查询响应时间和网络利用率。




KN Node

Knowledge Node(KN Node),即知识节点,除了基础元数据外,还包括数据特征以及更深度的数据统信息,知识节点在数据查询/装载过程中会动态计算。




DPN

Data Pack Node(DPN),即数据包节点,又叫元数据节点(Metadata Node,MD Node),与数据包(DP)之间保持一一对应关系,数据包节点中包含了其对应数据包的元数据信息。


数据结构:

struct DPN{}


获取DPN:

DPN &get_dpn



Data Pack

Data Pack(DP),即数据包,数据包用于存放实际数据,是最底层的数据存储单元,每列按照65536行切分成一个数据包。每个数据包比列更小,具有更高的压缩比,而每个数据包又比每行更大,具有更好的查询性能。数据包是知识网格的解压缩单元。


获取 DP:

Pack *get_pack(size_t i)



CMAP

字符过滤,粗糙集过滤寻找可疑包,生成字符位图文件。

RSIndex_CMap::RSIndex_CMap;



HIST

整形过滤,粗糙集过滤寻找可疑包,生产直方图文件。

RSIndex_Hist::RSIndex_Hist



Replication Manager

StoneDB 复制引擎, StoneDB 本身与常见关系数据库的高可用架构一样(例如 MySQL ),为了保证强一致性,都会将数据更新在 Master 上执行,然后通过复制技术将副本导入到 Slave 节点。但是与 MySQL 标准的 binlog 复制不同,Tianmu 引擎中存储的不是原始数据,而是压缩后的数据块(DP) 。此时如果使用 binlog 的方式来进行复制,会导致网络上产生大量数据流量。为了解决这一点,Tianmu 实现了基于压缩后数据块的高效数据复制支持,相对于 binlog 复制,该技术可以大大降低网络传输所需的数据量。



Compress&Decompress

数据压缩和解压模块,Tianmu 基于列数据类型和特定领域优化的压缩算法,因为列中所有记录的类型一致,可以基于数据类型选择压缩算法,列中重复值越高压缩效果越好。除了常规的压缩算法外,针对特殊场景提供高效的压缩算法,如 Email 地址,  IP 地址, URL 等 。


压缩入口:

Compress()


解压入口:

CprsErr Decompress


StoneDB 读、写操作的执行过程_stonedb_05



读操作执行过程

对于来自客户端的请求,首先由查询优化器进行基于知识网格的优化,产生执行计划后再交给执行引擎去处理。


•基于知识网格中的信息进行粗糙集(Rough Set)构建, 并确定此次请求所需使用到的数据包(DP)。


•基于知识节点和数据包节点,确定查询涉及到的数据包集合,并将数据包归类:


•相关 DP:满足查询条件限制的 DP(直接读取并返回);


•可疑 DP:DP 中部分数据满足查询条件(解压后进行处理再返回);


•不相关 DP:与查询条件完全不相关(直接忽略)。

执行计划构建时, 会完全规避不相关 DP,仅读取并解压相关 DP,按照特定情况决定是否读取可疑 DP。例如,对于一个查询请求,通过 Knowledge Grid 可以确定 3 个相关和 1 个可疑 DP。如果此请求包含聚合函数,此时只需要解压可疑 DP 并计算聚合值,再结合 3 个相关 DP 的数据包节点 (DPN)中的统计值即可得出结果。如果此请求需要返回具体数据,那么无论相关 DP 还是可疑 DP,都需要读取数据块并解压缩,以获得结果集。


•如果查询请求的结果可以直接从 DPN 中产生(例如 count, max, min 等操作),则直接返回元信息节点中的数据,无需访问物理数据文件。



StoneDB 读、写操作的执行过程_mysql_06


例如:SELECT count(*) FROM employees where salary < 2500:


  • 通过 Knowledge Grid 知识,查找包含 salary < 2500 的 DP,此处可以看到只有 A/B/C 三个 DP 涉及到该查询。
  • DP A 与 B 属于相关 DP, 只需直接从对应的 DPN 中获取 count 值即可。
  • DP C 属于不相关 DP,需要读取数据块并解压,执行函数计算后才能返回结果集。
  • 这里只有 DP C 会被读取并解压,DP A 与 B 并不消耗 IO 资源。

StoneDB 读、写操作的执行过程_stonedb_07


StoneDB 读、写操作的执行过程_mysql_08


执行代码:

Engine::HandleSelect();

Engine::GetTableShare();

class ColumnShare;

ColumnShare::map_dpn();

ColumnShare::read_meta();

ColumnShare::scan_dpn();

TableShare::TableShare();

RCAttr::RoughCheck;

RSIndex_CMap::RSIndex_CMap;

CprsErr Decompress;

TempTable::SendResult();


StoneDB 读、写操作的执行过程_基于知识_09



写操作执行过程


StoneDB 读、写操作的执行过程_基于知识_10


来自客户端的请求经过连接器、分析器后,由查询优化器进行基于知识网格的优化,产生执行计划,经过数据的压缩、校验后再交给执行引擎去处理。


Tianmu 执行引擎将数据组织为两个层次:物理存储介质上的的数据块(Data Pack,DP),内存上的知识网格层(Knowledge Grid,KG)。


入口函数:

write_row

StoneDB 现已开源,欢迎大家在 GitHub 上关注~

​https://github.com/stoneatom/stonedb​


StoneDB 读、写操作的执行过程_mysql_11

标签:Tianmu,网格,查询,引擎,StoneDB,操作,执行,数据包,DP
From: https://blog.51cto.com/u_15722181/5968749

相关文章

  • StoneDB 团队成员与 MySQL 之父 Monty 会面,共话未来数据库形态
    「9月中旬,StoneDB团队成员有幸与开源数据库MySQL和MariaDB的创始人Michael“Monty”Widenius(后文简称为Monty)见了个面,其随行的团队成员告诉我们,疫情前Monty每年还能来一......
  • 爆肝整理5000字!HTAP的关键技术有哪些?| StoneDB学术分享会#3
    在最新一届国际数据库顶级会议ACMSIGMOD2022上,来自清华大学的李国良和张超两位老师发表了一篇论文:《HTAPDatabase:WhatisNewandWhatisNext》,并做了《HTAPDat......
  • 子查询优化之 Semi-join 优化 | StoneDB 研发分享 #2
    缘起StoneDB在列式存储引擎Tianmu的加持下,在大多数场景下相对MySQL都会有大幅性能提升。当然,这是需要工程师不断优化代码才能做到的,而且,性能好也需要通过基准测试才有......
  • StoneDB 首席架构师李浩:如何选择一款 HTAP 产品?
    作者:李浩责编:宇亭当我们选择一款HTAP数据库时,总是先被其相关文档里所描述的优异性能所吸引。卓越的性能是我们选择一款产品的出发点,因为我们希望该款产品能够解决我们业务......
  • StoneDB技术观察 | 存算一体 VS 存算分离 ,IT发展下的技术迭代
     存算分离,现在已经成为云原生数据库的标配,开始大规模流行。存算分离后,进一步使计算单元和存储单元解耦,每个单元可以实现单独的动态扩缩容,并且可以通过冗余配置,实现对单点......
  • 列存引擎 Tianmu 如何实现 Delete?| StoneDB 研发分享 #3
    作者:李红建责编:宇亭在第一期研发分享中,我们解释了,为什么Tinamu作为一款列式存储引擎在初期不支持Delete功能的原因,然后对一些友商列式存储引擎的Delete方案进......
  • python-操作符
    1.python-操作符有什么用操作符图解操作符:一个特定的符号,用它与其他数据类型连接起来组成一个表达式。常用于条件判断,根据表达式返回True/False采取动作。2.比......
  • 使用Babel将ES6代码转为ES5代码,从而在现有环境执行。
    https://blog.csdn.net/weixin_44797182/article/details/127622359前言在线转码https://babeljs.io/repl/#https://es6console.com/1.快速入门(1)ES6的某些高级语法在浏......
  • python-文件操作
    1.python-文件操作1.1open函数​ 要想读取文件(如txt、csv等),第一步要用open()内建函数打开文件,它会返回一个文件对象,这个对象拥有read()、write()、close()等方法。......
  • PLC采集网关MQTT上云平台操作技巧
    金鸽MQTT的配置操作步骤:(1)双击“金鸽IoT”弹出金鸽MQTT配置框。(2)点击启用按钮,启用金鸽MQTT。默认:关闭。灰色表示:不启用,绿色表示:启用。(3)IP/域名:1883.dtuip.com,默认填写......