shardingsphere整体处理流程为解析->路由->改写->执行->归并,每个流程节点的目的是什么呢?

ShardingSphere 作为一款分布式数据分片中间件,其核心处理流程 “解析 -> 路由 -> 改写 -> 执行 -> 归并” 环环相扣,每个节点都承担着关键职责,共同实现对分布式数据库的透明化操作。以下是各流程节点的具体目的:

1. 解析(Parsing)

目的:将用户输入的 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、查询条件等信息。

2. 路由(Routing)

目的:根据解析得到的 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 的物理数据源。

3. 改写(Rewriting)

目的:将基于逻辑表的 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)。

4. 执行(Execution)

目的:将改写后的 SQL 语句分发到路由阶段确定的物理节点上执行,并获取各节点的执行结果。

具体作用:

  • 管理与物理数据库的连接(通过数据源池),根据路由结果选择对应的物理连接。
  • 采用异步或同步方式向多个物理节点发送改写后的 SQL,并执行查询或更新操作。
  • 处理执行过程中的异常(如连接超时、执行失败等),并根据配置进行重试或返回错误。
  • 对于写操作(如 INSERT/UPDATE/DELETE),需结合分布式事务机制(如 XA、TCC)确保数据一致性。

5. 归并(Merger)

目的:将多个物理节点返回的执行结果汇总、处理为一个统一的结果集,返回给用户,屏蔽分布式数据库的底层细节。

具体作用:

  • 根据 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 → 归并汇总结果返回用户。
通过这一流程,中间件实现了对分布式数据库的 “透明化” 操作,让用户可以像操作单库单表一样使用分片集群。
posted @ 2025-07-08 20:55  飘来荡去evo  阅读(15)  评论(0)    收藏  举报