SHARDINGSPHERE,ShardingSphereJDBC

http://www.itjxue.com  2023-01-23 10:05  来源:未知  点击次数: 

sharding-sphere之SQL解析select

以mysql为例,先看一下sql的写法: 官网地址: 请点击我

sql关联查询的格式如下:

结果集合并:

sql的解析过程如官方文档sql写法解析过程一直,流程图如下:

举个例子:以mysql的查询sql为例,看看语法解析器的解析过程:

sql语法解析器的解析过程,获取 MySQLSelectParser ,并解析。和上一篇 insert 都一致。

在 MySQLSelectParser 的解析过程中,首先会解析sql,归并子查询,组装返回的statement,具体过程参照文章上方图,按照官方sql写法,一步一步解析,最终解析完成。

接下来一个一个看看,到底分别都是如何解析的

如果sql中有distinct,或者distinctrow,则抛异常,不支持该语句

跳过HIGH_PRIORITY,STRAIGHT_JOIN,SQL_BIG_RESULT,SQL_SMALL_RESULT,SQL_BIG_RESULT,SQL_BUFFER_RESULT,SQL_CACHE,SQL_NO_CACHE,SQL_CALC_FOUND_ROWS关键字。

选项之间 , 隔开,直到解析最后一个分词不是,结束,循坏处理。

在解释分词的时候,跳过其他的关键字,然后判断是否是 * ,或者 MAX,MIN,SUM,AVG,COUNT 函数,或者是普通返回字段,按照不同格式解析。

解析带 * 的语句逻辑,个人理解,组装StarSelectItem即可,有些逻辑不太了解,后续再更。

处理MAX,MIN,SUM,AVG,COUNT函数的逻辑如下:

根据.,()做不同的处理逻辑,解析别名,返回分词组装SelectItem。

再具体解析时,首先会获取第一分词,然后看下一个分词是不是 . ,如果是 . ,则第一分词是schema的名称,下一分词为表名称,不然第一分词是表名称。

在解析join语句时,首先判断是否是join子查询,如果是,则不支持。

在判断join结束的时候,实质是跳过 on 分词,解析on table1.a=table2.b这样的语句,分析前一个表达式和第二个表达式。

表关联结束之后,整个from语句就解析完成了,接下来的就是where语句了。

按照,分割,一个一个解析处理

不支持UNION,INTERSECT,MINUS,EXCEPT

以一下sql为例:

解析结果如图:

fyi

干货满满:基于ShardingSphere实现动态数据源

在互联网公司中,或者大型应用系统中,我们作为开发人员通常需要面对海量的数据,这些海量数据通常都是百万级,千万级的数据量。而且这些海量数据对企业和用户来说都是至关重要的。面对如此海量的数据,我们需要保证数据的安全可靠;当保存数据的时候数据不能丢失,当查询数据的时候,需要保证数据的及时响应。

那么,如何保证这些海量数据的安全可靠,以及实时查询呢?

当然,这里肯定会有很多解决方案。在当下大数据时代,出现了很多比较友好的解决方案和框架可以解决这个问题。例如:Elasticsearch,Hadoop等,都是现在比较流行的框架。

目前,大多数企业应用系统中的数据应该都是结构化的,也就是这些海量数据存储在关系型数据库中,例如:Mysql,Oracle等。而且Mysql关系型数据库一般都是初创企业或者中小企业的首选。那么Mysql如何承载百万级,千万级的数据呢?根据阿里巴巴的开发守则,建议Mysql的数据表容量不要超过500万条数据记录,也就说建议在500万条数据记录的时候做一次分表。针对Mysql的分库分表已经存在很多成熟,开源的解决方案和框架,例如:Mycat,ShardingSphere等。

但是,在大多数业务场景中Mysql的一个库会有很多表,数据量大的,需要及时响应查询的数据表可能就那么几张,例如:订单表数据量比较大,配置表数据量比较小;我们需要对数据量比较大的订单表进行分库分表操作,配置表可以不需要分库分表。也就是说我们需要对部分表进行分库分表,部分表不进行分库分表。那么我们可以考虑使用ShardingSphere的动态数据源,对需要分库分表的数据我们把正确的数据源路由到正确的库上,把不需要分库分表的表路由到默认的数据库。

下面我们以SpringBoot为例把详细的实践过程记录下来,方便以后查阅。

引入ShardingSphere的maven dependency,采用4.0.0版本

配置多数据源

说明如下:

多数据源配置类

说明如下:

下面配置SpringBoot的数据源

说明如下:

下面是我们自定义的分片算法CustomShardingAlgorithm类

说明如下:

通过以上配置和自定义分片算法,借助ShardingSphere框架我们已经实现了通过携带分片键的增删改查sql语句动态路由数据源。如果操作我们需要分库分表的sql语句没用携带分片键,ShardingSphere会报错并且在日志信息中会看到对应的错误信息。

当然除过ShardingSphere能够实现动态数据源,其他框架或者方式也可以实现,例如:Spring AOP切面,拦截器也可以实现。那么就是仁者见仁,智者见智了。

参考资料:

shardingshpere-jdbc读写分离实现5.0.0-alpha

【java实现版本】

1、nacos配置:

2、pom文件

3、在对应包下面新加一个config文件。

4、插入或更新后立即查询,请在查询前面执行

// 强制到主库进行查询,用于新增或者更新后立即查询

HintManager.getInstance().setPrimaryRouteOnly();

5、shardingsphere-jdbc只负责读写分离,其中的主从同步需要使用原生mysql主从同步机制。

【nacos配置实现版本】

1.nacos配置

2、pom文件

3、插入或更新后立即查询,请在查询前面执行

// 强制到主库进行查询,用于新增或者更新后立即查询

HintManager.getInstance().setPrimaryRouteOnly();

4、shardingsphere-jdbc只负责读写分离,其中的主从同步需要使用原生mysql主从同步机制。

ShardingSphere-Proxy5.1.0搭建及自定义算法编写

官方的文档

新建Maven工程

pom.xml添加以下依赖

实现 ShardingAlgorithm 接口定义的算法实现类。

新建类ShardingDatabaseModuloAlgorithm实现StandardShardingAlgorithm接口

在项目 resources 目录下创建 META-INF/services 目录。

在 META-INF/services 目录下新建文件 org.apache.shardingsphere.sharding.spi.ShardingAlgorithm

将实现类的绝对路径写入至文件 org.apache.shardingsphere.sharding.spi.ShardingAlgorithm

打包成jar包

上传至/opt/module/shardingsphere-5.1.0-bin/ext-lib

官方说明

ShardingSphere-Proxy 支持多逻辑数据源,每个以 config- 前缀命名的 YAML 配置文件,即为一个逻辑数据源。

在 /opt/module/shardingsphere-5.1.0-bin/conf 中新建一个文件config-sharding-orders.yaml

修改 /opt/module/shardingsphere-5.1.0-bin/conf 下的 server.yaml

运行 /opt/module/shardingsphere-5.1.0-bin/bin 下的 start.sh

使用MYSQL客户端连接试试

成功

例如:

预览实际 SQL

语法: PREVIEW SQL

SQL语句: PREVIEW SELECT * FROM t_order

设置属性值

语法: SET VARIABLE proxy_property_name = xx

SQL语句: SET VARIABLE sql_show = true 设置sql写入到日志

查询所有属性

SHOW ALL VARIABLES

查询单个属性

SHOW VARIABLE sql_show

查看当前模式

SHOW INSTANCE MODE

例如:StandardShardingAlgorithmLong

当SQL语句为

会报异常 java.lang.integer cannot be cast to java.lang.long

只有数值超过Integer范围时才不会报错

写这篇文章前,找了很多的资料都没有说自定义接口的每个方法的作用,完全是靠试出来的,官方文档写的对新手太不友好了,很多文档都得靠一个个目录去翻,东西确实不多,但是很多示例不写就很浪费时间自己去琢磨

分片策略可以看下面文章了解

(责任编辑:IT教学网)

更多

相关linux服务器文章

推荐linux服务器文章