ShardingSphere再回首
概念:
连接:通过协议 方言及库存储的适配,连接数据和应用,关注多模数据苦之间的合作
增量:抓取库入口流量题提供重定向, 流量变形(加密脱敏)/鉴权/治理(熔断限流)/分析等
可插拔:微内核
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一次查询时每个数据库所允许使用的最大连接数
准备阶段
结果集分组 执行单元执行两步
- sql路由结果按数据源的名称分组
- 获得在数据库实例在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判定 成功路由影子库 否路由生产库
相关文章:

ShardingSphere再回首
概念: 连接:通过协议 方言及库存储的适配,连接数据和应用,关注多模数据苦之间的合作 增量:抓取库入口流量题提供重定向, 流量变形(加密脱敏)/鉴权/治理(熔断限流)/分析等 可插拔:微内核 DDL:cr…...

第七篇:3.6 其他评估考虑/4.审计指南/5. 通用报告规范/6.披露指南、参考标准及其他 - IAB/MRC及《增强现实广告效果测量指南1.0》
翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效果测量定义和其他矩阵之- 3.1 广告印象(AD Impression)第三篇广告效果测量定义和其他矩阵之- 3.2 可见性 (Viewability)第四篇 …...

函数、指针和数组的相互运用(C语言)
1、函数指针数组 含义:数组的每个元素都是函数指针类型.eg: (此代码链接:http://t.csdnimg.cn/ClJmb.也可以在我发布博客中找到) 2、指向函数指针数组的指针 1、引入 3、回调函数 1、含义:就是一个通过…...

.Net Core/.Net 6/.Net 8,一个简易的消息队列
.Net Core/.Net 6/.Net 8,一个简易的消息队列 身份验证接口身份验证接口实现program.cs通过api调用 做着玩的, 只实现了消息入队出队功能,没有持久化,也没有其它任何高级功能 直接上代码 public class AMQBase//:ISingleton {/// <summary…...

OpenHarmony4.0分布式任务调度浅析
1 概述 OpenHarmony 分布式任务调度是一种基于分布式软总线、分布式数据管理、分布式 Profile 等技术特性的任务调度方式。它通过构建一种统一的分布式服务管理机制,包括服务发现、同步、注册和调用等环节,实现了对跨设备的应用进行远程启动、远程调用、…...

element-ui backtop 组件源码分享
今日简单分享 backtop 组件的源码实现,从以下三个方面: 1、backtop 组件页面结构 2、backtop 组件属性 3、backtop 组件事件 一、backtop 组件页面结构 二、backtop 组件属性 2.1 target 属性,触发滚动的对象,类型 string&am…...

MongoDB快照(LVM)业务场景应用实战
MongoDB和LVM快照概述 MongoDB的重要性:MongoDB支持的灵活的文档模型,使其成为处理大量分散数据的理想选择,特别是在需要快速迭代和频繁更改数据结构的应用中。 LVM(逻辑卷管理)快照技术基本概念:LVM允许…...

3D开发工具HOOPS:推动汽车行业CAD可视化发展
在最近的行业对话中,Tech Soft 3D(HOOPS厂商)的Jonathan Girroir和Actify的Peter West探讨了CAD可视化在当代企业中的重要性和挑战。作为CAD可视化领域的佼佼者,Actify通过其广受欢迎的Spinfire应用,赋能了全球40多个国…...

Centos安装MySQL提示公钥尚未安装
一、问题 在Centos7.9使用yum安装MySQL时出现错误,提示:mysql-community-server-5.7.44-1.el7.x86_64.rpm 的公钥尚未安装,如下图所示: 执行命令:systemctl start mysqld也提示错误:Failed to start mysq…...

FebHost:英国.UK域名简介
.UK域名是互联网上最广为人知且广泛使用的国家代码顶级域名之一。作为英国官方的国家代码,自诞生之日起,.UK域名对英国本土个人、企业及在线品牌建设扮演了关键角色。 .UK域名于1985年首次推出,这是早期为创建有序域名系统而努力的一部分。当…...

SQL Serve---查询
概要 1、order by子句 —默认asc(升序)、desc(降序) 2、distinct关键字 3、group by子句 4、聚合函数 —max()、min()、sum()、avg()、count() 5、having子句 6、compute子句 英文关键字 order by 排序 asc…...

RabbitMQ3.13.x之十一_RabbitMQ中修改用户密码及角色tags
RabbitMQ3.13.x之十一_RabbitMQ中修改用户密码及角色tgs 文章目录 RabbitMQ3.13.x之十一_RabbitMQ中修改用户密码及角色tgs1. 修改用户的密码1. 修改密码语法2. 修改案例 2.修改角色tags1. 修改标签(tags)语法2. 修改案例 可以使用 RabbitMQ 的命令行工具 rabbitmqctl 来修改用…...

Taro打包生成不同目录
使用taro init创建taro项目时,taro默认打包目录是: /config/index.js outputRoot:dist默认的目录,编译不同平台代码时就会覆盖掉,为了达到多端同步调试的目的,这时需要修改默认生成目录了,通过查看官方文…...

2024-04-08 NO.5 Quest3 手势追踪进行 UI 交互
文章目录 1 玩家配置2 物体配置3 添加视觉效果4 添加文字5 其他操作5.1 双面渲染5.2 替换图片 在开始操作前,我们导入先前配置好的预制体 MyOVRCameraRig,相关介绍在 《2024-04-03 NO.4 Quest3 手势追踪抓取物体-CSDN博客》 文章中。 1 玩家配置 &a…...

PaddleDetection 项目使用说明
PaddleDetection 项目使用说明 PaddleDetection 项目使用说明数据集处理相关模块环境搭建 PaddleDetection 项目使用说明 https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.7/configs/ppyoloe/README_cn.md 自己项目: https://download.csdn.net/d…...

leetcode解题思路分析(一百五十五)1352 - 1358 题
最后 K 个数的乘积 请你实现一个「数字乘积类」ProductOfNumbers,要求支持下述两种方法: add(int num) 将数字 num 添加到当前数字列表的最后面。 getProduct(int k) 返回当前数字列表中,最后 k 个数字的乘积。 你可以假设当前列表中始终 至少…...

如何将普通maven项目转为maven-web项目
文件-项目结构(File-->Project Structure ) 模块-->learn(moudle-->learn) 选中需要添加web的moudle,点击加号,我得是learn,单击选中后进行下如图操作: 编辑路径 结果如下…...

LeetCode 226. 翻转二叉树
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 示例 2: 输入:root [2,1,3] 输出:[2,3,1] 示例…...

【ArcGIS Pro二次开发】(85):Aspose.Cells中的Excel操作
Aspose.Cells是一款功能强大的Excel文档处理和转换控件,开发人员和客户电脑无需安装Microsoft Excel也能在应用程序中实现类似Excel的强大数据管理功能。 1、获取工作薄Workbook string excelFile "C:\Users\Administrator\Desktop\FE.xlsx"; Workbook …...

基于java+springboot+vue实现的兴顺物流管理系统(文末源码+Lw)23-287
摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,货运信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广…...

pytorch view、expand、transpose、permute、reshape、repeat、repeat_interleave
非contiguous操作 There are a few operations on Tensors in PyTorch that do not change the contents of a tensor, but change the way the data is organized. These operations include: narrow(), view(), expand() and transpose() permute() This is where the con…...

uni-app实现下拉刷新
业务逻辑如下: 1.在滚动容器中加入refresher-enabled属性,表示为开启下拉刷新 2.监听事件,添加refresherrefresh事件 3.在事件监听函数中加载数据 4.关闭动画,添加refresher-triggered属性,在数据请求前开启刷新动画…...

vue ts 应用梳理
文章目录 前言一、页面传值1.1 [props](https://cn.vuejs.org/guide/components/props.html)1.2 [emit](https://cn.vuejs.org/guide/components/events.html)1.3 [store](https://pinia.vuejs.org/zh/getting-started.html) 二、实时计算2.1 [watch](https://cn.vuejs.org/gui…...

CUDA12.4文档-全文翻译
本博客参考官方文档进行介绍,全网仅此一家进行中文翻译,走过路过不要错过。 官方网址:https://docs.nvidia.com/cuda/cuda-c-programming-guide/ 本文档分成多个博客进行介绍,在本人专栏中含有所有内容: https://blog.csdn.net/qq_33345365/category_12610860.html CU…...

【C 数据结构】循环链表
文章目录 【 1. 基本原理 】【 2. 循环链表的创建 】2.1 循环链表结点设计2.2 循环单链表初始化 【 3. 循环链表的 插入 】【 4. 循环单链表的 删除操作 】【 5. 循环单链表的遍历 】【 6. 实例 - 循环链表的 增删查改 】【 7. 双向循环链表 】 【 1. 基本原理 】 对于单链表以…...

Python列表
使用场景:列表是用来存储多组数据的 列表是可变类型 列表支持切片 1.基本规则 1.列表使用[]来表示 2.初始化列表:list [] 3.列表可以一次性存储多个数据:[数据1,数据2,数据3,…] 4.列表中的每一项&#…...

谈谈系列之金融直播展业畅想
近些年直播异常火热,对于各大中小型基金证券公司,也纷纷引入直播作为新型展业渠道。在这其中有一部分直接采用第三方云平台,也有少部分选择自建直播平台。当然自建直播平台也不是纯自研,大抵都是外购第三方厂商整体解决方案&#…...

【C 数据结构】双向链表
文章目录 【 1. 基本原理 】【 2. 双向链表的 创建 】实例 - 输出双向链表 【 3. 双向链表 添加节点 】【 4. 双向链表 删除节点 】【 5. 双向链表查找节点 】【 7. 双向链表更改节点 】【 8. 实例 - 双向链表的 增删查改 】 【 1. 基本原理 】 表中各节点中都只包含一个指针&…...

Leetcode刷题之消失的数字(C语言版)
Leetcode刷题之消失的数字(C语言版) 一、题目描述二、题目解析 一、题目描述 数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗? 注意:本题相对书上原题稍作…...

LeetCode654:最大二叉树
题目描述 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums 构建的 …...