ShardingSphere 内核工作原理

news2024/9/25 3:21:22

文章目录

    • 内核工作原理
      • 配置管控
      • SQL Parser: SQL解析引擎
      • SQL Router- SQL 路由引擎
      • SQL Rewriter : SQL 优化引擎
      • SQL Executor : SQL执行引擎
      • Result Merger: 结果归并

内核工作原理

ShardingSphere的整体架构图是这样的:

在这里插入图片描述



配置管控

在进入ShardingSphere的内核之前,ShardingSphere做了大量的配置信息管控。

不光是将应用的配置信 息进行解析,同时ShardingSphere还支持将这些配置信息放到第三方的注册中心,从而可以实现应用层的水 平扩展。



SQL Parser: SQL解析引擎

解析过程分为词法解析和语法解析。

词法解析器用于将SQL拆解为不可再分的原子符号,称为Token。并根据不同数据库方言所提供的字典,将其归类为关键字、表达式、字面量和操作符。

再使用语法解析器将 SQL转换为抽象语法树(简称AST, Abstract Syntax Tree)。



例如对下面一条SQL语句:

SELECT id, name FROM t_user WHERE status = 'ACTIVE' AND age > 18

会被解析成下面这样一颗树:

在这里插入图片描述



SQL解析是整个分库分表产品的核心,其性能和兼容性是最重要的衡量指标。

ShardingSphere在1.4.x之前采用的是性能较快的Druid作为SQL解析器。

1.5.x版本后,采用自研的SQL解析器,针对分库分表场景,采取对SQL半理解的方式,提高SQL解析的性能和兼容性。

然后从3.0.x版本后,开始使用ANLTR作为SQL解析引擎。这是个开源的SQL解析引擎,很多开源产品都使用他来解析SQL。比如像Druid、Flink、Hive、RocketMQ、Elasticsearch等等。ShardingSphere在使用ANLTR时,还增加了一些AST的缓存功能。针对ANLTR4的特性,官网建议尽量采用PreparedStatement的预编译方式来提高SQL执行的性能。



SQL Router- SQL 路由引擎

根据解析上下文匹配数据库和表的分片策略,并生成路由路径。对于携带分片键的 SQL,根据分片键的不同可以划分为

  • 单片路由(分片键的操作符是等号)
  • 多片路由(分片键的操作符是 IN)
  • 范围路由(分片键的操作符是 BETWEEN)
  • 不携带分片键的 SQL 则采用广播路由。

在这里插入图片描述



  • 全库路由:对数据库的操作都会遍历所有真实库。 例如 set autocommit=0
  • 全库表路由:对于不带分片键的DQL、DML以及DDL语句,会遍历所有的库表,逐一执行。
  • 全实例路由:对于DCL语句,每个数据库实例只执行一次,例如 CREATE USER 创建用户语句
  • 单播路由:仅需要从任意库中获取数据即可。 例如 DESCRIBE course
  • 阻断路由:屏蔽SQL对数据库的操作。例如 USE coursedb。就不会在真实库中执行,因为针对虚拟表操作,不需要切换数据库。



SQL Rewriter : SQL 优化引擎

首先,在数据方言方面。Apache ShardingSphere 提供了 SQL 方言翻译的能力,实现数据库方言之间的自动转换。

例如,用户可以使用 MySQL 客户端连接 ShardingSphere 并发送基于 MySQL 方言的 SQL,ShardingSphere 能自动识别用户协议与存储节点类型自动完成 SQL 方言转换,访问 PostgreSQL 等异构存储节点。

在这里插入图片描述



接下来,用户只需要面向逻辑库和逻辑表来写SQL,最终由ShardigSphere的改写引擎将SQL改写为在真实数据库中可以正确执行的语句。

SQL改写分为正确性改写和优化改写。

正确性改写

在包含分表的场景中,需要将分表配置中的逻辑表名称改写为路由之后所获取的真实表名称。仅分库则不需要表名称的改写。除此之外,还包括补列和分页信息修正等内容。

优化改写

优化改写的目的是在不影响查询正确性的情况下,对性能进行提升的有效手段。它分为单节点优化和流式归并优化。比如我们之前提到,在ShardingJDBC5版本下,对一个分片库的多次查询,会通过UNION 合并成一个大的SQL,这也是一种优化改写。

在这里插入图片描述



SQL Executor : SQL执行引擎

ShardingSphere 采用一套自动化的执行引擎,负责将路由和改写完成之后的真实 SQL 安全且高效发送到底层数据源执行。它不是简单地将 SQL 通过 JDBC 直接发送至数据源执行;也并非直接将执行请求放入线程池去并发执行。它更关注平衡数据源连接创建以及内存占用所产生的消耗,以及最大限度地合理利用并发等问题。执行引擎的目标是自动化的平衡资源控制与执行效率。

在这里插入图片描述



这里主要是理解内存限制模式和连接限制模式。简单理解,

  • 内存限制模式只需要保持一个JDBC连接,单线程即可完成某一个真实库的所有数据访问。
  • 连接限制模式就需要保持多个JDBC连接,也就需要多线程并发完成某一个真实库的所有数据访问。



Result Merger: 结果归并

将从各个数据节点获取的多数据结果集,组合成为一个结果集并正确的返回至请求客户端,称为结果归并。

在这里插入图片描述



其中重点是理解流式归并与内存归并:

  • 流式归并是指每一次从结果集中获取到的数据,都能够通过逐条获取的方式返回正确的单条数据,它与数据库原生的返回结果集的方式最为契合。遍历、排序以及流式分组都属于流式归并的一种。通常内存限制模式就可以使用流式归并,比较适合OLTP场景。
  • 内存归并则是需要将结果集的所有数据都遍历并存储在内存中,再通过统一的分组、排序以及聚合等计算之后,再将其封装成为逐条访问的数据结果集返回。通常连接限制模式就可以使用内存归并,比较适合OLAP场景。

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

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

相关文章

火车站NTP电子钟,自动授时,保证时间精准

在现代交通体系中,火车站作为重要的交通枢纽,每天承载着大量乘客的出行需求。为了确保列车运行的准时性和乘客信息的准确性,火车站NTP电子钟成为不可或缺的一部分。本文将详细介绍火车站NTP电子钟的特点及其在不同场景中的应用优势。 一、火车…

【STL】String的底层构造

1.String类对象的构造&#xff08;后面有每一个接口的实现&#xff09; #define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include<iostream> #include<assert.h> using namespace std;namespace bit {class string{public:typedef char* iterator;typedef const…

字节实习面试

1.比左边的数都小&#xff0c;比右边的数都大 public class Test3 {/*** 从左往右找当前位置往左最小的* 从右往左遍历找当前位置往右最大的* 比较* param args*/public static void main(String[] args) { // int[] arr new int[]{9,8,7,3,4,2,1};int[] arr new int[…

【第十届泰迪杯数据挖掘挑战赛A题害虫识别】-农田害虫检测识别-高精度完整更新

农田害虫检测识别项目-高精度完整版 一、说明&#xff1a; 该版本为基于泰迪杯完整害虫数据重新制作数据集、优化增强数据集、重新进行模型训练&#xff0c;达到高精度、高召回率的最优模型代码。包含论文、最优模型文件以及相关文件、原始数据集、训练数据集XML版、增强扩充…

五款超好用的报表软件推荐,其中一款竟然完全免费

与以往需要通过繁琐的数据表格和复杂的数字分析不同&#xff0c;可视化报表通过表格、图表和图形&#xff0c;将数据以更加直观的方式呈现出来&#xff0c;使得原本繁杂无序的数据变得清晰易懂。无论是管理层的决策分析&#xff0c;还是一线员工的日常工作&#xff0c;可视化报…

vs+qt一些问题

一直遇到的两个问题&#xff0c;今天解决了 1、 因为前后端分离&#xff0c;前端写完了&#xff0c;后端还在一直修改&#xff0c;但是每次都是单独打开的后端的sln&#xff0c;所以会出现这个&#xff0c;把前端的模块删掉就好了。 2、打开vs项目&#xff0c;很多报错&#…

怎么在视频上加文字?归纳了简单好用的方法

怎么在视频上加文字&#xff1f;在数字媒体制作中&#xff0c;为视频添加文字是一种常见的需求。无论是为了提供字幕、注释、标题还是视觉效果&#xff0c;文字元素都能增强视频的传达力和观赏性。因此&#xff0c;今天本文将介绍四种简单好用的方法&#xff0c;帮助你轻松地在…

硬盘数据恢复:所需时长、全面指南及注意事项

在数字化时代&#xff0c;硬盘作为我们存储重要数据的核心设备&#xff0c;其重要性不言而喻。然而&#xff0c;由于各种原因&#xff0c;如误删除、格式化、硬盘故障等&#xff0c;我们时常面临数据丢失的困境。数据恢复不仅关乎个人隐私和信息安全&#xff0c;更可能影响到我…

Platform Designer各模块(2)

1.On-Chip Memory&#xff08;存储器&#xff09; (RAM or ROM) Intel FPGA IP RAM&#xff1a;主存&#xff0c;与CPU直接交换数据的内部存储器&#xff0c;可读可写&#xff0c;断电不丢失数据&#xff1b; ROM&#xff1a;只能读取数据&#xff0c;断电丢失数据。 2.Syste…

如何利用matlab将现有的地基雷达回波数据调制为机载雷达回波数据???

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

Bug太多,苹果手机升级到18.1后怎么降级

最近苹果公司发布了iOS 18.1开发者测试版和macOS Sequoia 15.1的开发者测试版&#xff0c;此次发布的iOS18.1开发者测试版本苹果给其带来了两个重要的新功能。 1、通话录音功能 现在只要拨打或者是接听电话&#xff0c;界面左上角就会出现通话录音按键&#xff0c;点击即可开启…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第五篇 文件系统构建篇-第七十四章 buildroot构建文件系统

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

老照片修复软件分享3款!码住一些实用的方法!

在数字时代&#xff0c;老照片不仅是时间的印记&#xff0c;更是我们珍贵的记忆载体。然而&#xff0c;随着时间的流逝&#xff0c;这些照片往往会变得模糊、褪色甚至破损。幸运的是&#xff0c;现代科技的发展为我们提供了多种老照片修复软件&#xff0c;让我们能够轻松恢复这…

docker 发布geoserver服务添加字体

1. 创建容器时可直接挂载到系统字体库 2. 已发布的容器挂载字体目录 关闭docker服务 &#xff1a; systemctl stop docker.socket 修改config.v2.json :位置在 cd /var/lib/docker/containers/容器id 重新启动docker服务&#xff1a;systemctl start docker

【启明智显方案分享】6.86寸高清显示屏音频效果器解决方案

一、项目概述 本方案旨在设计一款集成6.86寸高清触摸显示屏的音频效果器&#xff0c;通过HMI&#xff08;Human-Machine Interface&#xff09;芯片Model 4驱动&#xff0c;实现高清晰度的视觉交互。该设备不仅支持音乐、麦克风及温响音量的精细控制&#xff0c;还内置丰富的预…

vue信息列表实现点击加载更多陆续显示后面数据

原理&#xff1a;在点击加载更多后进行判断&#xff1a; if (this.currentPage < this.totalPages - 1) {this.currentPage;} 如果当前页码小于总页码就让当前页码1&#xff0c;通过计算属性动态更新开始和结束值&#xff0c;从而当前页面展示更多数据&#xff1a; paginate…

WPF使用Iconfont字符串的操作方法

1.下载字体库文件 https://www.bootcss.com/p/font-awesome/ 2.放入Fonts文件夹下 3.文件属性修改为 资源 3.引入 FontFamily字体类型 <Setter Property"FontFamily" Value"../../CommonInMy/Fonts/#iconfont"/>注意这里的地址请填写绝对地址&…

哈佛大学单细胞课程|笔记汇总 (二)

哈佛大学单细胞课程|笔记汇总 &#xff08;一&#xff09; &#xff08;二&#xff09;Single-cell RNA-seq data - raw data to count matrix 根据所用文库制备方法的不同&#xff0c;RNA序列&#xff08;也被称为reads或tag&#xff09;将从转录本&#xff08;(10X Genomic…

期权逢高空是什么意思?期权为什么要逢高空呢?

今天带你了解期权逢高空是什么意思&#xff1f;期权为什么要逢高空呢&#xff1f;期权是金融市场上常见的一种金融工具&#xff0c;它赋予持有者在未来某个特定时间以特定价格买入或卖出标的资产的权利。 期权逢高空是什么&#xff1f; 期权逢高空是一种交易策略&#xff0c;…

在Ubuntu 24.04服务器或桌面上安装XFCE

在Ubuntu 24.04 上更改当前 桌面环境或添加新桌面环境并不困难。大多数流行的Linux桌面环境&#xff08;包括 XFCE&#xff09;都可以使用默认的 Ubuntu 24.04 LTS 系统存储库进行安装。因此&#xff0c;在本教程中&#xff0c;我们将学习如何使用 Tasksel 工具在 Ubuntu Linux…