一、ShardingSphere概念
ShardingSphere包含三个重要的产品,ShardingJDBC、ShardingProxy和ShardingSidecar。其中sidecar是针对service mesh定位的一个分库分表插件,目前在规划中;ShardingJDBC是用来做客户端分库分表的产品;而ShardingProxy是用来做服务端分库分表的产品
1、ShardingJDBC
shardingJDBC定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。它使⽤客户端直连数据库,以 jar 包形式提供服务,⽆需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。ShardingJDBC对代码的入侵性比较大,并且sql书写的局限性也很大。
2、ShardingProxy
ShardingProxy定位为透明化的数据库代理端,提供封装了数据库⼆进制协议的服务端版本,⽤于完成对异构语⾔的⽀持。⽬前提供 MySQL 和 PostgreSQL 版本,它可以使⽤任何兼容 MySQL/PostgreSQL 协议的访问客⼾端。ShardingProxy是一个独立部署的服务,类似于MyCat。这意味着分片规则需要提前订好,灵活性降低了。
3、ShardingJDBC、ShardingProxy区别
很显然,ShardingJDBC只是客户端的一个工具包,可以理解为一个特殊的JDBC驱动包,所有分库分表逻辑均由业务方自己控制,所以他的功能相对灵活,支持的数据库也非常多,但是对业务侵入大,需要业务方自己定制所有的分库分表逻辑。
而ShardingProxy是一个独立部署的服务,对业务方无侵入,业务方可以像用一个普通的MySQL服务一样进行数据交互,基本上感觉不到后端分库分表逻辑的存在,但是这也意味着功能会比较固定,能够支持的数据库也比较少。这两者各有优劣。
一般情况下,如果如数据量非常大,可以选择如下处理方式
1、如果是关系性较强的热点数据量较大(这些数据最好存在mysql这些关系型数据库中),先从缓存技术着手降低对数据库的访问压力;不行可以考虑数据库读写分离策略;如果读写分离后数据库压力依然非常大,且业务数据持续增长无法估量,最后才考虑分库分表(分库分表后sql功能会大大削弱,能不用就不用)
2、如果是关系性较弱的其他数据量较大,可以采取另外的一些分布式存储产品。例如PostGreSQL、VoltDB甚至HBase、Hive、ES等这些大数据组件来存储
二、实战
代码gitee仓库地址:https://gitee.com/tuojihu/sharding-sphere-demo
代码资源地址:https://download.csdn.net/download/qq_38639813/86838262
代码说明
1、配置文件01到05对应了ShardingJDBC不同的使用方式,分别是分表、分库分表、广播表、绑定表、读写分离。使用时将文件内容覆盖到application.properties中便可。
2、sql中是表的创建语句,在对应的数据库中执行便可。数据库名字在配置文件里有
3、algorithm中对应的是配置文件中所需要的的算法类
4、结合测试用例和配置文件说明便可自行尝试,不再赘述
详情参考:https://blog.csdn.net/qq_43631716/article/details/120300608
读写分离配置后直接可以做到写主、读从。但是数据库间的主从同步还是得靠数据库本身的二进制文件
三、分片策略
分片策略既适用于表、也适用于库。使用时表和库的分片策略可以自由搭配,不见得必须一样。总之就一个前提:合理的设置分片键,尽可能在增删改查时别操作所有表
1、NoneShardingStrategy
不分片。这种严格来说不算是一种分片策略了。只是ShardingSphere也提供了这么一个配置。
2、InlineShardingStrategy
最基础的策略、只支持普通的查询和排序。写分片表达式就可
配置参数:
inline.shardingColumn :分片键
inline.algorithmExpression: 分片表达式
实现方式:
按照分片表达式来进行分片。
3、StandardShardingStrategy
可支持范围查询,但查询条件若不是分片键或没有查询条件,则查所有表。需要定制具体的分片算法类
配置参数:
standard.sharding-column :分片键
standard.precise-algorithm-class-name: 精确分片算法类名;
standard.range-algorithm-class-name :范围分片算法类名
实现方式:
shardingColumn指定分片算法。
preciseAlgorithmClassName 指向一个实现了io.shardingsphere.api.algorithm.sharding.standard.PreciseShardingAlgorithm接口的java类名,提供按照 = 或者 IN 逻辑的精确分片 示例:com.jihu.sharding.algorithm.MyPreciseShardingAlgorithm
rangeAlgorithmClassName 指向一个实现了 io.shardingsphere.api.algorithm.sharding.standard.RangeShardingAlgorithm接口的java类名,提供按照Between 条件进行的范围分片。示例:com.jihu.sharding.algorithm.MyRangeShardingAlgorithm
说明:
其中精确分片算法是必须提供的,而范围分片算法则是可选的。
4、ComplexShardingStrategy
支持范围查询,并支持多分片键的复杂分片策略,因为可以制定多个分片键,所以在条件查询时可以避免查所有表。但是因为指定了多分片键,而每个分片键计算后对应的库、表未必一样,所以程序很难确定出插入那个表,插入可能会报错。需要定制具体的分片算法类
配置参数:
complex.sharding-columns : 分片键(多个)
complex.algorithm-class-name : 分片算法实现类
实现方式:
shardingColumn指定多个分片列。
algorithmClassName指向一个实现了org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingAlgorithm接口的java类名。提供按照多个分片列进行综合分片的算法。示例:com.jihu.sharding.algorithm.MyComplexKeysShardingAlgorithm
5、HintShardingStrategy
操作时可以指定具体的库、表。无需分片键,只需定制具体的分片算法类
配置参数:
hint.algorithm-class-name: 分片算法实现类
实现方式:
algorithmClassName指向一个实现了org.apache.shardingsphere.api.sharding.hint.HintShardingAlgorithm接口的java类名。 示例:com.jihu.sharding.algorithm.MyHintShardingAlgorithm
在这个算法类中,同样是需要分片键的。而分片键的指定是通过HintManager.addDatabaseShardingValue方法(分库)和HintManager.addTableShardingValue(分表)来指定。
使用时要注意,这个分片键是线程隔离的,只在当前线程有效,所以通常建议使用之后立即关闭,或者用try资源方式打开。
参考文档:https://blog.csdn.net/qq_43631716/article/details/120300608