obproxy 多表路由问题

select * from t1; insert into t2 values;

请问client发送这样的语句到obproxy, 按表t1来路由还是表t2来路由呢?proxy是发送到t1的observer上呢还是t2 上observer呢?

默认情况下,第一条select路由到t1主副本所在节点,第二条insert路由到t2表主副本所在节点。
由 ob_proxy_readonly_transaction_routing_policy参数控制,4.x默认为false,3.x默认为true。
参考https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000820852

这是两条语句了啊,应该是分开路由才对 :rofl:

obproxy parser SQL进行路由选择server时,有以下特点:
1、只解析Begin/START/TRANSACTON/SET/和其他DML,如果遇到其他单词开头的语句,proxy的parser会直接跳过,认为该语句不包含表名;

2、proxy parser会按照第一条包含实体表名的stmtement进行路由,如果整个stmtement都不包含表名,则会将请求发送至上一条SQL所发送的server。

所以第一条select路由到t1主副本所在节点,第二条insert路由到t2表主副本所在节点;

3、如果是如下语句的话,create table 则会发送到t1所在的server
select * from t1; create table t2 (id int );

4、 ob_proxy_readonly_transaction_routing_policy可以用来控制事务的路由是否受只读语句的影响,具体的取值建议查阅对应的版本说明为准。

当然自己有环境的建议做个实验验证的得出的结论更直观。