学习目标
掌握数据分片的执行流程 分几步,每步的输入输出
掌握ShardingSphere中各个数据分片引擎的基本结构和原理
目录
分片引擎 解析引擎 SQLParserEngine 路由引擎 ShardingSQLRouter 改写引擎 SQLRewriteEngine 执行引擎 ExecutorEngine 归并引擎 MergeEngine
SQL解析、路由、改写引擎 内核工具类将三个引擎串联起来
解析引擎 SQL语句转换为抽象语法树AST
三步骤 生成SQL抽象语法树 输出AST 提取SQL片段 输出SQLSegment 填充SQL语句 输出SQLStatement
AST
路由引擎 6个核心步骤
对SQLStatement中的分片信息做合理性进行验证
获取SQLStatementContext
如果是InsertStatement则自动生成主键 如果是雪花算法等组件则初始化组件
创建分片条件ShardingConditions
获取SQLRouteExecutor并执行路由 根据分片条件路由
构建路由上下文RouteContext
路由引擎-核心组件交互 分层设计:
infrastructure 基础设施层,为core层提供基础能力
core 核心层提供应用层使用
入口SQLRouteEngine 1 2 3 4 5 6 7 8 9 10 11 12 13 public final class sQLRouteEngine { private final Collection<ShardingSphereRule> rules; private final ConfigurationProperties props; public RouteContext route(final LogicsQL logicsQL, final ShardingSphereDatabase database) { //通过SQLRouteExecutor具体执行路由 SQLRouteExecutor executor =isNeedAllSchemas(logicsQL.getSqlStatementContext().getSqlStatement())? new AllSQLRouteExecutor():new PartialSQLRouteExecutor(rules, props); return executor.route(logicsQL, database); } private boolean isNeedAllSchemas(final SQLStatement sqlStatement) { return sqlStatement instanceof MySQLShowTablesStatement || sglStatement instanceof MysQLShowTableStatusStatement; } }
分片策略 分片策略=分片算法+分片键
ShardingStrategy类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public interface ShardingStrategy { //获取分片列 Collection<String>getShardingColumns() //获取分片算法 ShardingAlgorithm getShardingAlgorithm(); //执行分片 Collection<String>doSharding(Collection<String> availableTargetNames,Collection<ShardingConditionValue>shardingConditionValues,DataNodeInfo dataNodelnfo, ConfigurationProperties props); } public interface ShardingSphereAlgorithm extends TypedSPl, SPlPostProcessor { Properties getProps(); } public interface ShardingAlgorithm extends ShardingSphereAlgorithm { }
标准分片策略-StandardShardingstrategy 精确分片 PreciseShardingValue 提供对SQL语句中 (= IN)操作的分片支持 范围分片 RangeShardingValue 提供对SQL语句中 (>=,<=,BETWEEN,AND)等操作的分片支持
1 2 3 4 5 6 7 8 9 10 public Collection<String> doSharding(final Collection<String> availableTargetNames, finalCollection<ShardingConditionValue> shardingConditionValues, finalDataNodelnfo dataNodelnfo, finalConfigurationProperties props){ ShardingConditionValue shardingConditionValue = shardingConditionValues.iterator().next(); //如果分片值是一个列表,则执行Precisesharding;如果分片值是一个范围,则执行Rangesharding Collection<String> shardingResult = shardingConditionValue instanceof ListShardingConditionValue ? dosharding(availableTargetNames, (listShardingConditionValue) : dosharding(availableTargetNames, (RangeShardingconditionValue) shardingConditionValue, dataNodelnfo); Collection<String> result = new TreeSet<>(String.CASE INSENSITIVE ORDER); result.addAll(shardingResult); return result; }
SQL执行和归并引擎