背景
在 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。
此时疑问:
-
DBA 要维护一张没有规则的表,不知从哪里找?
-
多个数据库的表结构不同,运维操作有点麻烦。
-
基于以上原因,社区有用户询问 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 RULE
与 defaultDataSourceName
的配置又有不同之处:
- ShardingSphere 加载元数据并不会使用
DEFAULT SINGLE TABLE RULE
,依然会识别所有数据源上的 SingleTable - 得益于 DistSQL 的优势,用户可以随时添加、修改、移除
DEFAULT SINGLE TABLE RULE
,实时生效无需重启。
DistSQL 语法文档:
最后
以上就是本次对 DEFAULT SINGLE TABLE RULE
的解析,欢迎使用 DistSQL。
订正
DEFAULT SINGLE TABLE RULE
相关功能是 5.0.0 打包之后合并到 master 分支的,因此要在 5.0.1 才能正式发布,目前如果您有需要,请从 master 分支编译体验。
转载请注明来自 SphereEx 中文论坛 https://community.sphere-ex.com/