SHARDINGSPHERE,ShardingSphereJDBC
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范围时才不会报错
写这篇文章前,找了很多的资料都没有说自定义接口的每个方法的作用,完全是靠试出来的,官方文档写的对新手太不友好了,很多文档都得靠一个个目录去翻,东西确实不多,但是很多示例不写就很浪费时间自己去琢磨
分片策略可以看下面文章了解