- 分库分表概念
- 五种分片策略
- 数据分片
1 分库分表概念
- 数据节点
- 分片策略
- 绑定表
- 广播表
1.1 数据节点
数据分片的最小单元。由数据源名称和数据表组成,例:ds0.t_order0。
tables:
t_order:
actualDataNodes:ds$->{0..1}.t_order$->{0..1}
1.1.1 两种数据节点分布说明
均匀分布:数据源能力均衡
- db0
- t_order0
- t_order1
- db1
- t_order0
- t_order1
#配置说明
db0.t_order0,db0.t_order1,db1.t_order0,db1.t_order1
db$->{0..1}.t_order$->{0..1}
自定义分布:数据源能力不均
- db0
- t_order0
- t_order1
- db1
- t_order2
- t_order3
- t_order4
#配置说明
db0.t_order0,db0.t_order1,db1.t_order2,db1.t_order3,db1.t_order4
db0.t_order$->{0..1},db1.t_order$->{2..4}
1.2分片策略
数据源分片、表分片仅是两个不同维度的分片,他们能用的分片策略规则是一样的。
Sharding-JDBC中提供了常用的分片策略实现,分片策略由两部分构成:分片键和分片算法
sharding.jdbc.config.sharding:
table:
t_order:
actualDataNode:ds$->{0..1}.t_order$->{0..1}
databaseStrategy:
inline:
shardingColumn:user_id
algorithmInlineExpression:ds$->{user_id%2}
tableStrategy:
inline:
shardingColumn:order_id
algorithmInlineExpression:t_order$->{order_id%2}
1.3 绑定表
指分片规则一致的主表和子表。例如:t_order表和t_order_item表,均按照order_id分片,则此两张表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。
shardingRule:
tables:
t_order
actualDataNodes:ds${0..1}.t_order${0..1}
tableStrategy:
inline:
shardingColumn:order_id
algorithmExpression:t_order${order_id%2}
keyGenerator:
column:order_id
t_order_item:
actualDataNodes:ds${0..1}.t_order_item${0..1}
tableStrategy:
inline:
shardingColumn:order_id
algorithmExpression:t_order_item${order_id%2}
bindingTables:
-t_order,t_order_item
1.4 广播表
指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中都完全一致。适用于数据量不大且需要与海量数据的表进行关联查询的场景,例如:字段表。
shardingRule:
broadcastTables:
-t_config
2 五种分片策略
- none不分片策略
- inline行表达式分片策略(须掌握)
- standard标准分片策略(了解)
- complex复合分片策略(了解)
- hint分片策略(了解)
2.1 none不分片策略
对应NoneShardingStrategy,不分片策略,SQL会被发给所有节点去执行,这个规则没有子项目可以配置。
2.2 inline行表达式分片策略(须掌握)
对应InlineShardingStrategy。使用Groovy的表达式,提供对SQL语句的=和IN的分片操作支持,只支持单分片键。对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的Java代码开发,如:t_user_$->{u_id % 8}表示t_user表根据u_id模8,而分成8张表,表名称为t_user_0到t_user_7。
databaseStrategy:
inline:
shardingColumn:user_id
algorithmInlineExpression:ds${user_id%2}
行表达式语法
- ${begin…end}表示范围区间
- ${unit1, unit2, unit_x}表示枚举值
- 行表达式中如果出现连续多个${expression}或$->{expression}表达式,整个表达式最终的结果将会根据每个子表达式的结果进行笛卡尔组合。
2.3 standard标准分片策略(了解)
- 对应StandardShardingStrategy。提供对SQL语句中的=,IN和BETWEEN AND的分片操作支持
- StandardShardingStrategy只支持单分片键,提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法
- PreciseShardingAlgorithm是必选的,用于处理=和IN的分片
- RangeShardingAlgorithm是可选的,用于处理BETWEEN AND分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND将按照全库路由处理
databaseStrategy:
standard:#单列sharding算法,需要配合对应的preciseShardingAlgorithm,rangeShardingAlgorithm接口的实现使用
shardingColumn:#列名,允许单列
preciseShardingAlgorithm:#preciseShardingAlgorithm接口的实现类
rangeShardingAlgorithm:#rangeShardingAlgorithm接口的实现类
2.4 complex复合分片策略(了解)
- 对应ComplexShardingStrategy。复合分片策略提供对SQL语句中的=,IN和BETWEEN AND的分片操作支持
- ComplexShardingStrategy支持多分片键,由于多分片键之间的关系复杂,因此并未进行过多的封装,而是直接将分片键值组合以及分片操作符传至分片算法,完全由应用开发者实现,提供最大的灵活度。
databaseStrategy:
complex:#支持多列的sharding,目前无生产可用实现
shardingColumn:#逗号切割的列
shardingAlgorithm:#ComplexKeysShardingAlgorithm接口的实现类
2.5 hint分片策略(了解)
- 对应HintShardingStrategy,通过Hint而非SQL解析的分片方式
- 对于分片字段非SQL决定,而由其他外置条件决定的场景,可使用SQL Hint灵活的注入分片字段。例:内部系统,按照员工登录主键分库,而数据库中并无此字段。SQL Hint支持通过Java API和SQL注释(待实现)两种方式使用。
databaseStrategy:
hint:#基于标记的sharding分片
shardingAlgorithm:#HintShardingAlgorithm接口的实现,目前代码中,有为测试目的实现的OrderDatabaseHintShardingAlgorithm可参考。
3 数据分片
3.1 配置默认数据源、分片策略
可配置默认的数据源、数据分片策略、表分片策略
shardingRule:
tables:
bindingTables:
t_order,t_order_item
broadcastTables:
t_config
defaultDataSourceName:ds0
defaultDatabaseStrategy:
inline:
shardingColumn:user_id
algorithmExpression:ds${user_id%2}
defaultTableStrategy:
none:
defaultKeyGenarator:
type:SNOWFLAKE
3.2 分布式主键
ShardingSphere提供灵活的分布式主键生成策略。
在分片规则配置模块可配置每个表的主键生成策略,默认使用雪花算法(snowflake)生成64bit的长整形数据。
当前提供了snowflake、uuid两种可用方式。
shardingRule:
tables:
t_order:
actualDataNodes:ms_ds${0..1}.t_order${0..1}
tableStrategy:
inline:
shardingColumn:order_id
algorithmExpression:t_order${order_id%2}
keyGeneratorColumnName:order_id
keyGeneratorClassName:xxx.xxx.XXclass
defaultKeyGenerator:
type:SNOWFLAKE
配置说明
defaultkeyGenarator:#默认的主键生成算法,如果没有设置,默认为snowflake算法
column:#自增键对应的列名称
type:#自增键的类型,主要用于调用内置的主键生成算法,有三个可用值:snowflake(时间戳+worker.id+自增id),uuid(java.util.UUID类生成的随机UUID),leaf,其中snowflake算法与uuid算法已经实现
props:#定制算法需要设置的参数,比如snowflake算法的worker.id与max.tolerate.time.difference.milliseconds
3.3 Sharding-JDBC数据分片及读写分离
shardingRule:
masterSlaveRules:
ms_ds0:
masterDataSourceName:ds0
slaveDataSourceNames:
-ds0_slave0
-ds0_slave1
loadBalanceAlgorithmType:ROUND_ROBIN
ms_ds1:
masterDataSourceName:ds1
slaveDataSourceName:
-ds1_slave0
-ds1_slave1
loadBalanceAlgorithmType:ROUND_ROBIN
参考文章
结语
本人所有博客仅用于学习记录,不做任何商业用途,如涉及侵权,还请联系删除,感谢阅读,欢迎留言,一起进步~