通过 SQL comment 进行强制路由

Hi, 社区的小伙伴们,我最近正在考虑增加 sql commnet hint 功能,有什么建议或者想法欢迎跟我讨论。

Hint 现状

  • 通过 java api 方式操作
  • 可以设置 sharding value 以及 对应算法从而自动计算出对应分片
  • 可以设置 只走主库

Sql hint 期望

  • 通过 comment 的方式来实现强制路由
  • 用户直接指定该 sql 期望执行的数据源和对应的真实表
  • 能够覆盖原 java api 功能

方案

  • 生成 rule
  • 支持 用户自定义匹配格式
  • 支持明确指定路由结果
  • 支持原 hint 方式,配合算法计算路由结果
  • 支持主库路由
/*hint ds1:logicTable->table1*/

select * from logicTable;
actualSql:: ds1: select * from table1;
2 个赞

你好,现在大部分的分表分库都是根据table的某个字段进行判断分表分库的规则,适用于大部分的电商场景,但在一些行业应用中,如果提供SAAS服务,大部分客户都无法接受这种分表分库的模式,他们对自己的数据要求完全掌控,甚至导出来到本地,所以按照分库模式做分表分库的设计还是比较合理,虽然资源占用多一些。
这样每个客户就是一个独立的数据库,通过SS这样的中间件,对数据库做路由,使得应用程序在拿到SQL的时候,根据客户ID类的标识,自动判断应该访问哪个数据库。这个以前在mycat里面是可以这样做的,希望SS也能提供类似的功能。Hint其实是可以的,您上面那个方案,看起来是可行,能否发一些更加详细的说明给我?谢谢,tony.wang@wisdom56.com

hi,我目前也遇到这样的需求,SaaS多租户数据隔离,也计划用SS来实现。目前暂时还没有思路。希望和你多多交流。

希望尽快优化一下federation,现在的功能太弱了,跨库查询的时候,好多sql语法都不兼容。

多多交流,互相学习

你说的多租户功能我大致了解了,其实现在也是可以通过 HintManager 来实现的。
https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/special-api/sharding/hint/
现在计划做的SQL Hint 功能就是通过增加注释的方式来指定数据库,不知道这种方式能否满足你的需求。具体方案还在设计中,晚点儿会贴过来

HintManager 我先看看这个。
现在计划做的SQL Hint 功能就是通过增加注释的方式来指定数据库==》没有理解增加注释是什么意思?

抱歉,写错了,是注解的方式。
就是说分库规则不是根据数据库表中的某个字段,而是根据登录的客户账号,我就锁定这个登录的客户的数据节点应该是哪一个。
如果在前端页面登录后,将自己的客户ID带到后台,这样后台就根据客户的ID,获取到该客户的数据库,可以通过拦截器拦截到SQL,加上/*DS=?? */类似模样的注解,这样SS执行SQL的时候,直接路由到DS制定的数据库中即可。
不知道我说清楚了没有。
这样对于业务系统来说,其实是很方便的,也不用做太大的系统改动,就可以完全做到数据库级别的多租户数据隔离
谢谢。

嗯嗯,我理解你的意思,这个计划应该是可以满足你的需求的

增加注释就是

例如
/*hint database=ds1*/select * from t_order

没错,大概就是这意思。
SQL Hint 通过增加注释的方式来指定数据库这个功能,大概啥时候能上线呢?期待啊

很期待这个功能的上线。

由这个问题引申出来另外一个问题,proxy不支持不同库同表名的场景。原因是路由是按照表名称进行路由查找,如果表同名路由就会有问题。我的想法是能否在url地址上带上primary_ds=ds1这样的参数,发现有同名表可以强行路由,不知道大家有没有更好的想法。

理论上如果把 proxy 当作一个数据库使用的话,应该是不允许重复表的。目前这种加上注释指定数据源的方案其实也是可以实现你说的功能吧?

这个就要看每个人都proxy的理解了,我想的是有了一个庞大的proxy集群,应用就可以完全忽略后端真实的数据库当一个云数据库来用,多个应用连接同一个云数据库,隔离的问题是proxy应该考虑的。
注解的方案可以解决问题,但是多个应用并不知道别人是否有和自己存在同名表,第二个,在sql层级写注解粒度太细的话要在很多地方都写。

嗯嗯,我理解你的意思,是期望 ShardingSphere 可以支持同名表的路由吧?
不过对于在 url 上添加参数的这种方式我感觉可能不怎么通用。

是的,我觉得ss可以考虑支持同名表路由。因为这个行为和客户端相关通过url添加参数控制个人感觉也是一个较为通用的做法,当然最终以什么样的方式实现可以探讨下。

嗯嗯,好的,感谢反馈 :grinning:

@liuzhu @yw1 @YoungHu 可以试试我们做的第一版强制路由的功能,看看是否满足你们的需求 :grinning:
https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/special-api/sharding/hint/

你好,这些功能都挺好,看起来应该是可以试试。
有没有强制路由结合springboot的完整例子?实现那种基于Hint的数据库级别的路由?谢谢。

京ICP备2021015875号