DistSQL 实用技巧系列:DEFAULT SINGLE TABLE RULE 详解

背景

在 ShardingSphere 中,TABLE 可以分为「有配置」和「无配置」两种。

这里「有配置」是指有明确的针对表的配置,不包含全局配置

  • 有配置:例如分片表,通过配置的规则可以知道这张逻辑表会分布在哪些数据源上。
  • 无配置:没有为表指定规则,不能通过配置知道该表的分布信息。

那么,如果用户输入的 SQL 需要查询「无配置」的表,ShardingSphere 应该如何路由呢?

5.0.0 之前

在 5.0.0 版本之前,ShardingSphere 为用户提供了一个配置项:

defaultDataSourceName: ds0

这相当于让用户告诉 ShardingSphere:ds_0 是默认的数据源,不知道路由到哪里就走这里吧。

但此时若在 ds_1 上也有一张「未配置」的表 t_another,则用户是无法通过 ShardingSphere 操作 t_another 的。

4.1.1 配置文档:
Yaml配置 :: ShardingSphere

5.0.0 之后

不过,从 5.0.0 版本开始,ShardingSphere 改进了对「未配置」表的支持,将这些表称为 SingleTable。并且,ShardingSphere 能自动加载每个数据源上的 SingleTable 元数据,这样,用户不用提供特殊的配置,ShardingSphere 也能知道每张表分布在哪里,不再需要 defaultDataSourceName 这样的配置了。因此,在 5.0.0 版本中,defaultDataSourceName 配置项已经被移除。

问题

虽然移除 defaultDataSourceName 是为了简化配置,从此用户可以将一切交给 ShardingSphere 自动处理,但在实际使用中,还是有用户提出了新的问题:

  • 若需要通过 CREATE TABLE 语句创建一张新表,而这张表是没有配置规则的,那么会按照 SingleTable 处理,创建时路由到随机的一个数据源,如 ds_3。

    此时疑问:我刚才创建的表会在哪个数据源?

  • 用户再次通过 CREATE TABLE 语句创建一张新表,随机到了数据源 ds_4。

    此时疑问:为什么和刚才存放的库不一样?

  • 当这样的 CREATE TABLE 场景多次发生以后,用户的不同数据源上可能都会存在 SingleTable。

    此时疑问:

    1. DBA 要维护一张没有规则的表,不知从哪里找?

    2. 多个数据库的表结构不同,运维操作有点麻烦。

基于以上原因,社区有用户询问 5.0.0 如何配置 defaultDataSourceName

解答

对于以上提出的问题,DistSQL 提供了一个处理办法:DEFAULT SINGLE TABLE RULE
即为 SingleTable 配置一个默认的 RULE,类似于之前 defaultDataSourceName 的功效。语法如下:

CREATE DEFAULT SINGLE TABLE RULE RESOURCE = ds_0

ALTER DEFAULT SINGLE TABLE RULE RESOURCE = ds_1

DROP DEFAULT SINGLE TABLE RULE

CREATE DEFAULT SINGLE TABLE RULE 之后,可以预知创建的 SingleTable 分布在哪里,也可以让用户创建的 SingleTable 集中分布在一个数据源上。
不过,DEFAULT SINGLE TABLE RULEdefaultDataSourceName 的配置又有不同之处:

  • ShardingSphere 加载元数据并不会使用 DEFAULT SINGLE TABLE RULE,依然会识别所有数据源上的 SingleTable
  • 得益于 DistSQL 的优势,用户可以随时添加、修改、移除 DEFAULT SINGLE TABLE RULE,实时生效无需重启。

DistSQL 语法文档:

单表 :: ShardingSphere

最后

以上就是本次对 DEFAULT SINGLE TABLE RULE 的解析,欢迎使用 DistSQL。

订正

DEFAULT SINGLE TABLE RULE 相关功能是 5.0.0 打包之后合并到 master 分支的,因此要在 5.0.1 才能正式发布,目前如果您有需要,请从 master 分支编译体验。

转载请注明来自 SphereEx 中文论坛 https://community.sphere-ex.com/

2 个赞

请问使用的是哪个版本?

@zhuhongwen
我检查了一下,这是 5.0.0 打包之后合并的功能,因此准确的说 DEFAULT SINGLE TABLE RULE 要在 5.0.1 才能正式发布,现在用户可以从 master 分支进行编译体验。
相关 issue:

我将对帖子内容进行订正,感谢您的反馈!

apache-shardingsphere-5.0.0-shardingsphere-proxy-bin.tar.gz

增加了订正信息,目前您可以从 master 分支编译使用该功能。

京ICP备2021015875号