当前位置: 首页 > 后端技术 > Java

SCTL的涅槃重生:投入RAL的怀抱

时间:2023-04-01 17:09:09 Java

PMC孟浩然在文章《DistSQL:像数据库一样使用 Apache ShardingSphere》中介绍了DistSQL的设计初衷和语法体系,并通过实战展示了一条SQL创建分布式数据库表的强大能力操作,以全新的形式展示ApacheShardingSphere的交互体验。近期,ShardingSphere社区对SCTL语法和执行引擎进行了重构,使SCTL全面拥抱DistSQL语法体系,将原有的SCTL功能整合到RAL语法中,使ShardingSphere管理语言更加统一。本文将带领读者理解本次重构的意义,通过实例一一解析新的RAL语句,感受ShardingSphere对更好用户体验的追求。作者简介蒋龙涛SphereEx中间件研发工程师,ApacheShardingSphereCommitter。目前主要负责DistSQL及权限相关特性的设计与开发。兰成祥SphereEx中间件研发工程师,ApacheShardingSphereContributor。目前专注于DistSQL的设计和开发。前情回顾:什么是RALRAL是DistSQL语法的一个分类,DistSQL包括三种具体类型:RDL、RQL和RAL。RDL(Resource&RuleDefinitionLanguage)负责资源和规则的创建、修改和删除;RQL(Resource&RuleQueryLanguage)负责查询和展示资源和规则;RAL(Resource&RuleAdministrationLanguage)提供资源和规则的高级控制能力。什么是SCTLSCTL(ShardingSphereControlLanguage)是ApacheShardingSphere的控制语言,负责Hint、事务类型切换、shard执行计划查询等增量功能的运行。SCTL包含如下语法:语句描述sctl:settransaction_type=XX修改当前连接的事务类型,支持LOCAL、XA、BASE。示例:sctl:settransaction_type=XAsctl:showtransaction_type查询当前连接的事务类型sctl:showcached_connections查询当前连接缓存的物理数据库连接数sctl:explainSQL查看逻辑SQL的执行计划,例如:sctl:explainselect*fromt_order;sctl:hintsetPRIMARY_ONLY=true对当前连接,是否强制将数据库操作路由到主库sctl:hintsetDatabaseShardingValue=yy对当前连接,设置hint只对数据库分片有效,并添加分片值,yy:数据库分片值sctl:hintaddDatabaseShardingValuexx=yy对于当前连接,为表xx添加分片值yy,xx:逻辑表名,yy:数据库分片值sctl:hintaddTableShardingValuexx=yy对当前连接,添加表xxxx添加分片值yy,xx:逻辑表名,yy:表分片值sctl:hintclear为当前连接,清除所有提示设置sctl:hintshowstatus对于当前连接,查询hint状态,primary_only:true/false,sharding_type:databases_only/databases_tablessctl:hintshowtablestatus对于当前连接,查询逻辑表的hint分片值。为什么重构分片值?如今,DistSQL提供了功能更丰富、概念更统一的新API,并将SCTL的功能集成到RAL中,可以降低用户的理解成本,避免用户的混淆。2.SCTL语法使用一个特殊的前缀字符sctl:作为标识符。它在执行SQL时不经过Parser引擎,而是通过字符串前缀匹配的方式进行解析。现在DistSQL已经实现了完整的解析过程,可以使用标准化的解析器来处理输入语句,减少特殊代码。3.最重要的是,原来的SCTL语法有点像真正的SQL语句。随着5.0.0版本的发布,ShardingSphere推出了DistSQL等一整套资源和规则管理方式,ShardingSphere控制语句也可以变得更像SQL。因此,社区已经将SCTL语法重构提上了议事日程。重构分析经过ShardingSphere社区的精心设计和讨论。SCTL句法将被新的RAL句法取代[2]。transaction_typesctl:showcached_connectionsshowvariablecached_connectionssctl:explainSQLpreviewSQLsctl:hintsetPRIMARY_ONLY=truesetreadwrite_splittinghintsource=[auto/write]sctl:hintsetDatabaseShardingValue=yyset分片提示database_value=yy;sctl:hintaddDatabaseShardingValuexx=yyadd分片提示database_valuexx=yy;sctl:hintaddTableShardingValuexx=yyaddshardinghinttable_valuexx=yysctl:hintclearclear[hint/shardinghint/readwrite_splittinghint]sctl:hintshowstatusshow[sharding/readwrite_splitting]hintstatusstatus]让我们一一分析这些语句:showvariabletransaction_type查询当前连接输入命令的事务类型mysql>showvariabletransaction_type;输出效果+------------------+|TRANSACTION_TYPE|+----------------+|本地代码AL|+----------------+setvariabletransaction_type修改当前连接的事务类型,支持的类型有:LOCAL、XA、BASE(不区分大小写)输入命令mysql>设置变量transaction_type=XA;输出效果A.设置成功,返回QueryOK,影响0行;b.再次执行showvariabletransaction_type;显示交易类型已更改为XA;showvariablecached_connection查询物理数据库缓存在当前连接中的连接数。输入命令mysql>showvariablecached_connections;输出效果+--------------------+|缓存连接|+------------------+|0|+--------------------+previewSQL预览实际的SQL。这里以读写分离场景为例。预览语法支持任意SQL语句。输入命令mysql>previewselect*fromt_order;输出效果+----------------+----------------------------------------------+|数据源名称|sql|+-----------------+----------------------------------------------+|read_ds_0|从t_order中选择*ORDERBYorder_idASC||read_ds_1|select*fromt_orderORDERBYorder_idASC|+----------------+----------------------------------------------+*注:以下是读写分离场景下的Hint示例,示例使用规则读写分离+分片的配置,配置如下:${0..1}.t_orderdefaultDatabaseStrategy:standard:shardingColumn:user_idshardingAlgorithmName:database_inlinedefaultTableStrategy:none:shardingAlgorithms:dabase_inline:type:INLINEprops:algorithm-expression:ds_${user_id%2}showreadwrite_splittinghintstatus对于当前连接,查询readwrite_splitting+--------+|的提示状态输出效果来源|+--------+|auto|+--------+setreadwrite_splittinghintsource对于当前连接,设置读写分离的路由策略(自动路由或强制写库)。source支持的类型有:AUTO、WRITE(不区分大小写)AUTO:读写分离,自动路由WRITE:强制路由到主库输入命令mysql>setreadwrite_splittinghintsource=write;输出效果A.设置成功,响应为QueryOK,0rowsaffected;b.再次执行showreadwrite_splittinghintstatus;表明source值已经改成write;C。执行预览select*fromt_order;可以看到查询SQL会路由到主库:mysql>previewselect*fromt_order;+----------------+------------------------------------------------+|数据源名称|sql|+----------------+--------------------------------------------+|写_ds_0|从t_order中选择*ORDERBYorder_idASC||写_ds_1|select*fromt_orderORDERBYorder_idASC|+----------------+---------------------------------------------+clearreadwrite_splittinghint对于当前连接,清除readwrite_splitting的提示设置。输入命令mysql>clearreadwrite_splittinghint;输出效果A.清除成功,响应QueryOK,0rowsaffectedb。将readwrite_splittinghint的所有设置恢复到初始状态,可以使用showreadwrite_splittinghintstatus;命令查看清除结果。*注:以下是分片场景下的Hint示例。Hint算法用于分库和分表。使用的分片配置如下:shardingAlgorithms:database_inline:type:HINT_INLINEprops:algorithm-expression:ds_${Integer.valueOf(value)%2}table_inline:HINT_INLINEprops:algorithm-expression:t_order_item_${Integer.valueOf(value)%2}显示分片提示状态查询当前连接的分片提示状态。输入命令mysql>showshardinghintstatus;输出效果为初始状态的输出值:验证查询路由,输入命令previewselect*fromt_order_item;此时outputeffect没有hint值,查询使用全路由集shardinghintdatabase_value;对于当前Connection,settinghint只对databasesharding有效,添加shard值1。输入命令mysql>setshardinghintdatabase_value=1;输出效果A.设置成功,返回QueryOK,影响0行;b.执行showshardinghintstatus;t_order_item表对应的database_sharding_values的值显示为'1',sharding_type更新后的值为'databases_only';C。执行预览select*fromt_order_item;所有SQL路由到ds_1:说明:根据YAML配置中的分片规则,当database_value设置为奇数时,路由到ds_1,设置为偶数时,路由到ds_0.添加分片提示database_value;对于当前连接,为表t_order_item添加分片值。输入命令mysql>addshardinghintdatabase_valuet_order_item=5;输出效果A.设置成功,返回QueryOK,影响0行;b.执行showshardinghintstatus;t_order_item表对应的database_sharding_values的值显示为'5',sharding_type的值更新为'databases_tables';C。执行预览select*fromt_order_item;所有SQL路由到ds_1:再次输入add命令,添加一个偶数mysql>addshardinghintdatabase_valuet_order_item=10;输出效果:添加成功,响应QueryOK,影响0行;b.执行showshardinghintstatus;显示t_order_item表对应的database_sharding_values的值为'5,10':c.执行预览select*fromt_order_item;SQL路由包含ds_0和ds_1:(因为hint值包含奇数和偶数,包括所有目标数据源)addshardinghinttable_value;对于当前连接,为表t_order_item添加分片值。输入命令mysql>addshardinghinttable_valuet_order_item=0;输出效果A.设置成功,返回QueryOK,影响0行;b.执行showshardinghintstatus;t_order_item表对应的database_sharding_values的值显示为'5,10',table_sharding_values的值为'0':c.执行预览select*fromt_order_item;路由情况如下图,每个库只查询t_order_item_0:说明:根据YAML配置中的分片规则,当table_value设置为奇数时,路由到t_order_item_1,当设置Route为t_order_item_0时它是偶数。和addshardinghintdatabase_value类似,addshardinghintdatabase_value也可以设置多个提示值,覆盖更多的分片。clearshardinghint清除当前连接的分片提示设置。输入命令mysql>clearshardinghint;输出效果A.清算成功,返回QueryOK,0rowsaffectedb。将shardinghint的所有设置恢复到初始状态,通过showshardinghintstatus可以看到清晰的结果;命令。初始状态如下:clearhint这是一个特殊的命令,包括clearreadwrite_splittinghint和clearshardinghint的能力,清除所有读写分离和sharding的提示值,回到初始状态。任意设置hint值,然后执行命令mysql>clearhint;输出效果A.清除成功,响应QueryOK,0rowsaffectedb。将readwrite_splittinghint和shardinghint的所有设置恢复到初始状态,通过showreadwrite_splittinghintstatus;并显示分片提示状态;命令查看清除结果。*注意:特别注意:如果要使用Hint相关的DistSQL功能,需要开启ShardingSphere-Proxy的配置项proxy-hint-enabled。说明请参考:https://shardingsphere.apache...更多RAL语句包括原版具有SCTL语句的功能,RAL语句还提供了弹性伸缩、实例熔断、读写等实用的管理功能分离和阅读库禁用。欢迎读者前往官网阅读详细文档,了解更多RAL使用场景:https://shardingsphere。apache...结束语以上就是本次分享的全部内容。如果读者对ApacheShardingSphere有任何问题或建议,请将其放入GitHub问题列表,或提交PullRequest参与开源社区,欢迎在中文社区进行讨论。GitHubissue:https://github.com/apache/sha...贡献指南:https://shardingsphere.apache...中文社区:https://community.sphere-ex.com/参考资料[1]https://github.com/apache/sha...[2]https://github.com/apache/sha...欢迎第一时间关注公众号了解资讯