ShardingSphere再回首

news2024/11/26 14:47:46

概念:

 连接:通过协议 方言及库存储的适配,连接数据和应用,关注多模数据苦之间的合作

  增量:抓取库入口流量题提供重定向, 流量变形(加密脱敏)/鉴权/治理(熔断限流)/分析等

  可插拔:微内核

DDL:create table/index | alter table |drop table |truncate table|drop index/table 表结构

DML:insert update delete 表数据的操作

DQL:select 

DCL:grant分权限 revoke废除权限

分表分库

数据分片:按某维度将存放在单一数据库中的数据分散地存放至多个数据库或表

垂直分片

专库专用,按业务

水平分片

通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中

流程

Standard 内核流程:SQL 解析 => SQL 路由 => SQL 改写 => SQL 执行 => 结果归并,用于处理标准分片场景下的 SQL 执行

Federation 执行引擎流程:SQL 解析 => 逻辑优化 => 物理优化 => 优化执行 => Standard 内核流程,在优化执行阶段依赖Standard内核流程,对优化后的逻辑 SQL 进行路由、改写、执行和归并

sql解析:词法/语法解析,词法解析器SQ拆分不可再拆的词 Token,词法解析器 理解 sql,解析上下文(表/选择项/排序项/分组项/聚合函数/分页信息/查询条件/占位符标记)

sql路由:分片/广播,解析上下文匹配分片策略,生成路由路径

sql改写:在真实数据可以执行的语句,正确性/优化改写

sql执行:多线程执行器异步执行

结果归并:结果由统一的JDBC接口输出,流式归并/内存归并/装饰者模式追加归并

   流式归并:以结果集游标下移进行结果归并,省内存 减少垃圾回收

查询优化:Federation提供,优化关联/子查询跨库分布式查,关系代数优化查询计划,最优计划查询出结果

解析引擎

抽象语法树

    sql解析阶段的token,再据不同数据库方言提供的字典,将其归类为关键字 表达式 字面量 操作符,语法解析器将sql转换为抽象语法树

 解析过程不可逆,token按原本顺序依次解析,性能高

sql解析引擎

   3.0 ANTLR作为SQL解析的引擎(兼容sql),据DDL -> TCL -> DAL –> DCL -> DML –>DQL依次替换原有的解析引擎,慢 需要搭配PreparedStatement预编译

路由引擎

上下文匹配数据库/表的分片策略,生成路由

携带分片键sql,分片键不同划分单片路由(=)多片路由(in)范围路由(between)

不携带 分片键 的广播路由

分片策略

 内置:尾数取模 哈希 范围 标签 时间

 用户配置:需求定制复合分片策略

分片路由

直接路由:分库不分表 hint指定路由到库,避免sql解析 结果归并;可子查询 自定义函数等任意sql

标准路由:推荐,不含关联查 仅绑定表间关联的sql,=单表 between/in不定 sql拆分数目与单表一致

笛卡尔积路由:复杂 非绑定表间关联查询需拆解为笛卡尔积组合执行 t0t0  t0t1  t1t0  t1t1

广播路由
  • 全库表:库中逻辑表相关的all操作,DQL DML DDL,all库all表匹配逻辑表和真实表名 执行
  • 全库:对库操作,set/TCL事务控制语句,据逻辑名字遍历符合名字匹配的真实库
  • 全实例:DCL 每个库只执行一次
  • 单播:获取真实的表信息 任意库的任意真实表即可
  • 阻断:屏蔽sql对数据库的操作

改写引擎

逻辑SQL改写在真实数据库中可正确执行的SQL:正确性改写 优化改写

流式归并优化:group by 的sql增加order by和分组项相同的排序项/顺序

执行引擎

 执行引擎的目标是自动化的平衡资源控制与执行效率

连接模式

   每个分片查询维持一个独立的数据库连接:利用多线程提供执行效率/并行处理io消耗/避免过早将结果放到内存/持有查询结果集游标位置的引用

  无法保证每个分片持有独立数据库连接,在复用该库连接获取下一张分表查询结果集之前,当前查询结果集全数加载至内存,流式退化为内存归并

   抉择:对库连接资源控制保护 更优归并模式对中间件内存资源节省

内存限制模式

  不限制一次操作所耗费的数据库连接数量,多线程并发处理,执行效率最大化

  且在sql满足条件情况下,优先选择流式归并,防止内存溢出 避免频繁垃圾回收

  OLAP:提供吞吐量,联机分析处理 复杂计算和统计 数据分析预测

连接限制模式

   控制连接数量唯一连接串行执行处理,分片散落不同数据库 多线程处理不同库的操作 一个库一个连接,防止对一次请求对数据库连接占用过多所带来的问题,内存归并

   OLTP(联机事务) 实时性 事务处理数据操作

      带分片键 路由到单一分片 保证库资源被更多应用使用到

自动化执行引擎

由执行引擎根场景自动选择最优的执行方案

连接模式的选择粒度细化至每一次SQL的操作

    据路由结果,实时演算和权衡,自主选择:资源 效率最优 

    仅配置maxConnectionSizePerQuery一次查询时每个数据库所允许使用的最大连接数

准备阶段

结果集分组 执行单元执行两步

  1. sql路由结果按数据源的名称分组
  2. 获得在数据库实例在maxConnectionSizePerQuery范围,一连接需执行的SQL路由结果组,计算出本次请求的最优连接模式

避免死锁:同步获取连接,创建执行单元 原子性一次性获取本次sql需要all库连接

  • 避免锁定一次性只需要1个库连接的操作,不需锁定,OLTP分片键路由唯一节点 读写分离
  • 内存限制模式才资源限定,连接限制all结果集在内存后释放连接资源 不会死锁
执行阶段

分组执行

   准备执行阶段生成的执行单元下发到底层并发执行引擎,执行过程中关键步骤发送事件 执行引擎仅关注事件发布 订阅感兴趣的并处理

归并结果

   内存归并结果集或流式归并结果集,将其传递至结果归并引擎   

归并引擎

   结果归并:从各个数据节点获取的多数据结果集,组合成结果集并正确的返回给请求客户端

   返回结果集方式归并,减少内存消耗

流式归并:每一次从结果集中获取到的数据,能通过逐条获取的方式返回正确的单条数据,与数据库原生的返回结果集的方式契合

   遍历、排序以及流式分组都属于流式归并的一种

内存归并:需将结果集的all数据都遍历并存储在内存,通过统一的分组、排序及聚合等计算,再将其封装成逐条访问的数据结果集返回

装饰者归并:对all结果集归并进行统一的功能增强,分页归并和聚合归并这2种类型

遍历:将多个数据结果集合并为一个单向链表

   遍历完当前结果集,链表元素后移一位,继续遍历下一个数据结果集

排序:ORDER BY每个数据结果集自身是有序的,将结果集当前游标指向的数据值进行排序

    将每个结果集的当前数据值进行比较(通过实现Java的Comparable接口),将其放入优先级队列, 获取下一条数据时,只需将队列顶端结果集的游标下移,并据新游标重新进入优先级排序队列找到自己的位置即可

  ???

分组:流式分组归并/内存分组归并

聚合:之前介绍的归并类的之上追加的归并能力,比较min max、累加sum count和求平均值avg

分页:通过结果集的next方法跳过无需取出的数据,不会将其存入内存

数据脱敏

完整、安全、透明化、低改造成本的数据加密整合解决方案

  •   解析用户输入的SQL进行,依据用户提供的加密规则改写SQL,实现对原数据加密,将原文数据(可选)及密文数据同时存储到底层数据库
  • 查询数据,从数据库中取出密文数据,并对其解密,将解密后的原始数据返回给用户。
  • 自动化 & 透明化数据加密过程,无需关注数据加密的细节,像使用普通数据那样使用加密数据

    加密模块拦截 SQL ,语法解析器进行解析、理解 SQL 行为,依传入的加密规则,找出需加密的字段和所使用的加解密算法对目标字段进行加解密处理后,与底层数据库交互

    在用户查询时,将密文从数据库中取出进行解密后返回给终端用户。 屏蔽对数据的加密解密处理过程

加密规则

加密处理过程

解决方案

新业务直接配置 

老业务

新的数据 走配置 新增字段 自动赋值

旧数据 自行加密清洗

将明文删除,建立映射关系 底层使用密文处理

加密算法

EncryptAlgorithm

 encrypt decrypt

    insert/delete/update ,按配置 sql解析/改写/路由 encrypt加密 存储到库

    查询decrypt从库取出加密 逆向解密,原始数据返回

md5 不可逆,aes可选,rc4可逆

QueryAssistedEncryptAlgorithm

相同的数据,库中也应该是不一样的

encrypt()阶段,设置某个变动种子,如时间戳。

    针对原始数据+变动种子组合的内容进行加密,加密数据是不一样的

decrypt()可依据之前规定的加密算法,利用种子数据进行解密

辅助查询列queryAssistedEncrypt

   另一种方式加密原始数据,针对原始数据相同的数据,产生的加密数据是一致的

事务

xa

X/OPEN组织定义的DTP模型抽象的 AP(应用程序), TM(事务管理器)和 RM(资源管理器)

  

    set autoCommit=0 ,XAShardingSphereTransactionManager 为调用具体的 XA 事务管理器开启 XA 全局事务,以 XID 的形式进行标记

   XAResource注册XA事务中,事务管理器 XAResource.start,库收到XAResource.end前,all的sql操作标记为xa事务

   XAShardingSphereTransactionManager收到接入端提交命令,委托xa事务管理器提交,收集到all注册xaResource, 发送XAResource.end 指令,依次发送prepare,手机xaResource投票,all均正确 commit最终提交,否rollback回滚

Saga

   一个Saga事务是一个有多个短时事务组成的长时的事务

   分布式事务场景下,一个Saga分布式事务看做是一个由多个本地事务组成的事务,每个本地事务都有一个与之对应的补偿事务

   在Saga事务的执行过程中,如某一步执行出现异常,Saga事务会被终止,同时会调用对应的补偿事务完成相关的恢复操作

自动反向补偿

     Saga事务管理器根程序执行结果生成一张有向无环图,在需要执行回滚操作时,据该图依次按照相反的顺序调用反向补偿操作

    Saga事务管理器只用于控制何时重试,何时补偿,补偿的具体操作需开发者提供

ShardingSphere采用反向SQL技术,将对数据库进行更新操作的SQL自动生成反向SQL,并交由saga-actuator执行,无需关注如何实现补偿,柔性事务管理器的应用范畴定位回了数据库层面

Seata

弹性伸缩

对现有的分片集群进行弹性扩容或缩容,4.1.0

临时建两个库集群,伸缩完切换

   解析旧分片规则,提取配置中的数据源、数据节点等,之后创建伸缩作业工作流

压测

   解析 SQL,对传入的 SQL 进行影子判定,根配置文件设置的影子规则,路由到生产库或者影子库

 以 INSERT 语句为例,对 SQL 进行解析,据配置文件规则,构造一条路由链

   在当前版本的功能中(很老的版本), 影子功能处于路由链中的最后一个执行单元:如果有其他需要路由的规则存在,如分片,据分片规则路由到某一个数据库,执行影子路由判定流程,判定执行SQL满足影子规则的配置,数据路由到对应的影子库,生产数据维持不变

DML:先判断执行SQL表与配置的影子表是否有交集,有:判交集影子表关联的影子算法,任一成功 sql路由到影子库,无交集 判定失败 路由到生产库

DDL:注解影子算法,初始化/修改影子库使用,执行的sql有注解 配置hint判定 成功路由影子库 否路由生产库

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

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

相关文章

皮具5G智能制造工厂数字孪生可视化平台,推进企业数字化转型

皮具5G智能制造工厂数字孪生可视化平台,推进企业数字化转型。随着信息技术的快速发展,数字化转型已成为企业提升竞争力、实现可持续发展的关键路径。皮具行业,作为一个传统的手工制造业,正面临着巨大的市场变革和技术挑战。如何在…

(Java)数据结构——图(第十节)AOE网以及关键路径

目录 前言 AOE网 AOE网的两个性质: AOE网的五个时间 事件的最早发生时间Ve[k] 活动的最早开始时间E[i] 事件的最迟发生时间Vl[k] 活动的最晚开始时间L[i] 活动的时间余量 关于关键路径的缩短 代码实现思路 前言 本博客是博主用于复习数据结构以及算法的博…

蓝桥杯备赛刷题——css

新鲜的蔬菜 这题需要使用grid 我不会 去学一下 一.什么是grid Grid 布局与 Flex 布局有一定的相似性,都可以指定容器内部多个项目的位置。但是,它们也存在重大区别。 Flex 布局是轴线布局,只能指定"项目"针对轴线的位置&#…

(非技术) 基因遗传相关知识学习笔记

目录 一、基因遗传名词解释 二、什么叫显性遗传和隐性遗传? 三、如何确定遗传性质呢?是显性还是隐性? 四、常规例子1: 五、常规例子2: 六、实际案例: 七、思考题: 八、参考: …

【Redis深度解析】揭秘Cluster(集群):原理、机制与实战优化

Redis Cluster是Redis官方提供的分布式解决方案,通过数据分片与节点间通信机制,实现了水平扩展、高可用与数据容灾。本文将深入剖析Redis Cluster的工作原理、核心机制,并结合实战经验分享优化策略,为您打造坚实可靠的Redis分布式…

Qt QProcess详解

1.简介 QProcess提供了在 Qt 应用程序中启动外部程序的方法。通过QProcess,你可以启动一个进程,与它通信(发送输入和读取输出),检查它的状态,以及等待它完成。这个类在执行系统命令、运行其他程序或脚本时…

铸铁试验平台和铸铁实验平台的主要区别在哪——北重制造厂家

铸铁试验平台和铸铁实验平台的主要区别在于其使用目的、实验内容和功能。 首先,铸铁试验平台主要用于铸铁工艺试验和工艺参数优化。通过模拟铸铁工艺过程,对不同工艺参数进行试验,从而得到最佳的铸铁工艺参数。铸铁试验平台一般具有温度控制、…

DL00295-基于AirSim仿真环境的无人机深度强化学习算法路径规划完整实现含详细说明文档

-创建了一个开放的AI Gym环境,包括多旋翼和固定翼无人机的运动学模型。 -提供了一些UE4环境来训练和测试深度强化学习DRL导航策略。 -基于AirSim和SB3。 完整代码链接见文末。 DL00295-基于AirSim仿真环境的无人机深度强化学习算法路径规划完整实现含详细说明文档

如何在前端项目中使用opencv.js | opencv.js入门

系列文章目录 如何在前端项目中使用opencv.js | opencv.js入门如何使用tensorflow.js实现面部特征点检测tensorflow.js 如何从 public 路径加载人脸特征点检测模型tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图tensorflow.js 使用 opencv.js 将人脸…

docker 部署最新版 MySQL 实战

文章目录 前言简介第一步:搜索并拉取镜像1.1 搜索镜像1.2 拉取MySQL镜像1.3 查看MySQL镜像 第二步:生成MySQL容器2.1 运行MySQL镜像2.2 查看运行容器 第三步:验证服务可用性3.1 关闭防火墙3.2 连接MySQL 总结 前言 请各大网友尊重本人原创知…

独家原创 | Matlab实现INFO-BiTCN-BiGRU-Attention多输入单输出回归预测

独家原创 | Matlab实现INFO-BiTCN-BiGRU-Attention多输入单输出回归预测 目录 独家原创 | Matlab实现INFO-BiTCN-BiGRU-Attention多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现INFO-BiTCN-BiGRU-Attention向量加权算法优化双向时间卷积…

蓝桥杯 迷宫(bfs)

0迷宫 - 蓝桥云课 (lanqiao.cn) 思路 : 最后一定要倒数输出路径,因为从前面输出你会找不到下一个到底是谁,bfs过程是找最小路径,最后输出是去找方向,但是此题作为一个填空题,我直接手写(开玩笑…

每日一题 — 将 x 减到 0 的最小操作数

思路: 题目要求是让我们从数组的最左端和最右端进行操作,这样的话解题的难度大大提升,我们可以用 正难则反 的思想: 题目中要求是减去数组中的数刚好等于X,我们可以转换成 数组中某一段的和等于 数组的总长减去X(sum -…

vue对比react18

1.模板语法-——>jsx JSX表达式用{}包裹&#xff0c;vue模板表达式用{{}}包裹&#xff0c;其余一致。 注意:if语句、switch语句、变量声明属于语句&#xff0c;不是表达式&#xff0c;不能出现在{}或{{}}中 <!--vue--> <template><div><p>I have…

Nessus【部署 02】Windows部署漏洞扫描工具Nessus详细过程分享(下载+安装+注册+激活)

这里写目录标题 1.下载安装1.1 下载1.2 安装 2.添加用户注册插件安装2.1 添加用户2.2 注册2.3 插件安装 3.安装总结 1.下载安装 1.1 下载 1.2 安装 双击Nessus-10.7.1-x64.msi进行安装 这个只能接受&#xff1a; 选择安装路径&#xff1a; 确认安装&#xff1a; 安装ing&…

图形学基础:二维三维刚体的移动、缩放和旋转矩阵

一、二维 1.1 缩放矩阵 x&#xff0c;y分别表示在x轴&#xff0c;y轴缩放的倍数 示例&#xff1a; 点(2,1)在x&#xff0c;y轴上分别缩放x倍&#xff0c;y倍 1.2 平移矩阵 x&#xff0c;y分表表示在x轴&#xff0c;y轴上移动的距离 示例&#xff1a;点&#xff08;2,1&#xf…

每日OJ题_BFS解决FloodFill④_力扣130. 被围绕的区域

目录 力扣130. 被围绕的区域 解析代码 力扣130. 被围绕的区域 130. 被围绕的区域 难度 中等 给你一个 m x n 的矩阵 board &#xff0c;由若干字符 X 和 O &#xff0c;找到所有被 X 围绕的区域&#xff0c;并将这些区域里所有的 O 用 X 填充。 示例 1&#xff1a; 输入&…

【MySQL】数据库节点的平滑扩容方案

一、背景 众所周知&#xff0c;数据库很容易成为应用系统的瓶颈。单机数据库的资源和处理能力有限&#xff0c;在高并发的分布式系统中&#xff0c;可采用分库分表突破单机局限。本文来探讨下数据库节点的平滑扩容方案 二、节点扩容 2.1、什么是节点扩容 扩容一般是指水平分…

test4122

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

Matlab 实时读取串口并绘图

Matlab 实时读取串口并绘图 Vofa Vofa 是一个很好的跨平台上位机软件&#xff0c;但是它无法保存数据&#xff0c;而且作者也并没有要继续更新的意思&#xff0c;保存数据功能应该是遥遥无期了。因此本文使用 Matlab 实时读取串口数据&#xff0c;并使用 plot 函数绘制。 vo…