一、背景
Sharding
是 Apache ShardingSphere
的核心特性,也是 ShardingSphere
最被人们熟知的一项能力。在过去,用户若需要进行分库分表,一种典型的实施流程(不含数据迁移)如下:
- 用户需要准确的理解每一张数据表的分片策略
- 明确的知晓每张表的实际表名和所在数据库
- 根据这些信息来配置分片规则
以上述分库分表场景为例,8 库 * 4 表
的分布情况可能如下:
二、痛点
在前述的分库分表场景中,作为 Sharding
功能的用户,必须要对数据表的分布情况了然于心,才能写出正确的 actualDataNodes
规则。如上述 t_order
表对应的分片配置如下:
tables:
t_order:
actualDataNodes: ds_${0..7}.t_order_${0..3}
databaseStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: database_inline
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: table_inline
shardingAlgorithms:
database_inline:
type: INLINE
props:
algorithm-expression: ds_${order_id % 8}
table_inline:
type: INLINE
props:
algorithm-expression: t_order_${order_id % 4}
尽管 ShardingSphere
的配置规则已经非常的规范和简洁,但仍有用户在使用中遇到各种麻烦:
- 不理解分片策略或配置规则,无从下手
- 分片配置与数据表实际分布不匹配
- 配置表达式格式不正确
- 等等
三、AutoTable 横空出世
为了帮助用户更好的使用分片功能,降低配置复杂度和提升使用体验,Apache ShardingSphere 5.0.0
版本推出了一种新的分片配置方式:AutoTable
。
顾名思义,AutoTable
类型的数据表,交由 ShardingSphere
自动管理分片,用户只需要指定分片数量和使用的数据源,无需再关心表的具体分布。
配置格式如下:
autoTables:
t_order:
# 指定使用的数据源
actualDataSources: ds_${0..7}
shardingStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: mod
shardingAlgorithms:
mod:
type: MOD
props:
# 指定分片数量
sharding-count: 32
通过以上配置,ShardingSphere
识别出逻辑表 t_order
需要分为 32
片且使用 8
个数据源,则自动计算出 8库 * 4表
的分布关系,实现和传统方式等效的配置结果。
四、与 DistSQL 结合
在《DistSQL:像数据库一样使用 Apache ShardingSphere》一文中,孟浩然介绍了 DistSQL
的设计初衷和语法体系,并通过实战操作展示了一条 SQL
创建分布式数据库表的强大能力,展现了 Apache ShardingSphere
在新形态下的交互体验。
在使用 DistSQL
进行数据管理的场景下,AutoTable
能够极大的降低分片配置复杂度。并且,与传统文件配置形式相比,通过 DistSQL
来配置分片规则是即时生效的,无需重启,这样也就完全不用担心单张表的规则调整影响其他在线业务。
除了新增分片配置,DistSQL
也提供了修改和删除分片规则的语法,格式如下:
# 新增分片规则
CREATE SHARDING TABLE RULE t_order (
RESOURCES(resource_0,resource_1),
SHARDING_COLUMN=order_id,TYPE(NAME=hash_mod,PROPERTIES("sharding-count"=4))
);
# 修改分片规则
ALTER SHARDING TABLE RULE t_order (
RESOURCES(resource_0,resource_1),
SHARDING_COLUMN=order_id,TYPE(NAME=hash_mod,PROPERTIES("sharding-count"=10))
);
# 移除分片规则
DROP SHARDING TABLE RULE t_order;
五、AutoTable 支持的分片算法
AutoTable
支持全部的自动分片算法,包括:
MOD
:取模分片算法HASH_MOD
:哈希取模分片算法VOLUME_RANGE
:基于分片容量的范围分片算法BOUNDARY_RANGE
:基于分片边界的范围分片算法AUTO_INTERVAL
:自动时间段分片算法
关于以上算法的更多详细信息和使用示例预留下章进行详细介绍。