【ShardingSphere 技术专题】「ShardingJDBC」SpringBoot 之整合 ShardingJDBC 实现分库分表(JavaConfig 方式)
前提介绍
ShardingSphere 介绍
ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 Sharding-JDBC、Sharding-Proxy 和 Sharding-Sidecar(计划中)这 3 款相互独立的产品组成。 他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。
shardingJDBC 使用的范围
适用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC。
支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP 等。
支持任意实现 JDBC 规范的数据库。目前支持 MySQL,Oracle,SQLServer,PostgreSQL 以及任何遵循 SQL92 标准的数据库。
详细一点的介绍直接看官网:https://shardingsphere.apache.org/document/current/cn/overview/
SQL 语句相关
逻辑表:水平拆分的数据库(表)的相同逻辑和数据结构表的总称。例:订单数据根据主键尾数拆分为 2 张表,分别是 t_order_0 到 t_order_1,他们的逻辑表名为 t_order。
真实表:在分片的数据库中真实存在的物理表。例:示例中的 t_order_0 到 t_order_1
数据节点:数据分片的最小单元。由数据源名称和数据表组成,例:ds_0.t_order_0;ds_0.t_order_1;
绑定表:指分片规则一致的主表和子表。例如:t_order 表和 t_order_item 表,均按照 order_id 分片,则此两张表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积关联,关联查询效率将大大提升。
广播表:指所有的分片数据源中都存在的表,表结构和表中的数据在每个数据库中均完全一致。适用于数据量不大且需要与海量数据的表进行关联查询的场景。
数据分片相关
分片键:用于分片的数据库字段,是将数据库(表)水平拆分的关键字段。例:将订单表中的订单主键的尾数取模分片,则订单主键为分片字段。
SQL 中如果无分片字段,将执行全路由,性能较差。 除了对单分片字段的支持,ShardingSphere 也支持根据多个字段进行分片。
分片算法:通过分片算法将数据分片,支持通过=、>=、<=、>、<、BETWEEN 和 IN 分片,分片算法需要应用方开发者自行实现,可实现的灵活度非常高。
目前提供 4 种分片算法
精确分片算法:对应 PreciseShardingAlgorithm,用于处理使用单一键作为分片键的=与 IN 进行分片的场景。需要配合 StandardShardingStrategy 使用。
范围分片算法:对应 RangeShardingAlgorithm,用于处理使用单一键作为分片键的 BETWEEN AND、>、<、>=、<=进行分片的场景。需要配合 StandardShardingStrategy 使用。
复合分片算法:对应 ComplexKeysShardingAlgorithm,用于处理使用多键作为分片键进行分片的场景,包含多个分片键的逻辑较复杂,需要应用开发者自行处理其中的复杂度。需要配合 ComplexShardingStrategy 使用。
Hint 分片算法:对应 HintShardingAlgorithm,用于处理使用 Hint 行分片的场景。需要配合 HintShardingStrategy 使用。
分片策略:包含分片键和分片算法,由于分片算法的独立性,将其独立抽离。真正可用于分片操作的是分片键 + 分片算法,也就是分片策略。
目前提供 5 种分片策略
标准分片策略:对应 StandardShardingStrategy,提供对 SQL 语句中的=, >, <, >=, <=, IN 和 BETWEEN AND 的分片操作支持。
StandardShardingStrategy 只支持单分片键,提供 PreciseShardingAlgorithm 和 RangeShardingAlgorithm 两个分片算法。
PreciseShardingAlgorithm 是必选的,用于=和 IN 的分片。
RangeShardingAlgorithm 是可选的,用于 BETWEEN AND, >, <, >=, <=分片,不配置 RangeShardingAlgorithm,SQL 中的 BETWEEN AND 将按照全库路由处理。
复合分片策略:对应 ComplexShardingStrategy。提供对 SQL 语句中的=, >, <, >=, <=, IN 和 BETWEEN AND 的分片操作支持。
ComplexShardingStrategy 支持多分片键,由于多分片键之间的关系复杂,因此并未进行过多的封装。
而是直接将分片键值组合以及分片操作符透传至分片算法,完全由应用开发者实现,提供最大的灵活度。
行表达式分片策略:对应 InlineShardingStrategy。使用 Groovy 的表达式,提供对 SQL 语句中的=和 IN 的分片操作支持,只支持单分片键。
对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的 Java 代码开发,如:
t_user_$->{u_id % 8}
表示 t_user 表根据 u_id 模 8,而分成 8 张表,表名称为 t_user_0 到 t_user_7。Hint 分片策略:对应 HintShardingStrategy。通过 Hint 指定分片值而非从 SQL 中提取分片值的方式进行分片的策略。
不分片策略:对应 NoneShardingStrategy。
配置相关
分片规则:分片规则配置的总入口。包含数据源配置、表配置、绑定表配置以及读写分离配置等。
数据源配置:真实数据源列表。
表配置:逻辑表名称、数据节点与分表规则的配置
数据节点配置:用于配置逻辑表与真实表的映射关系。
分片策略配置:
数据源分片策略:对应于 DatabaseShardingStrategy。用于配置数据被分配的目标数据源。
表分片策略:对应于 TableShardingStrategy。用于配置数据被分配的目标表,该目标表存在与该数据的目标数据源内。故表分片策略是依赖与数据源分片策略的结果的。
自增主键生成策略:通过在客户端生成自增主键替换以数据库原生自增主键的方式,做到分布式主键无重复。(雪花算法)
开发步骤
开发整合方式
方式一:基于配置文件集成,方便简单但是不够灵活
方式二:这里我们主要基于 java config 的方式来集成到 springboot 中,更适合学习和理解
定义相关配置类(DataSourceConfig => MybatisConfig => TransactionConfig)
ShardingSphereDataSourceConfig
ShardingsphereMybatisConfig 配置机制
ShardingsphereTransactionConfig 配置机制
主要定制化配置事务操作可以空战未来的,为了未来的查询扩展 XA
版权声明: 本文为 InfoQ 作者【李浩宇/Alex】的原创文章。
原文链接:【http://xie.infoq.cn/article/cdc7c4906ef4c59938f93c37b】。文章转载请联系作者。
评论