深入剖析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扩展点,实现自定义分布式主键生成策略。参见示 例代码。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux操作系统极速入门[常用指令]

linux概述: Linux是一套免费使用和自由传播的操作系统 我们为什么要学,Linux? 主流操作系统: linux系统版本: 内核版: 由linux核心团队开发,维护 免费,开源 负责控制硬件 发行版&…

瑞典最大的连锁超市Coop再遭勒索软件团伙攻击

近日,仙人掌勒索软件团伙声称已经黑入了瑞典最大的连锁超市Coop,并威胁要公开大量个人信息,超过2万个目录。 据了解,Coop在瑞典大约有800家商店,这些商店分属于29个消费者协会,拥有350万个会员&#xff0c…

drf知识-09

自定义频率类 # throttling 频率限制 # 简单方案 from rest_framework.throttling import SimpleRateThrottle class CommonThrottle(SimpleRateThrottle):rate 3/mdef get_cache_key(self, request, view):ip request.META.get(REMOTE_ADDR)return ip# 复杂方案---》通用方案…

灰度发布及声明式资源管理(yaml文件)

一、三种常见的项目发布方式 1)蓝绿发布 2)灰度发布【常用】 3)滚动发布 应用程序升级,面临最大的问题是新旧业务之间的切换 立项-定稿-需求发布-开发-测试-发布,测试上线后,再完美也会有问题,为…

计算机组成原理-期末复习

第一章——计算机系统概述 一、数字计算机的主要组成结构 在电子计算机里,相当于算盘功能的部件,我们称之为运算器;相当于纸那样具有“记忆’功能的部件,我们称之为存储器;相当于笔那样把原始解题信息送到计算机或把…

关于简单的数据可视化

1. 安装数据可视化必要的openpyxl、pandas,matplotlib等软件包 使用清华源,命令如下: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn pandaspip install -i https://pypi.tuna.tsingh…

2024,全网最全的接口测试工具之postman

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

机器学习基本概念及模型简单代码(自用)

监督学习 监督学习是机器学习的一种方法,其中我们教导模型如何做出预测或决策,通过使用包含输入和对应输出的已标注数据集进行训练。这种方法的关键特点是利用这些标注数据**(即带有正确答案的数据)**来指导模型的学习过程。 一言…

下载和安装AD14 - Altium Designer 14.3.20.54863

这个版本应该还支持XP 系统[doge],总之就是想安装一下,没什么特别的意义。 下载 资源来自毛子网站:https://rutracker.net/forum/viewtopic.php?t5140739,带上个网页翻译插件就行。要用磁力链接下载,推荐用qbittorr…

SQLSERVER排查CPU占用高

操作系统是Windows2008R2 ,数据库是SQL2008R2 64位 64G内存,16核CPU 硬件配置还是比较高的,他说服务器运行的是金蝶K3软件,数据库实例里有多个数据库 现象 他说是这几天才出现的,而且在每天的某一个时间段才会出现CPU占用高的情况 内存占用不太高,只占用了30个G CPU…

Redis——centos7环境安装Redis6.2.14版本,make命令编译时报错:jemalloc/jemalloc.h:没有那个文件或目录

一、报错原因 在redis-6.2.14文件夹下有一个README.md文件,有如下一段话: 在构建 Redis 时,通过设置 MALLOC 环境变量来选择非默认的内存分配器。Redis 默认编译并链接到 libc malloc,但在 Linux 系统上,jemalloc 是…

【OpenCV】OpenCV:计算机视觉的强大工具库

摘要   OpenCV是一个广泛应用于计算机视觉领域的开源工具库,为开发者提供了丰富的图像处理和计算机视觉算法。本文将介绍OpenCV的功能和应用领域,并探讨它在实践中的重要性和前景。 计算机视觉的强大工具库 一、什么是OpenCV?二、OpenCV的功…