《DistSQL:像数据库一样使用 Apache ShardingSphere》一文中,PMC 孟浩然为大家介绍了 DistSQL 的设计初衷和语法体系,并通过实战操作展示了一条 SQL 创建分布式数据库表的强大能力,展现了 Apache ShardingSphere 在新形态下的交互体验。
近期,ShardingSphere 社区对 SCTL 语法和执行引擎进行了重构,使 SCTL 完全投入 DistSQL 语法体系的怀抱,将原 SCTL 功能融入到 RAL 语法中,使 ShardingSphere 管理语言更加统一。本文将带领读者深入了解这次重构的意义,并通过实例一一解析新的 RAL 语句,感受 ShardingSphere 让用户体验更加美好的追求态度。

作者简介

江龙滔
SphereEx 中间件研发工程师,Apache ShardingSphere Committer。 目前主要负责 DistSQL 及权限相关特性的设计和研发。
 
兰城翔
SphereEx 中间件研发工程师,Apache ShardingSphere Contributor。 目前专注于 DistSQL 的设计和研发。

前情回顾:什么是 RAL

RAL 是 DistSQL 语法的一个分类,DistSQL 包含了 RDL、RQL 和 RAL 这三种具体类型。
  • RDL(Resource & Rule Definition Language)负责资源和规则的创建、修改和删除;
  • RQL(Resource & Rule Query Language)负责资源和规则的查询和展现;
  • RAL(Resource & Rule Administration Language)提供对资源和规则的高级控制能力。

什么是 SCTL

SCTL(ShardingSphere Control Language)是 Apache ShardingSphere 的控制语言,负责 Hint、事务类型切换、分片执行计划查询等增量功能的操作。
 
SCTL 包含以下语法:
语句
说明
sctl:set transaction_type=XX
修改当前连接的事务类型, 支持 LOCAL,XA,BASE。例:sctl:set transaction_type=XA
sctl:show transaction_type
查询当前连接的事务类型
sctl:show cached_connections
查询当前连接中缓存的物理数据库连接个数
sctl:explain SQL
查看逻辑 SQL 的执行计划,例:sctl:explain select * from t_order;
sctl:hint set PRIMARY_ONLY=true
针对当前连接,是否将数据库操作强制路由到主库
sctl:hint set DatabaseShardingValue=yy
针对当前连接,设置 hint 仅对数据库分片有效,并添加分片值,yy:数据库分片值
sctl:hint addDatabaseShardingValue xx=yy
针对当前连接,为表 xx 添加分片值 yy,xx:逻辑表名称,yy:数据库分片值
sctl:hint addTableShardingValue xx=yy
针对当前连接,为表 xx 添加分片值 yy,xx:逻辑表名称,yy:表分片值
sctl:hint clear
针对当前连接,清除 hint 所有设置
sctl:hint show status
针对当前连接,查询 hint 状态,primary_only:true/false,sharding_type:databases_only/databases_tables
sctl:hint show table status
针对当前连接,查询逻辑表的 hint 分片值

为何重构

1、SCTL 功能实现于 v3.1.0 时期[1],彼时 ShardingSphere 还没有提出 DistSQL 的概念。如今,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],前后变化如下表所示:
调整前
调整后
sctl:set transaction_type=XX
set variable transaction_type=XX
sctl:show transaction_type
show variable transaction_type
sctl:show cached_connections
show variable cached_connections
sctl:explain SQL
preview SQL
sctl:hint set PRIMARY_ONLY=true
set readwrite_splitting hint source = [auto / write]
sctl:hint set DatabaseShardingValue=yy
set sharding hint database_value = yy;
sctl:hint addDatabaseShardingValue xx=yy
add sharding hint database_value xx= yy;
sctl:hint addTableShardingValue xx=yy
add sharding hint table_value xx = yy
sctl:hint clear
clear [hint / sharding hint / readwrite_splitting hint]
sctl:hint show status
show [sharding / readwrite_splitting] hint status
sctl:hint show table status
归入 【show sharding hint status】
下面让我们对这些语句一一进行解析:
show variable transaction_type
查询当前连接的事务类型
  • 输入命令
mysql> show variable transaction_type;  
  • 输出效果
+------------------+
| TRANSACTION_TYPE |
+------------------+
| LOCAL |
+------------------+
set variable transaction_type
修改当前连接的事务类型,支持的类型有:LOCAL, XA, BASE(不区分大小写)。
  • 输入命令
mysql> set variable transaction_type=XA;
  • 输出效果
a. 设置成功,响应 Query OK, 0 rows affected;
b. 再次执行 show variable transaction_type; 显示事务类型已经改变为 XA;
 
show variable cached_connection
查询当前连接中缓存的物理数据库连接个数。
  • 输入命令
mysql> show variable cached_connections;
  • 输出效果
+--------------------+
| CACHED_CONNECTIONS |
+--------------------+
| 0 |
+--------------------+
preview SQL
预览实际 SQL。此处以读写分离场景为例,preview 语法支持任意 SQL 语句。
  • 输入命令
mysql> preview select * from t_order;
  • 输出效果
+-----------------+----------------------------------------------+
| datasource_name | sql |
+-----------------+----------------------------------------------+
| read_ds_0 | select * from t_order ORDER BY order_id ASC |
| read_ds_1 | select * from t_order ORDER BY order_id ASC |
+-----------------+----------------------------------------------+
*注:以下为读写分离场景 Hint 示例,示例中使用了读写分离 + 分片的规则配置,配置如下:
rules:
- !READWRITE_SPLITTING
dataSources:
ds_0:
writeDataSourceName: write_ds_0
readDataSourceNames:
- read_ds_0
ds_1:
writeDataSourceName: write_ds_1
readDataSourceNames:
- read_ds_1
- !SHARDING
tables:
t_order:
actualDataNodes: ds_${0..1}.t_order
defaultDatabaseStrategy:
standard:
shardingColumn: user_id
shardingAlgorithmName: database_inline
defaultTableStrategy:
none:
shardingAlgorithms:
database_inline:
type: INLINE
props:
algorithm-expression: ds_${user_id % 2}
show readwrite_splitting hint status
针对当前连接,查询 readwrite_splitting 的 hint 状态。
  • 输入命令
mysql> show readwrite_splitting hint status;
  • 输出效果
+--------+
| source |
+--------+
| auto |
+--------+
set readwrite_splitting hint source
针对当前连接,设置读写分离的路由策略(自动路由或强制到写库)。
source 支持的类型有:AUTO , WRITE(不区分大小写)
  • AUTO:读写分离自动路由
  • WRITE:强制路由到主库
 
  • 输入命令
mysql> set readwrite_splitting hint source=write;
  • 输出效果
a. 设置成功,响应 Query OK, 0 rows affected;
b. 再次执行 show readwrite_splitting hint status; 显示 source 值已经改变为 write;
c. 执行 preview select * from t_order; 能够看到查询 SQL 将会路由到主库:
mysql> preview select * from t_order;
+-----------------+----------------------------------------------+
| datasource_name | sql |
+-----------------+----------------------------------------------+
| write_ds_0 | select * from t_order ORDER BY order_id ASC |
| write_ds_1 | select * from t_order ORDER BY order_id ASC |
+-----------------+----------------------------------------------+
clear readwrite_splitting hint
针对当前连接,清除 readwrite_splitting 的 hint 设置。
  • 输入命令
mysql> clear readwrite_splitting hint;
  • 输出效果
a. 清除成功,响应 Query OK, 0 rows affected
b. 将 readwrite_splitting hint 的所有设置恢复到初始状态,可通过 show readwrite_splitting hint status; 命令查看 clear 的结果。
*注:以下为分片场景 Hint 示例,分库和分表均使用了 Hint 算法,使用的分片配置如下:
rules:
- !SHARDING
tables:
t_order_item:
actualDataNodes: ds_${0..1}.t_order_item_${0..1}
databaseStrategy:
hint:
shardingAlgorithmName: database_inline
tableStrategy:
hint:
shardingAlgorithmName: table_inline
shardingAlgorithms:
database_inline:
type: HINT_INLINE
props:
algorithm-expression: ds_${Integer.valueOf(value) % 2}
table_inline:
type: HINT_INLINE
props:
algorithm-expression: t_order_item_${Integer.valueOf(value) % 2}
show sharding hint status
针对当前连接,查询 sharding 的 hint 状态。
  • 输入命令
mysql> show sharding hint status;
  • 输出效果
以下是初始状态的输出值:
  • 验证查询路由,输入命令
preview select * from t_order_item;
  • 输出效果
此时没有 hint 值,查询使用全路由
set sharding hint database_value;
针对当前连接,设置 hint 仅对数据库分片有效,并添加分片值 1。
  • 输入命令
mysql> set sharding hint database_value = 1;
  • 输出效果
a. 设置成功,响应 Query OK, 0 rows affected;
b. 执行 show sharding hint status; 显示 t_order_item 表对应的 database_sharding_values 值为 '1', 且 sharding_type 值更新为 'databases_only';
c. 执行 preview select * from t_order_item; SQL 全部路由到 ds_1:
说明:根据 YAML 配置中的分片规则,当 database_value 设置为奇数时路由到 ds_1,设置为偶数时路由到 ds_0。
add sharding hint database_value;
针对当前连接,为表 t_order_item 添加分片值。
  • 输入命令
mysql> add sharding hint database_value t_order_item = 5;
  • 输出效果
a. 设置成功,响应 Query OK, 0 rows affected;
b. 执行 show sharding hint status; 显示 t_order_item 表对应的 database_sharding_values 值为 '5',且 sharding_type 值更新为 'databases_tables';
c. 执行 preview select * from t_order_item; SQL 全部路由到 ds_1:
  • 再次输入 add 命令,添加一个偶数值
mysql> add sharding hint database_value t_order_item = 10;
  • 输出效果:
a. 添加成功,响应 Query OK, 0 rows affected;
b. 执行 show sharding hint status; 显示 t_order_item 表对应的 database_sharding_values 值为 '5,10':
c. 执行 preview select * from t_order_item; SQL 路由包含了 ds_0 和 ds_1:(因为 hint 值包含奇数和偶数,将目标数据源全部包含在内)
add sharding hint table_value;
针对当前连接,为表 t_order_item 添加分片值。
  • 输入命令
mysql> add sharding hint table_value t_order_item = 0;
  • 输出效果
a. 设置成功,响应 Query OK, 0 rows affected;
b. 执行 show sharding hint status; 显示 t_order_item 表对应的 database_sharding_values 值为 '5,10',table_sharding_values 的值为 '0':
c. 执行 preview select * from t_order_item; 路由情况如下图,每个库只查询 t_order_item_0:
说明:根据 YAML 配置中的分片规则,当 table_value 设置为奇数时路由到 t_order_item_1,设置为偶数时路由到 t_order_item_0。
add sharding hint database_value 类似,add sharding hint database_value 也可以设置多个 hint 值,以覆盖更多的分片。
clear sharding hint
针对当前连接,清除 sharding 的 hint 设置。
  • 输入命令
mysql> clear sharding hint;

输出效果

a. 清除成功,响应 Query OK, 0 rows affected
b. 将 sharding hint 的所有设置恢复到初始状态,可通过 show sharding hint status; 命令查看 clear 的结果。初始状态如下:
clear hint
这是一个特殊的指令,包含 clear readwrite_splitting hintclear sharding hint 的能力,将读写分离和分片的 hint 值全部清除,回归初始状态。
  • 任意设置 hint 值,再执行命令
mysql> clear hint;
  • 输出效果
a. 清除成功,响应 Query OK, 0 rows affected
b. 将 readwrite_splitting hint 和 sharding hint 的所有设置恢复到初始状态,可通过 show readwrite_splitting hint status; 和 show sharding hint status; 命令查看 clear 的结果。
 
*注:特别说明:若需使用 Hint 相关 DistSQL 功能,需要启用 ShardingSphere-Proxy 的配置项 `proxy-hint-enabled`,说明信息请参考:

更多 RAL 语句

除了包含原有 SCTL 语句的功能,RAL 语句还提供弹性伸缩、实例熔断、读写分离读库禁用这样的实用管理功能,欢迎读者前往官网阅读详细文档,了解 RAL 的更多使用场景: https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-proxy/distsql/syntax/ral/

结语

以上就是本次分享的全部内容,如果读者对 Apache ShardingSphere 有任何疑问或建议,欢迎在 GitHub issue 列表提出,也可提交 Pull Request 参与到开源社区,也欢迎在中文社区中讨论。
 
 
 
 
参考信息

欢迎关注公众号第一时间了解咨讯

 

SCTL 涅槃重生:投入 RAL 的怀抱的更多相关文章

  1. 魏永明: MiniGUI的涅槃重生之路

    本文系转载,著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 魏永明 来源: 微信公众号linux阅码场(id: linuxdev) 本文背景 MiniGUI是最负盛名的 ...

  2. Pandoanload涅槃重生,小白羊重出江湖?

    Pandoanload涅槃重生,小白羊重出江湖? 科技是把双刃剑,一方面能够砸烂愚昧和落后,另一方面也可能带给人类无尽的灾难. 原子物理理论的发展是的人类掌握了核能技术但是也带来了广岛和长崎的核灾难, ...

  3. 投入机器学习的怀抱?先学Python吧

    前两天写了篇文章,给想进程序员这个行当的同学们一点建议,没想到反响这么好,关注和阅读数都上了新高度,有点人生巅峰的感觉呀.今天趁热打铁,聊聊我最喜欢的编程语言——Python. 为什么要说Python ...

  4. 投入Html5的怀抱,最近在研究的Egret

    html5没有办法不关注,实在太火热了,几年前还不行,如今确是环境较好,typescript语言很好学习,可能基于之前的基础,不到一个星期就基本上差不多了,虽然还有一些小问题,但那都是经验积累下来可以 ...

  5. 垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想

    Delphi 是一个基本上被我遗忘的工具, 要不是在使用RapidSql , 我是收不到Embarcadero 公司发出的邀请来參加Delphi XE5的公布会的. 有人可能要问为什么是Embarca ...

  6. 垂死或涅槃重生 -- Delphi XE5 我们将宣布感情的回归

    Delphi 在很大程度上是一个被遗忘我的工具. 无论是在使用RapidSql , 我还没有收到Embarcadero 本公司发行参与邀请Delphi XE5该公告将. 可能有人会问,为什么Embar ...

  7. 投入OJ的怀抱~~~~~~~~~~

    OpenJudge C20182024 信箱(1) 账号 修改设定 退出小组 管理员 frank 林舒 Dzx someone 李文新 公告 11-05 程序设计与算法(大学先修课) 成员(61910 ...

  8. 如何在 ShardingSphere 中开发自己的 DistSQL

    在<DistSQL:像数据库一样使用 Apache ShardingSphere>和<SCTL 涅槃重生:投入 RAL 的怀抱>中,已经为大家介绍了 DistSQL 的设计初衷 ...

  9. 已经被cocos2dx给折腾的想要放弃它,专注Unity3D的怀抱了!

    一直使用cocos2dx编写自己的2D小游戏,不得不说,编写个人的超级小规模的游戏,使用cocos2dx有一定的优势,首先门槛很低,编写2D游戏用起来也算顺手,可惜一直没有一个优秀的UI编辑器,好不容 ...

随机推荐

  1. Postman快速入门

        Postman是一款非常流行的支持HTTP/HTTPS协议的接口调试与测试工具,其功能非常强大,易用. 1 基础知识 1.1 下载与安装     Postman的安装步骤,本例以Windows ...

  2. oracle数据导入"HIST_GRAM_LIST_ITEM"问题处理

    1.问题显示 处理对象类型 SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT ORA-39083: 对象类型 REF_CONSTRAINT 创建失败, 出现错 ...

  3. 阿里P8面试官:如何设计一个扛住千万级并发的架构?

    大家先思考一个问题,这也是在面试过程中经常遇到的问题. 如果你们公司现在的产品能够支持10W用户访问,你们老板突然和你说,融到钱了,会大量投放广告,预计在1个月后用户量会达到1000W,如果这个任务交 ...

  4. MyBatis原生批量插入的坑与解决方案!

    前面的文章咱们讲了 MyBatis 批量插入的 3 种方法:循环单次插入.MyBatis Plus 批量插入.MyBatis 原生批量插入,详情请点击<MyBatis 批量插入数据的 3 种方法 ...

  5. 【HMS Core 6.0全球上线】华为钥匙环服务,打造跨应用跨形态无缝登录体验

    华为钥匙环服务(Keyring),是HMS Core在安全领域开放的全新服务,为全球开发者提供用户认证凭据(以下简称"凭据")本地存储和跨应用.跨形态共享能力,帮助您在安卓应用.快 ...

  6. 在hive中使用COALESCE进行空值处理

    COALESCE (expression_1, expression_2, ...,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值.如果所有的表达式都是空值,最终将返 ...

  7. 【UE4 C++ 基础知识】<15> 智能指针 TSharedPtr、UniquePtr、TWeakPtr、TSharedRef

    基本概念 UE4 对 UObject 对象提供垃圾回收 UE4 对原生对象不提供垃圾回收,需要手动进行清理 方式 malloc / free new / delete new与malloc的区别在于, ...

  8. Java RMI学习与解读(一)

    Java RMI学习与解读(一) 写在前面 本文记录在心情美丽的一个晚上. 嗯.就是心情很美丽. 那为什么晚上还要学习呢? emm... 卷... 卷起来. 全文基本都是根据su18师傅和其他师傅的文 ...

  9. MySQL:提高笔记-2

    MySQL:提高笔记-2 学完基础的语法后,进一步对 MySQL 进行学习,第一篇为:MySQL:提高笔记-1,这是第二篇内容 说明:这是根据 bilibili 上 黑马程序员 的课程 mysql入门 ...

  10. 【二食堂】Beta - Scrum Meeting 2

    Scrum Meeting 2 例会时间:5.14 18:30~18:50 进度情况 组员 当前进度 今日任务 李健 1. 还在进行摸索,目前做出了一个demo可以进行简单的划词 issue 1. 继 ...