分库分表-sharding jdbc

ShardingSphere官网

1. 分片核心概念

在我们用 Sharding-JDBC 之前,有一些核心概念是必须掌握的。

可以查看官网文档,很详细。

逻辑表

水平拆分的数据库(表)的相同逻辑和数据结构表的总称。例:订单数据根据主键尾数拆分为 10 张表,分别是 t_order_0t_order_9,他们的逻辑表名为 t_order

真实表(物理表)

在分片的数据库中真实存在的物理表。即上个示例中的 t_order_0t_order_9

数据节点

数据分片的最小单元。由数据源名称和数据表组成,例:ds_0.t_order_0

绑定表(ER表)

指分片规则一致的主表和子表。例如:t_order 表和 t_order_item 表,均按照 order_id 分片,则此两张表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。

广播表(全局表)

指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全一致。适用于数据量不大且需要与海量数据的表进行关联查询的场景,例如:字典表。

1.1 分片算法

通过分片算法将数据分片,支持通过 =>=<=><BETWEENIN 分片。 分片算法需要应用方开发者自行实现,可实现的灵活度非常高。

目前提供4种分片算法。 由于分片算法和业务实现紧密相关,因此并未提供内置分片算法,而是通过分片策略将各种场景提炼出来,提供更高层级的抽象,并提供接口让应用开发者自行实现分片算法。

  • 标准分片算法

对应 StandardShardingAlgorithm,用于处理使用单一键作为分片键的 =INBETWEEN AND><>=<=进行分片的场景。需要配合 StandardShardingStrategy 使用。

  • 复合分片算法

对应 ComplexKeysShardingAlgorithm,用于处理使用多键作为分片键进行分片的场景,包含多个分片键的逻辑较复杂,需要应用开发者自行处理其中的复杂度。需要配合 ComplexShardingStrategy 使用。

  • Hint分片算法

对应 HintShardingAlgorithm,用于处理使用 Hint 行分片的场景。需要配合 HintShardingStrategy 使用。

1.2 分片策略

包含分片键和分片算法,由于分片算法的独立性,将其独立抽离。真正可用于分片操作的是分片键 + 分片算法,也就是分片策略。目前提供 5 种分片策略。

分片键

用于分片的数据库字段,是将数据库(表)水平拆分的关键字段。例:将订单表中的订单主键的尾数取模分片,则订单主键为分片字段。 SQL 中如果无分片字段,将执行全路由,性能较差。 除了对单分片字段的支持,Apache ShardingSphere 也支持根据多个字段进行分片。

目前提供 5 种分片策略。

  • 标准分片策略

对应 StandardShardingStrategy。提供对 SQL语句中的 =, >, <, >=, <=, INBETWEEN AND 的分片操作支持。 StandardShardingStrategy 只支持单分片键,提供 PreciseShardingAlgorithmRangeShardingAlgorithm 两个分片算法。 PreciseShardingAlgorithm 是必选的,用于处理 =IN 的分片。 RangeShardingAlgorithm 是可选的,用于处理 BETWEEN AND, >, <, >=, <=分片,如果不配置 RangeShardingAlgorithm,SQL 中的 BETWEEN AND 将按照全库路由处理。

  • 复合分片策略

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

  • Hint分片策略

对应 HintShardingStrategy。通过 Hint 指定分片值而非从 SQL 中提取分片值的方式进行分片的策略。

  • 不分片策略

对应 NoneShardingStrategy。不分片的策略。

2. 原生API使用

API结构

2.1 数据库分片

2.2 读写分离

3. Spring中使用

总结一下,第一,使用数据源需要使用Sharding-JDBC的数据源,而不是容器或者ORM框架定义的数据源,这样才能保证动态选择数据源的实现。

当然,流程实现由sharding-jdbc定义,在交给Druid放进池子里,在交给Mybatis,最后注入到Spring。最外层是Spring,因为代码是从Spring开始调用的。

第二,因为sharding-jdbc是在工作在客户端的,所以我们要在客户端配置分库分表的策略。跟Mycat不一样的是,sharding-jdbc没有内置各种分片策略和算法,需要我们通过表达式或者自定义的配置文件实现。

总提上需要配置的就是数据源和分片策略,配置的方式也是多样的,官网介绍很详细

配置手册

示例使用yml方式进行配置。