一:Sharding-JDBC 分库分表
1、Sharding-JDBC 是一款轻量级java框架,以jar形式提供服务,增强版JDBC。主要功能:
- 数据分片: 分库分表; 读写分离; 分片策略; 分布式主键
- 分布式事务: 标准化事务接口; XA强一致性事务; 柔性事务
- 数据库治理: 配置动态化; 编排治理; 数据脱敏; 可视化链路追踪
2、Sharding-JDBC内部结构:
黄色部分:Sharding-JDBC的入口API,采用工厂方法的形式提供。目前两个工厂类:
- ShardingDataSourceFactory支持分库分表、读写分离操作
- MasterSlaveDataSourceFactory支持读写分离操作
蓝色部分:Sharding-JDBC的配置对象,提供灵活的配置方式。核心配置类:ShardingRuleConfifiguration,包含多个TableRuleConfifiguration和MasterSlaveRuleConfifiguration
- TableRuleConfifiguration:封装的是表的分片配置信息,有5种配置形式对应不同的Confifiguration类型。
- MasterSlaveRuleConfifiguration:封装的是读写分离配置信息。
红色部分:Sharding-JDBC的内部使用类,不用管。
3、初始化流程:
- 根据配置信息生成Configuration对象
- 通过Factory转化为Rule对象
- 通过Factory降Rule对象和DataSource对象封装,进行分库分表和读写分离操作
4、核心概念:
分片算法(ShardingAlgorithm)
- 范围分片算法:单一RangeShardingAlgorithm键作为分片键,BETWEEN AND、>、<、>=、<=进行分片的场景
- 精确分片算法PreciseShardingAlgorithm : 单一键做分片键,应对 = 与 in 分片的场景
- 复合分片算法ComplexKeysShardingAlgorithm: 处理使用多键作为分片键进行分片的场景
- Hint分片算法HintShardingAlgorithm:对于分片字段非SQL决定,而由其他外置条件决定的场景,可使用SQL Hint灵活的注入分片字段
因为分片算法和实际业务紧密结合,所以以上这些算法都是接口,需要在使用时,实现相应的接口后做实际算法逻辑。
分片策略(ShardingStrategy)
分片策略 = 分片键 + 分片算法。 目前提供5种:
标准策略StandardShardingStrategy:
- 只支持单分片键,提供对SQL语句中的=, >, <, >=, <=, IN和BETWEEN AND的分片支持。 支持两个分片算法
- PreciseShardingAlgorithm: 必选。
- RangeShardingAlgorithm: 可选 (sql如果有范围操作,不选会全库扫描,效率低)
复合策略ComplexShardingStrategy:
- 支持多分片键,提供对SQL语句中的=, >, <, >=, <=, IN和BETWEEN AND的分片操作支持。由开发者自己实现分片策略。
行表达式策略InlineShardingStrategy(最简单常用,不需要使用分片算法,简单的表达式配置即可,下面会单独介绍行表达式使用)