这些概念大多是从官网抠出来的,调整了下格式,某些地方加入了自己的一些示例、理解。
SQL
逻辑表
水平拆分的数据库表的相同逻辑和数据结构表的总称。
例如:
医院信息表被拆分为biz_yy_info_0 ... biz_yy_info_9
,他们对应的逻辑表为biz_yy_info
。
真实表
在分片数据库中真实存在的物理表。例如逻辑表中介绍的biz_yy_info_0...biz_yy_info_9
。
数据节点
数据源名称和数据表组成的数据分片最小单元。例如ds_0.biz_yy_info_0
。
绑定表
指分片规则相同的主表和子表。例如两张表,tborder
和tbperson
,都按照同一个字段——person_id分片,因此这两张表互为绑定表。两张绑定表在关联时不会出现笛卡尔积,关联效率较高。
广播表
指所有分片数据源中都存在的表,表结构、数据在每个节点都完全一致。适用于数据量不大,需要与海量数据的表关联的场景。
分片
分片键
用于分片的数据库字段,用于将数据水平拆分的关键字段。sharding-sphere
支持多个字段分片键。
分片算法(四种)
通过分片算法将数据分片,支持通过=
、>=
、<=
、>
、<
、BETWEEN
和IN
分片。
注意:分片算法需要自行实现。
例如,下图是我实现的一个分片算法。
-
精确分片算法
对应PreciseShardingAlgorithm
,用于处理使用单一键作为分片键的=
与IN
进行分片的场景。需要配合StandardShardingStrategy
使用。 -
范围分片算法
对应RangeShardingAlgorithm
,用于处理使用单一键作为分片键的BETWEEN
AND
、>
、<
、>=
、<=
进行分片的场景。需要配合StandardShardingStrategy
使用。 -
复合分片算法
对应ComplexKeysShardingAlgorithm
,用于处理使用多键作为分片键进行分片的场景,包含多个分片键的逻辑较复杂,需要应用开发者自行处理其中的复杂度。需要配合ComplexShardingStrategy
使用。 -
Hint分片算法
对应HintShardingAlgorithm
,用于处理使用Hint行分片的场景。需要配合HintShardingStrategy
使用。
分片策略
包含分片键和分片算法,由于分片算法的独立性,将其独立抽离。真正可用于分片操作的是分片键 + 分片算法
,也就是分片策略。
- 标准分片策略
对应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
。不分片的策略。
SQL Hint
对于分片字段非SQL决定,而由其他外置条件决定的场景,可使用SQL Hint灵活的注入分片字段。例:内部系统,按照员工登录主键分库,而数据库中并无此字段。SQL Hint支持通过Java API和SQL注释(待实现)两种方式使用。
配置
分片规则
分片规则配置的总入口。包含数据源配置、表配置、绑定表配置以及读写分离配置等。
数据源配置
真实数据源列表。
表配置
逻辑表名称、数据节点与分表规则的配置。
数据节点配置
用于配置逻辑表与真实表的映射关系。可分为均匀分布和自定义分布两种形式。
- 均匀分布
指数据表在每个数据源内呈现均匀分布的态势,例如:
db0
├── t_order0
└── t_order1
db1
├── t_order0
└── t_order1
那么数据节点的配置如下:
db0.t_order0, db0.t_order1, db1.t_order0, db1.t_order1
- 自定义分布
指数据表呈现有特定规则的分布,例如:
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
分片策略配置
对于分片策略存有数据源分片策略和表分片策略两种维度。
-
数据源分片策略
对应于DatabaseShardingStrategy。用于配置数据被分配的目标数据源。 -
表分片策略
对应于TableShardingStrategy。用于配置数据被分配的目标表,该目标表存在与该数据的目标数据源内。故表分片策略是依赖与数据源分片策略的结果的。
两种策略的API完全相同。
自增主键生成策略
通过在客户端生成自增主键替换以数据库原生自增主键的方式,做到分布式主键无重复。内置的分布式主键实现有UUID
、SNOWFLAKE
以及LEAF
。