ShardingSphere 分片核心概念
分片是分布式数据库的核心能力,ShardingSphere 通过精确定义的分片概念体系实现透明化数据路由。以下是分片机制的底层原理和关键概念详解:
一、分片核心概念拓扑
二、核心概念详解
1. 逻辑表(Logic Table)
- 定义:分布式数据库中相同结构的水平拆分表的逻辑抽象
- 特征:
- 应用层操作的表名(如
t_order
) - 不包含物理存储位置信息
- SQL 操作的直接对象
- 应用层操作的表名(如
-- 应用层SQL
SELECT * FROM t_order WHERE user_id=123;
2. 真实表(Actual Table)
- 定义:物理数据库中实际存储数据的表
- 命名规则:
- 逻辑表名 + 分片后缀(如
t_order_0
) - 支持自定义表达式:
t_order_${202301..202312}
- 逻辑表名 + 分片后缀(如
-- 物理表示例
CREATE TABLE ds_0.t_order_0 (...);
CREATE TABLE ds_1.t_order_1 (...);
3. 数据节点(Data Node)
- 定义:数据分片的最小物理单元
- 组成:
数据源名称.表名
- 动态表达式:
等效节点:actualDataNodes: ds_${0..1}.t_order_${0..1}
ds_0.t_order_0
ds_0.t_order_1
ds_1.t_order_0
ds_1.t_order_1
4. 分片键(Sharding Key)
- 定义:用于路由分片的数据库字段
- 设计原则:
- 高基数性(如用户ID优于性别)
- 业务查询高频使用
- 数据分布均匀
- SQL 约束:
-- 有效查询(含分片键) SELECT * FROM t_order WHERE user_id=101 AND order_id=1001; -- 低效查询(全路由) SELECT * FROM t_order WHERE status='PAID'; -- 扫描所有分片
5. 分片算法(Sharding Algorithm)
- 核心接口:
public interface ShardingAlgorithm { // 精确分片 Collection<String> doSharding(Collection<String> availableTargetNames, PreciseShardingValue shardingValue); // 范围分片 Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue shardingValue); }
- 算法分类:
类型 路由场景 实现类 精确分片算法 WHERE user_id=123 PreciseShardingAlgorithm 范围分片算法 WHERE order_id>1000 RangeShardingAlgorithm 复合分片算法 WHERE user_id=123 AND status=‘PAID’ ComplexKeysShardingAlgorithm
6. 分片策略(Sharding Strategy)
- 三维策略模型:
sharding: tables: t_order: # 1. 分库策略 databaseStrategy: standard: # 标准策略 shardingColumn: user_id shardingAlgorithmName: db_hash # 2. 分表策略 tableStrategy: complex: # 复合策略 shardingColumns: order_date,region shardingAlgorithmName: table_custom # 3. 主键生成策略 keyGenerateStrategy: column: order_id keyGeneratorName: snowflake
三、高级分片概念
1. 绑定表(Binding Table)
- 问题场景:订单表与订单明细表 JOIN 产生笛卡尔积
/* 错误示例(产生 4x4=16 次查询)*/ SELECT * FROM t_order o JOIN t_order_item i ON o.order_id=i.order_id;
- 解决方案:
bindingTables: - t_order, t_order_item
- 执行优化:
2. 广播表(Broadcast Table)
- 适用场景:全局配置表/基础数据表
- 特性:
- 所有分片节点全量同步
- 写操作自动广播到所有节点
- 读操作随机访问单个节点
broadcastTables:
- t_country_code
- t_currency_rate
3. 弹性分片(Dynamic Scaling)
- 扩容流程:
四、分片路由原理
1. SQL 解析流程
2. 分片算法执行示例
- 分库计算:
db_index = user_id % db_count
- 分表计算:
table_index = order_id.hashCode() % table_count
3. 特殊路由场景
场景 | 路由行为 |
---|---|
无分片键查询 | 广播查询所有分片 |
多分片键AND查询 | 取交集分片(路由优化) |
多分片键OR查询 | 取并集分片(全路由) |
Hint强制路由 | 绕过SQL解析直连指定分片 |
五、生产实践启示
1. 分片键设计四原则
- 离散性:避免单调递增(如自增ID)
- 稳定性:字段值不频繁变更
- 均匀性:数据分布均衡
- 可查性:高频查询字段
2. 分片算法选型矩阵
数据特性 | 推荐算法 | 案例 |
---|---|---|
离散数字型 | 取模(MOD) | 用户ID分片 |
连续时间型 | 范围(RANGE) | 订单日期分片 |
混合特征型 | 复合(COMPLEX) | 地域+时间分片 |
不规则分布 | 自定义算法 | 热点订单特殊路由 |
3. 分片扩容黄金公式
新分片数 = 当前数据量 × (1 + 年增长率) / 单分片容量阈值
操作守则:
- 每次扩容至少翻倍(避免频繁扩容)
- 预留20%缓冲空间
- 业务低峰期执行
六、故障诊断手册
1. 路由异常排查
-- 查看SQL实际路由
EXPLAIN SHARDING SELECT * FROM t_order WHERE user_id=101;
/* 输出:
db0: SELECT * FROM t_order_1 WHERE user_id=101
*/
2. 常见错误代码
错误码 | 含义 | 解决方案 |
---|---|---|
2001 | 分片键缺失 | WHERE添加分片键 |
2003 | 广播表写冲突 | 检查多节点数据一致性 |
2005 | 分片算法计算异常 | 验证算法输入值范围 |
3. 分片元数据查询
-- 查看绑定表配置
SELECT * FROM sharding_binding_tables;
-- 检查分片算法定义
SHOW SHARDING ALGORITHMS;
调试技巧:开启全日志
logging.level.org.apache.shardingsphere=TRACE
通过对分片核心概念的深度理解,可构建出高性能、易扩展的分布式数据库架构。建议结合分片实验室进行动手实践。