ShardingSphere系列(二) 分片策略

本文章适用于初学者demo;或概念理解中策略都在git中打好了tag想要学习那种策略仔细阅读redme即可;

具体代码与明细见:https://github.com/ssy-githup/shardingjdbc

1.1 标准策略:

对应算法:精确分片算法,范围分片算法;提供sql语句中的=,IN和BETWEEN AND 的分片操作支持,只支持单分片键

1.2 复合策略

对应算法:复和分片算法

对应算法:精确分片算法,范围分片算法;提供sql语句中的=,IN和BETWEEN AND 的分片操作支持,支持多分片键

1.3 行表达式策略

使用Groovy的表达式,提供对sql语句中的=和in的分片操作支持,只支持单分片键

1.4 Hint策略

对应算法:hint分片算法

通过Hint而非SQL解析的方式分片的策略

分片策略

io.shardingsphere.core.routing.strategy.none.NoneShardingStrategy

分片算法:ShardingAlgorithm

io.shardingsphere.api.algorithm.sharding.standard.PreciseShardingAlgorithm

io.shardingsphere.api.algorithm.sharding.standard.RangeShardingAlgorithm

io.shardingsphere.api.algorithm.sharding.complex.ComplexKeysShardingAlgorithm

io.shardingsphere.api.algorithm.sharding.hint.HintShardingAlgorithm

2.1行表达式分片(Inline)

对应InlineShardingStrategy。使用Groovy的表达式,提供对SQL语句中的=和IN的分片操作支持,只支持单分片键。对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的Java代码开发

2.2 标准分片(Standard)

StandardShardingStrategy只支持单分片键,提供:

PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。

PreciseShardingAlgorithm是必选的,用于处理=和IN的分片。RangeShardingAlgorithm是可选的,用于处理BETWEEN AND分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND将按照全库路由处理。

2.3 复合分片(Complex)

ComplexShardingStrategy支持多分片键,由于多分片键之间的关系复杂,因此并未进行过多的封装,而是直接将分片键值组合以及分片操作符透传至分片算法,完全由应用开发者实现,提供最大的灵活度。

2.4 Hint强制路由(Hint)

Hint分片指的是对于分片字段非SQL决定,而由其他外置条件决定的场景,可使用SQL Hint灵活的注入分片字段。

有些SQL语句比较复杂比如说有(a = var or b = var) and member_id = N,这个时候druid sqlparser并不支持的时候,虽然可以通过多数据源解决,但是我们不希望架构搞得太复杂,这种情况下,可以通过sharding-jdbc的Hint分片策略来实现各种sharding-jdbc不支持的语法的限制。

因为Hint分片策略是绕过SQL解析的,所以对于这些比较复杂的需要分片的查询,采用Hint分片策略性能可能会更好。

hint策略需要实现:io.shardingjdbc.core.api.algorithm.sharding.hint.HintShardingAlgorithm接口。

通过解析SQL语句提取分片键列与值并进行分片是ShardingSphere对SQL零侵入的实现方式。若SQL语句中没有分片条件,则无法进行分片,需要全路由。

3. 读写分离

shardingSphere不像mycat一样完全不侵入项目,使用此种方式需要修改配置文件

# 分库配置
# 读写分离配置
sharding.jdbc.config.masterslave.name=dataSource
sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robin
#配置master的数据源名称
sharding.jdbc.config.masterslave.master-data-source-name=master
#配置slave的数据源名称
sharding.jdbc.config.masterslave.slave-data-source-names=slave

# 打印SQL
sharding.jdbc.config.props.sql.show=true

 

你可能感兴趣的:(sharding-jdbc)