springboot应用分库分表

2021-03-16  本文已影响0人  Lolipiza

业界公认MySQL单表容量在1千万或者或100G以下是最佳状态,一般mysql单机差不多1000QPS,因为这时它的BTREE索引树高在3~5之间。并且不到万不得已不用轻易使用分库分表,避免"过度设计"和"过早优化"。分库分表之前,不要为分而分,先尽力去做力所能及的事情,例如:升级硬件、升级网络、读写分离、索引优化等等。当数据量达到单表的瓶颈时候,再考虑分库分表。分库分表的中间件只是完成sql执行结果和未分库分表前一致,具体的分库分表操作只有自己操作。

对于技术选型来说,因为部门有组是使用Mycat做的,那就在这里用Mycat和ShardingSphere做一下比较:

Sharding-JDBC mycat
性能
应用场景限制 java应用
是否支持自定义sharding路由
最大支持sharding路由维度 2 1
分布式事务 支持 支持弱xa、支持XA分布式事务(1.6.5)
限制 不支持子语句,不支持UNION 和 UNION ALL,不支持批量插入,不支持DISTINCT聚合 详见《MYCAT权威指南》
是否开源

本文将使用ShardingSphere作为中间件,ShardingSphere包含三个重要的产品,ShardingJDBC、ShardingProxy和ShardingSidecar。其中sidecar是针对service mesh定位的一个分库分表插件,目前在规划中。ShardingJDBC是用来做客户端分库分表的产品,而ShardingProxy是用来做服务端分库分表的产品。
原因是它可以理解为增强版的JDBC驱动,旧代码迁移成本几乎为零,且:

Sharding-JDBC定位为轻量Java框架,使用客户端直连数据库,以jar包形式提供服务,无proxy代理层,无需额外部署,无其他依赖,DBA也无需改变原有的运维方式,harding-JDBC分片策略灵活,可支持等号、between、in等多维度分片,也可支持多分片键。SQL解析功能完善,支持聚合、分组、排序、limit、or等查询,并支持Binding Table以及笛卡尔积表查询,shardingjdbc的核心功能是数据分片和读写分离,通过ShardingJDBC,应用可以透明的使用JDBC访问已经分库分表、读写分离的多个数据源,而不用关心数据源的数量以及数据如何分布。

原理

1.架构:


image.png

每个JAVA应用包含Sharding-JDBC依赖,通过Sharding-JDBC操作数据库

2.Sharding-JDBC接收到sql语句后的操作:

image.png
sql语句经过词法解析拆成不可再分的原子符号(Token),再通过语法解析器被转为抽象语法树:
例如sqlselect id, name from t_user where status = 'ACTIVE' and age > 18会被分解为:
image.png
其中SQL路由的意思是经过解析后,确定在哪些数据库执行语句
例如接收一条sql查询语句select * from table where id in (1,2)会被路由为select * from table1 where id in (1,2)select * from table2 where id in (1,2)(只是举例,具体路由策略可配置)

最后将两个执行语句结果进行归并,归并方式有三种,分别是流式归并,内存归并和装饰着归并:


image.png

其中流式归并用得最多,方法原理如下:
例如需要将搜索结果进行从大到小排序,每个结果集一开始都会有个游标指向最大值
结果一:100,95,90
结果二:99,92,91

image.png

实践

说明一下,sharding-jdbc只是让查询的sql从多库多表中插入、更新、查询、删除等操作的结果和不分库分表一样,所涉及到的表和库都需要自己先手动创建好

1.依赖引入

<dependency>
    <groupId>io.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>3.1.0</version>
</dependency>
<dependency>
    <groupId>io.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-namespace</artifactId>
    <version>3.1.0</version>
</dependency>

2.应用配置

像这样一句sql,会分为两条执行:


image.png

https://zhuanlan.zhihu.com/p/146895071?utm_source=wechat_session
https://blog.csdn.net/roykingw/article/details/112538200

上一篇下一篇

猜你喜欢

热点阅读