本节开启sharding-jdbc的从分库分表入手,讲述sharding-jdbc如何完成分库分表。
(一)Sharding-JDBC分库分表概念
①垂直拆分
按照业务来进行拆分,将t_user和t_order拆分成了2个数据库
②水平拆分
根据数据量很大的表,进行分表分库的存储。
③逻辑表
一个数据量很大表,在一个表里存不下来,就存在了多个库中或者多个表中,相同逻辑和相同数据结构的总称。例:订单数据根据主键%2拆分成2个表,分表是t_order0、t_order1,它们的逻辑表名为t_order。
数据节点:数据分片的最小单元。由数据源名称和数据表组成,例如:ds0.order0
真实表:在分片的数据库总真实存在的物理表。即上个示例中的t_order0到t_order1
④真实表
在分片的数据库中真实存在的物理表。即上个示例中的t_order_0到t_order_9。
⑤数据节点
数据分片的最小单元。由数据源名称和数据表组成,例:ds_0.t_order_0。可分为均匀分布和自定义分布两种形式。
均匀分布指数据表在每个数据源内呈现均匀分布的态势。数据库主机的能力都是一样的。
ds$-{0..1}.t_order$-{0..1}
那么数据节点的配置如下:db0.t_order0,db0.t_order1,db1.t_order0,db1.t_order1
自定义分布指数据表呈现有特定规则的分布
那么数据节点的配置如下:db0.t_order0,db0.t_order1,db1.t_order2,db1.t_order3,db1.t_order4
ds0.t_order$-{0..1},ds0.t_order$-{2..4}
⑥分片策略
数据源分片、表分片仅是两个不同维度的分片,他们能用的分片策略规则是一样的,Sharding-JDBC中提供了常用的分片策略实现。分片策略由两部分构成:
分片健
分片算法
⑦分片策略配置
对于分片策略存有数据源分片策略和表分片策略两种维度。两种策略的API完全相同。
数据源分片策略:对应于DatabaseShardingStrategy。用于配置数据被分配的目标数据源。
表分片策略:对应于TableShardingStrategy。用于配置数据被分配的目标表,该目标表存在与该数据的目标数据源内。故表分片策略是依赖与数据源分片策略的结果的。
⑦分片策略
包含分片键和分片算法,由于分片算法的独立性,将其独立抽离。真正可用于分片操作的是分片键+分片算法,也就是分片策略。目前提供5种分片策略。
标准分片策略对应StandardShardingStrategy。提供对SQL语句中的=,IN和BETWEENAND的分片操作支持。StandardShardingStrategy只支持单分片键,提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。PreciseShardingAlgorithm是必选的,用于处理=和IN的分片。RangeShardingAlgorithm是可选的,用于处理BETWEENAND分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEENAND将按照全库路由处理。
复合分片策略对应ComplexShardingStrategy。复合分片策略。提供对SQL语句中的=,IN和BETWEENAND的分片操作支持。ComplexShardingStrategy支持多分片键,由于多分片键之间的关系复杂,因此并未进行过多的封装,而是直接将分片键值组合以及分片操作符透传至分片算法,完全由应用开发者实现,提供最大的灵活度。
行表达式分片策略对应InlineShardingStrategy。使用Groovy的表达式,提供对SQL语句中的=和IN的分片操作支持,只支持单分片键。对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的Java代码开发,如:tuser$-{u_id%8}表示t_user表根据u_id模8,而分成8张表,表名称为t_user_0到t_user_7。行表达式语法见下一节”行表达式语法说明“。
${begin..end}标识范围区间
${unit1,unit2,unit_x}标识枚举值
行表达式中如果出现连续多个${expression}或$-{expression}表达式,整个表达式最终是结果将会根据每个子表达式的结果进行笛卡尔组合。
Hint分片策略对应HintShardingStrategy。通过Hint而非SQL解析的方式分片的策略。对于分片字段非SQL,而由其他外置条件决定的场景,可使用SQLHint灵活的注入分片字段。例:内部系统,按照员工登录主键分库,而数据库总并无此字段。SQLHint支持通过JAVAAPI和SQL注释(待实现)两种方式使用。
不分片策略对应NoneShardingStrategy。不分片的策略。
可配置默认的数据源、数据源分片策略、表分片策略,主键生成方式
defaultDataSourceName
defaultDatabaseStrategy
defaultTableStrategy
defaultKeyGenerator
(二)springBoot策略演示
①数据分片和表分片演示
这2个mysql目前是独立的,并没有设置读写分离机制。
建立表t_orderorder0和order1跟t_order表的结构都是一样的,提前建立好
CREATETABLE`t_order`(`order_id`bigint(20)NOTNULL,`order_time`datetimeDEFAULTNULL,`customer_id`varchar()DEFAULTNULL,PRIMARYKEY(`order_id`));
按照上面的分库分表的策略,customer_id用于分库,order_id用于分表添加操作,customerId=,ds1这个库,也就是这个库中,orderid=也就是在t_order0这个表上。