当前位置: 首页 > news >正文

ShardingSphere 内核工作原理

文章目录

    • 内核工作原理
      • 配置管控
      • 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场景。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 极简聊天室-websocket版(双向通信)
  • 数据科学家必须掌握的12个Python功能
  • pxe自动安装linux
  • 虚拟机连接xshell的三种方式
  • ReentrantLock的阻塞性、可中断性
  • 捉虫笔记(二)之 杀软请你自重点
  • Python 基础教程:List(列表)的使用
  • .NET周刊【7月第4期 2024-07-28】
  • LabVIEW在DCS中的优势
  • 代码随想录训练营第五十二天 孤岛的总面积
  • 12 - FFmpeg 编码 H264
  • 前端Web-JavaScript(上)
  • P10838 『FLA - I』庭中有奇树
  • 人工智能时代,程序员如何保持核心竞争力?
  • “艺启创作 智绘未来”AI漫画创意大赛,燃动国漫新纪元!
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Apache的基本使用
  • C++类的相互关联
  • CSS相对定位
  • docker-consul
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • JSDuck 与 AngularJS 融合技巧
  • JS数组方法汇总
  • Laravel Mix运行时关于es2015报错解决方案
  • Webpack 4 学习01(基础配置)
  • 动态规划入门(以爬楼梯为例)
  • 小而合理的前端理论:rscss和rsjs
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • # Kafka_深入探秘者(2):kafka 生产者
  • #FPGA(基础知识)
  • #每天一道面试题# 什么是MySQL的回表查询
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (2)MFC+openGL单文档框架glFrame
  • (day 12)JavaScript学习笔记(数组3)
  • (笔试题)分解质因式
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (三十五)大数据实战——Superset可视化平台搭建
  • (算法)N皇后问题
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (转载)hibernate缓存
  • .Net 4.0并行库实用性演练
  • .net core docker部署教程和细节问题
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .NET面试题(二)
  • .Net中wcf服务生成及调用
  • @ModelAttribute使用详解
  • [20150321]索引空块的问题.txt
  • [20190113]四校联考
  • [android] 看博客学习hashCode()和equals()