shardingsphere核心分片-sql执行
经过解析、路由、改写之后,shardingSphere已经确定好了当前这条SQL可以执行的所有数据节点,之后就会
根据不同的数据源获取真正的连接去执行SQL。它不是简单地将 SQL 通过 JDBC 直接发送至数据源执行;
也并非直接将执行请求放入线程池去并发执行。它更关注平衡数据源连接创建以及内存占用所产生的消耗,
以及最大限度地合理利用并发等问题。 执行引擎的目标是自动化的平衡资源控制与执行效率。
shardingSphere为了平衡资源与效率,提出了“连接模式”概念。分为 内存限制模式 和 连接限制模式。
内存限制模式:
内存模式就是ShardingSphere 对一次操作所耗费的数据库连接数量不做限制。如果实
际执行的 SQL 需要对某数据库实例中的 200 张表做操作,则对每张表创建一个新的数据库连接,并通
过多线程的方式并发处理,以达成执行效率最大化。 并且在 SQL 满足条件情况下,优先选择流式归并,
以防止出现内存溢出或避免频繁垃圾回收情况。
连接限制模式:
使用此模式的前提是,ShardingSphere 严格控制对一次操作所耗费的数据库连接数量。 如果实际执行
的 SQL 需要对某数据库实例中的 200 张表做操作,那么只会创建唯一的数据库连接,并对其 200 张表
串行处理。 如果一次操作中的分片散落在不同的数据库,仍然采用多线程处理对不同库的操作,但每个
库的每次操作仍然只创建一个唯一的数据库连接。 这样即可以防止对一次请求对数据库连接占用过多所
带来的问题。该模式始终选择内存归并。
内存限制模式适用于 OLAP 操作,可以通过放宽对数据库连接的限制提升系统吞吐量; 连接限制模式适
用于 OLTP 操作,OLTP 通常带有分片键,会路由到单一的分片,因此严格控制数据库连接,以保证在线
系统数据库资源能够被更多的应用所使用,是明智的选择。
自动化执行引擎
ShardingSphere 最初将使用何种模式的决定权交由用户配置,让开发者依据自己业务的实际场景需求选
择使用内存限制模式或连接限制模式。这种解决方案将两难的选择的决定权交由用户,使得用户必须要了
解这两种模式的利弊,并依据业务场景需求进行选择。 这无疑增加了用户对 ShardingSphere 的学习和使
用的成本,并非最优方案。这种一分为二的处理方案,将两种模式的切换交由静态的初始化配置,是缺乏
灵活应对能力的。在实际的使用场景中,面对不同 SQL 以及占位符参数,每次的路由结果是不同的。 这
就意味着某些操作可能需要使用内存归并,而某些操作则可能选择流式归并更优,具体采用哪种方式不应
该由用户在 ShardingSphere 启动之前配置好,而是应该根据 SQL 和占位符参数的场景,来动态的决定连
接模式。为了降低用户的使用成本以及连接模式动态化这两个问题,ShardingSphere 提炼出自动化执行引
擎的思路,在其内部消化了连接模式概念。 用户无需了解所谓的内存限制模式和连接限制模式是什么,而
是交由执行引擎根据当前场景自动选择最优的执行方案。自动化执行引擎将连接模式的选择粒度细化至每一
次 SQL 的操作。 针对每次 SQL 请求,自动化执行引擎都将根据其路由结果,进行实时的演算和权衡,并
自主地采用恰当的连接模式执行,以达到资源控制和效率的最优平衡。 针对自动化的执行引擎,用户只需
配置 maxConnectionSizePerQuery 即可,该参数表示一次查询时每个数据库所允许使用的最大连接数。执
行引擎分为准备和执行两个阶段。
准备阶段
顾名思义,此阶段用于准备执行的数据。它分为结果集分组和执行单元创建两个步骤。结果集分组是实现内
化连接模式概念的关键。执行引擎根据 maxConnectionSizePerQuery 配置项,结合当前路由结果,选择恰
当的连接模式。 具体步骤如下:
-
将 SQL 的路由结果按照数据源的名称进行分组。
2.通过下图的公式,可以获得每个数据库实例在 maxConnectionSizePerQuery
的允许范围内,每个连接需要执行的 SQL 路由结果组,并计算出本次请求的最优连接模式
执行阶段
该阶段用于真正的执行 SQL,它分为分组执行和归并结果集生成两个步骤。
分组执行将准备执行阶段生成的执行单元分组下发至底层并发执行引擎,
并针对执行过程中的每个关键步骤发送事件。 如:执行开始事件、执行
成功事件以及执行失败事件。执行引擎仅关注事件的发送,它并不关心
事件的订阅者。 ShardingSphere 的其他模块,如:分布式事务、调用
链路追踪等,会订阅感兴趣的事件,并进行相应的处理。ShardingSph
ere 通过在执行准备阶段的获取的连接模式,生成内存归并结果集或流
式归并结果集,并将其传递至结果归并引擎,以进行下一步的工作。执
行引擎的整体结构划分如下图所示。