ShardingSphere 作为一款分布式数据分片中间件,其核心处理流程 “解析 -> 路由 -> 改写 -> 执行 -> 归并” 环环相扣,每个节点都承担着关键职责,共同实现对分布式数据库的透明化操作。以下是各流程节点的具体目的:
目的:将用户输入的 SQL 语句转换为可被中间件理解的结构化数据(抽象语法树,AST),并提取 SQL 中的关键信息(如表名、字段、条件、操作类型等),为后续流程提供基础数据支持。
具体作用:
- 通过词法分析和语法分析,将 SQL 字符串拆解为语法单元(如关键字、表名、字段名、运算符等),生成抽象语法树(AST)。
- 从 AST 中提取核心元数据,包括:
- 操作类型(SELECT/INSERT/UPDATE/DELETE);
- 涉及的逻辑表名(用户定义的分片表);
- 查询条件(如 WHERE 子句中的分片键);
- 排序、分组、分页信息(如 ORDER BY、GROUP BY、LIMIT)等。
- 验证 SQL 语法合法性,若存在语法错误则直接返回异常。
示例:对于 SQL SELECT id, name FROM t_order WHERE user_id = 100 AND order_id = 1000
,解析后会识别出逻辑表 t_order
、分片键 user_id
和 order_id
、查询条件等信息。
目的:根据解析得到的 SQL 信息和预设的分片规则,确定该 SQL 需要在哪些物理数据库 / 物理表上执行,实现 “一次 SQL 请求” 到 “多个物理节点执行” 的映射。
具体作用:
- 结合分片规则(如分片算法、分片键、数据源配置等),判断 SQL 操作的逻辑表对应的物理表分布。
- 根据查询条件中的分片键值,计算出具体的目标物理节点(数据源 + 物理表)。
- 路由策略可分为:
- 精准路由:当 SQL 中包含完整的分片键条件时,直接定位到单个或少量物理节点(如按
user_id=100
路由到 t_order_10
);
- 范围路由:当 SQL 中包含分片键的范围条件时(如
user_id BETWEEN 100 AND 200
),路由到多个匹配的物理节点;
- 广播路由:当 SQL 操作非分片表或未包含分片键时,需要在所有相关物理节点执行(如查询全局表或全表扫描)。
示例:若 t_order
按 user_id % 10
分片,user_id=100
对应的分片为 t_order_0
,则路由会将请求指向存储 t_order_0
的物理数据源。
目的:将基于逻辑表的 SQL 语句改写为适配物理节点的 SQL 语句,确保改写后的 SQL 能在目标物理数据库上正确执行。
具体作用:
- 将 SQL 中的逻辑表名替换为对应的物理表名(如
t_order
改写为 t_order_0
或 t_order_1
)。
- 调整 SQL 中的条件、排序、分页等信息,适配物理表的实际结构(如分片场景下的 LIMIT 分页需要重新计算偏移量,避免跨节点数据重复或遗漏)。
- 处理特殊语法(如分布式事务相关的 SQL 改写、函数适配等),确保物理数据库兼容。
示例:原 SQL SELECT * FROM t_order WHERE user_id = 100
会被改写为 SELECT * FROM t_order_0 WHERE user_id = 100
(假设 user_id=100
对应分片表 t_order_0
)。
目的:将改写后的 SQL 语句分发到路由阶段确定的物理节点上执行,并获取各节点的执行结果。
具体作用:
- 管理与物理数据库的连接(通过数据源池),根据路由结果选择对应的物理连接。
- 采用异步或同步方式向多个物理节点发送改写后的 SQL,并执行查询或更新操作。
- 处理执行过程中的异常(如连接超时、执行失败等),并根据配置进行重试或返回错误。
- 对于写操作(如 INSERT/UPDATE/DELETE),需结合分布式事务机制(如 XA、TCC)确保数据一致性。
目的:将多个物理节点返回的执行结果汇总、处理为一个统一的结果集,返回给用户,屏蔽分布式数据库的底层细节。
具体作用:
- 根据 SQL 操作类型(查询 / 更新)和结果类型(游标、数据集等),执行不同的归并策略:
- 结果集归并(针对 SELECT):
- 排序归并(如对多个节点的结果按 ORDER BY 合并排序);
- 分组归并(按 GROUP BY 聚合计算,如 SUM、COUNT 等);
- 分页归并(合并多个节点的 LIMIT 结果,返回最终分页数据);
- 简单归并(无需排序 / 分组时,直接拼接结果集)。
- 更新计数归并(针对 INSERT/UPDATE/DELETE):汇总各节点的影响行数,返回总计数。
- 处理异常结果(如部分节点执行失败时,根据事务配置决定是否回滚)。
示例:若 SQL 为 SELECT * FROM t_order WHERE user_id BETWEEN 100 AND 200 ORDER BY order_id LIMIT 10
,归并阶段会收集多个分片表的结果,按 order_id
排序后取前 10 条,返回给用户。
总结
阶段 | 核心目的 | 关键技术 |
解析 |
结构化SQL,提取分片信息 |
词法解析、语法解析、AST生成 |
路由 |
确定数据分布,路由到物理节点 |
分片策略(哈希/范围)、广播路由、Hint路由 |
改写 |
适配物理表,优化执行计划 |
表名替换、补列、分页修正、IN查询拆分 |
执行 |
并行执行SQL,管理数据源 |
多线程异步执行、数据源动态切换 |
归并 |
合并结果,支持排序/分组/分页 |
流式归并(排序/分组)、内存归并、分页修正 |
ShardingSphere 的五大流程节点形成了一个完整的闭环:
解析提取 SQL 关键信息 → 路由定位目标物理节点 → 改写生成适配物理节点的 SQL → 执行分发并执行 SQL → 归并汇总结果返回用户。
通过这一流程,中间件实现了对分布式数据库的 “透明化” 操作,让用户可以像操作单库单表一样使用分片集群。