深入剖析ShardingSphere:探索其内核原理与核心源码,揭秘分库分表技术的奥秘

一、 内核剖析

ShardingSphere虽然有多个产品,但是他们的数据分片主要流程是完全一致的。

解析引擎

        解析过程分为词法解析和语法解析。 词法解析器用于将SQL 拆解为不可再分的原

子符号,称为Token  并根据不同数据库方言所提供的字典,将其归类为关键字,

表达式,字面量和操作符。 再使用语法解析器将SQL转换为抽象语法树(简称AST,

Abstract  Syntax  Tree)

例如对下面一条SQL 语句:

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

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

为了便于理解,抽象语法树中的关键字的 Token 用绿色表示,变量的 Token 用红色表示,灰色表示需要进一步拆分。通过对抽象语法树的遍历,可以标记出所有可能需要改写的位置。

SQL 的一次解析过程是不可逆的,所有tokenSQL 原本的顺序依次进行解析,性能 很高。并且在解析过程中,需要考虑各种数据库SQL方言的异同,提供不同的解析模版。

其中,SQL 解析是整个分库分表产品的核心,其性能和兼容性是最重要的衡量指标。ShardingSphere 在1.4x之前采用的是性能较快的Druid 作为SQL解析器。1.5.x  版本后,采用自研的SQL 解析器,针对分库分表场景,采取对SQL半理解的方式,提 SQL 解析的性能和兼容性。然后从3.0.x版本后,开始使用ANLTR 作为SQL 解析引  擎。这是个开源的SQL 解析引擎,ShardingSphere 在使用ANLTR 时,还增加了一些AST 的缓存功能。针对ANLTR4 的特性,官网建议尽量采用PreparedStatement 预编译方式来提高SQL 执行的性能。

sql 解析整体结构:

路由引擎

根据解析上下文匹配数据库和表的分片策略,生成路由路径。

ShardingSphere 的分片策略主要分为单片路由(分片键的操作符是等号)、多片路由 (分片键的操作符是IN)和范围路由(分片键的操作符是Between)。 不携带分片键的SQL   则是广播路由。

分片策略通常可以由数据库内置也可以由用户方配置。内置的分片策略大致可分为 尾数取模、哈希、范围、标签、时间等。 由用户方配置的分片策略则更加灵活,可以根据使用方需求定制复合分片策略。

实际使用时,应尽量使用分片路由,明确路由策略。因为广播路由影响过大,不利于集群管理及扩展。

改写引擎

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

执行引擎

ShardingSphere 并不是简单的将改写完的SQL 提交到数据库执行。执行引擎的目标是自动化的平衡资源控制和执行效率。

例如他的连接模式分为内存限制模式(MEMORY_STRICTLY)    和连接限制模式(CONNECTION_STRICTLY)。      内存限制模式只关注一个数据库连接的处理数量,通 常一张真实表一个数据库连接。而连接限制模式则只关注数据库连接的数量,较大的查询会进行串行操作。

归并引擎

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

客户端,称为结果归并。

其中,流式归并是指以一条一条数据的方式进行归并,而内存归并是将所有结果集

都查询到内存中,进行统一归并。

二、ShardingSphereSPI扩展 

ShardingSphere为了兼容更多的应用场景,在源码中保留了大量的SPI扩展点。所

以在看源码之前,需要对JAVASPI机制有足够的了解。

1、 SPI机制

SPI的全名为:Service Provider Interface。在java.util.ServiceLoader的文档里有 比较详细的介绍。

简单的总结下 Java SPI 机制的思想。我们系统里抽象的各个模块,往往有很多不同  的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象 的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。

一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现, 就需要修改代码。为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。

Java SPI 就是提供这样的一个机制:为某个接口寻找服务实现的机制。有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要

Java SPI 的具体约定为:当服务的提供者,提供了服务接口的一种实现之后,在jar包 的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。

而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置 文件找到具体的实现类名,并装载实例化,完成模块的注入。

基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。jdk 提供服务实现查找的一个工具类:java.util.ServiceLoader。

2、 ShardingSphere中的SPI扩展点

ShardingSphere的开发思想是对源码中主体流程封闭,而对SPI开放。在配套的官方文档《shardingsphere_docs_cn.pdf》的开发者手册部分详细列出了 ShardingSphere的所有SPI扩展点。

3、实现自定义主键生成策略

使用ShardingSphere提供的SPI扩展点,实现自定义分布式主键生成策略。参见示 例代码。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

掌握 Postman Newman:快速启动 API 测试自动化

Postman 中的 Newman 是什么? Newman 是一个 CLI(命令行界面)工具,用于运行 Postman 中的集合(Collection)和环境(Environment)来进行自动化测试。它允许直接从命令行运行 Postman …

解决VMware 虚拟机 ubuntu 20.04 异常关闭导致虚拟网卡 ens33 无法工作问题

问题描述 由于经常使用 SSH 远程链接 VMware 中的虚拟机 ubuntu,每次关闭都是挂起,时间久了,虚拟机运行有些卡顿了,此时可以通过 Linux 命令重启或者关闭 ubuntu,也可以之间使用 VMWare 中的【虚拟机】-- 【电源】-&g…

SpringCloudAlibaba之Nacos

1、简介 Nacos支持基于DNS和基于RPC的服务发现,服务端可以通过SDK或者Api进行服务注册,相应的服务消费者可以使用DNS或者Http查找的方式获取服务列表。Spring Cloud 服务注册中心的服务器很多,如 Zookeeper、Eureka、Consul 等。 Spring Clou…

CCNP课程实验-02-EIGRP_CFG

目录 实验条件网络拓朴需求: 基础配置需求实验1. R4/R5/R6通过二层交换机连接,按照实验拓扑图来宣告路由器接口到相应的EIGRP进程,没有具体说明的可任意宣告,要求关闭自动汇总。2. R2 --- R3上启用EIGRP认证(采用MD5进…

SM2——适用于前后端(java+vue)公用的SM2国密加解密传输

目录 一、SM2国密加解密算法1.1、pom文件引入依赖包1.2、SM2加解密工具类1.3、测试类 一、SM2国密加解密算法 1.1、pom文件引入依赖包 <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk18on</artifactId><version>…

JMeter使用

目录 启动JMeter 创建线程组 设置线程参数 设置http请求参数 ​编辑 创建查看结果树(显示成功/失败多少以及返回结果等信息) 创建聚合报告(显示响应时间、吞吐量、异常数等信息) 点击上方的执行按钮即可开始压力测试 结果树显示 聚合报告结果显示 启动JMeter 在JMete…

产品经理学习-从0-1搭建策略产品

从0-1搭建策略产品 目录&#xff1a; 回顾策略产品 如何从0-1搭建策略产品 回顾策略产品 之前也了解过从产品实施的角度来看&#xff0c;策略就是针对问题的解决方案&#xff0c;在互联网时代更集中体现在2个维度&#xff1a;业务场景和数据应用 如何从0-1搭建策略产品 我们…

HTML5+CSS3④——选择器、复合选择器

目录 选择器 标签选择器 类选择器 id选择器 通配符选择器 复合选择器 后代选择器 子代选择器 并集选择器 交集选择器 选择器 标签选择器 类选择器 id选择器 通配符选择器 复合选择器 后代选择器 子代选择器 并集选择器 交集选择器

一文读懂OTA【赠书活动|第12期《一书读懂物联网:基础知识+运行机制+工程实现》】

2020年&#xff0c;特斯拉发布过一次OTA更新&#xff0c;车主可以通过这次系统更新获得座椅加热功能。当时&#xff0c;这则新闻震惊了车圈和所有车主&#xff0c;彼时的大家还没有把汽车当作可以“升级”的智能设备。 如今3年过去了&#xff0c;车主对各家车企的OTA升级早已见…

easyrecovery 2024最新免费密钥分享 实用数据恢复软件分享

在日常使用电脑时&#xff0c;我们经常会遇到误删文件的情况&#xff0c;若文件还未被彻底删除&#xff0c;我们还可以通过电脑中的回收站将其恢复&#xff0c;但若是回收站都被清空的话&#xff0c;想要恢复文件就变得比较困难了&#xff0c;而EasyRecovery可以很好的帮助我们…

关键字:new关键字

在 Java 中&#xff0c;new关键字用于创建对象实例。它是对象创建的语法糖&#xff0c;用于分配内存空间并调用构造函数来初始化对象。 以下是new关键字的基本语法&#xff1a; 在上述语法中&#xff0c;ObjectType是要创建对象的类名&#xff0c;objectName是对象的引用变量…

Stable Diffusion API入门:简明教程

Stable Diffusion 是一个先进的深度学习模型&#xff0c;用于创造和修改图像。这个模型能够基于文本描述来生成图像&#xff0c;让机器理解和实现用户的创意。使用这项技术的关键在于掌握其 API&#xff0c;通过编程来操控图像生成的过程。 在探索 Stable Diffusion API 的世界…

CISSP 第1章:实现安全治理的原则和策略

作者&#xff1a;nothinghappend 链接&#xff1a;https://zhuanlan.zhihu.com/p/669881930 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 CIA CIA 三性&#xff1a; 机密性&#xff1a;和数据泄露有关。完整性…

工业交换机进行高低温检测的原因是什么?

工业交换机进行高低温检测的原因有以下几点&#xff1a; 1. 确保设备正常工作&#xff1a;工业交换机在工作过程中会产生一定的热量&#xff0c;如果环境温度过高&#xff0c;可能会导致设备过热&#xff0c;影响交换机的性能和寿命。通过高温检测&#xff0c;可以及时采取措施…

基于蝴蝶算法优化的Elman神经网络数据预测 - 附代码

基于蝴蝶算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于蝴蝶算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于蝴蝶优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针…

SpringBoot知识

1、Spring和SpringBoot对比 2、版本调整 &#xff08;1&#xff09;先排除是否是JDK与SpringBoot的版本不一致导致的&#xff1a;如JDK1.8和SpringBoot3.1.5冲突&#xff1b; &#xff08;2&#xff09;调整编译版本 &#xff08;3&#xff09;调整maven的jdk &#xff08;4&…

基于蜻蜓算法优化的Elman神经网络数据预测 - 附代码

基于蜻蜓算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于蜻蜓算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于蜻蜓优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针…

【解决】电脑上的WIFI图标不见了咋整?

相信不少同学都遇到过这种情况&#xff1a;电脑上的wifi图标莫名不见了&#xff0c;甚至有时候还是在使用的中途突然断网消失的。 遇到这种情况一般有两种解决方案&#xff1a; 1. 在开机状态下长按电源键30秒以上 这种办法应该是给主板放电&#xff0c;一般应用在wifi6上面。…

我的机器学习起步如何Getting Started

学习技巧和原则 先通过经典书籍进行科普知名机器学习网站根据书籍或网站的目录&#xff0c;先泛读、再选择有兴趣的部分重点精读、后至于反复读知行合一 起步Getting Started 周志华版《机器学习》&#xff0c;又名西瓜书 可以作为科普书籍&#xff0c;需要主动略过对于理论…

无监督关键词提取算法:TF-IDF、TextRank、RAKE、YAKE、 keyBERT

TF-IDF TF-IDF是一种经典的基于统计的方法&#xff0c;TF(Term frequency)是指一个单词在一个文档中出现的次数&#xff0c;通常一个单词在一个文档中出现的次数越多说明该词越重要。IDF(Inverse document frequency)是所有文档数比上出现某单词的个数&#xff0c;通常一个单词…