SQL计算能力是指根据业务SQL生成最优执行计划,通过算子下推、并行执行和RDA等技术,提升分布式执行效率。
-
算子下推:
- 在Sharding的单节点执行或当增删改查等不需要DN节点间数据交互的场景下,CN节点将SQL直接下发至DN跨节点执行。
- 在关联查询等需要DN节点间数据交互的场景下,CN将执行计划下发给DN,DN间通过RDA网络框架完成数据重分布。
-
并行执行:节点间支持DDL、DML等SQL语句并行执行;节点内支持基于数据页的并行查询。
-
RDA( Remote Data Access ):RDA模块实现的重分布逻辑分为三个模块,分别是RDA算子模块,Backend和Forwarder模块之间通信的内存管理模块,网络通信模块Forwarder。
- RDA(Remote Data Access)算子是指进行远程数据访问的数据库算子。其生命周期中包括RDAInit、RDAExec和RDAEnd。
- RDAInit:在RDAInit阶段,初始化RDA算子所需的资源,包括数据缓冲区和共享内存文件,把共享内存文件名通过Socket发送给本节点forwarder进程。
- RDAExec:在RDAExec阶段,RDA算子需要完成两方面的工作:1.数据在集群范围内的分发,每扫到数据,则按重分布键计算Dest节点,确定相应共享内存对象和缓冲区;先尝试把数据写共享内存,供forwarder进程读取;若写失败,则写缓冲区。2.算子拉取远端数据进行本地计算,根据Src节点,确定相应共享内存对象和缓冲区;从共享内存读取数据并写入缓冲区,从缓冲区读取一行数据进行计算。
- RDAEnd:在RDAEnd阶段,关闭RDA算子资源,包括通知本地forwarder进程结束共享内存数据监听、清理算子使用的缓冲区、关闭共享内存文件,然后结束算子运行。使用64位的全局sequence作为RDA算子的名字,sequence名字为rda_id。该sequence在系统初始化阶段创建,需要考虑多个节点创建。
-
Backend和Forwarder模块之间通过共享内存进行通信。 每个RDA对应一个共享内存块,包含发送通道、接收通道共享内存,每个通道包含基本的通道信息和一个通信用的循环队列。每个共享内存块对应一个mmap文件,RDA开始通信时创建文件,通信结束关闭,对应的文件在ResourceOwner中管理,在事务结束时一起删除。常发生时有可能导致对应的文件不能删除,startup日志重放结束后清空该目录。
-
网络通信模块Forwarder通过Socket在不同RDA之间传输数据。数据在集群范围内的分发,下层算子的扫描数据tuple,计算重分布,若是本地处理的则保留,可返回给上层算子;若不是本地处理的,则根据dest_node_id写入到共享内存或缓存tuplestore,供forwarder进程读取。算子拉取远端数据进行本地计算,根据Src节点,确定相应共享内存对象和缓冲区;从共享内存读取数据并写入缓冲区,从缓冲区读取一行数据进行计算。
RDA主要用于解决重分布场景的进程数暴增问题,DN节点间数据传输走RPC,每个Datanode只会有1个会话进程。
SQL计算具体执行过程如下:
-
业务应用下发SQL给CN节点 ,其中SQL可以包含对数据的增(insert)、删(delete/drop)、改(update)、查(select)。
-
CN节点利用数据库的优化器生成执行计划,每个DN节点会按照执行计划的要求去处理数据。
-
为确保数据均匀分布在每个DN节点,DN节点之间需进行数据传递。
说明因为数据是通过一致性Hash技术均匀分布在每个节点,因此DN节点在处理数据的过程中,可能需要从其他DN节点获取数据。同时,TeleDB可通过RDA网络框架降低数据重分布的资源消耗。
-
DN节点将结果集返回给CN节点进行汇总。
-
CN节点将汇总后的结果返回给业务应用。