proxy_primary_zone_name

租户的primary_zone是必须配置的,既然租户都配置了primary_zone,那么obproxy的proxy_primary_zone_name有存在的必要吗?

obproxy的proxy_primary_zone_name,指的是必须读取数据的主副本?

这个参数是用户设置LDC路由策略的。
可以浏览下下面这篇文章
https://open.oceanbase.com/blog/12326664480

意思是 proxy_primary_zone_name 就可以用于强读 ,也可以用于弱读 ?

它这个文档里的 随机路由 ,是不是在乱说 , 这明明是 proxy_route_policy啊, 怎么就是随机路由了? 随机路由指的是按照规则,在leader副本和follower副本里,随机选定一个副本啊。proxy_route_policy诊断的只是follower副本啊。

按照我自己做的测试验证,配置proxy_primary_zone_name为某个zone的idc后,使用该proxy的连接上的所有sql都会强制路由转发到该zone上,当该zone内的server状态异常时,sql报错

1 个赞

proxy_primary_zone_name指定该参数时,我理解的是直接使用强制路由策略,而不考虑proxy_route_policy的路由策略

我的理解是 proxy_primary_zone_name 只用于强读,必须去读leader副本。 但前面一个OB官方大哥说proxy_primary_zone_name也用于弱读,我懵逼了。

不是强读,是强制路由,不区分强读还是弱读

抱歉 这边描述有问题,这个参数是强制性的路由,意思无论强弱都访问指定节点

但是啊,我做了一个实验,

alter proxyconfig set proxy_primary_zone_name = ‘zone3’;
ZONE3的IP地址是10.11.253.64。

explain route select /+read_consistency(weak)/ * from t1 where tid=2002;
按理说,这个时候,它应该路由到10.11.253.64,并且10.11.253.64本来就是follower副本。

但实际上,它却路由到10.11.253.66, 它也是一个follower副本。

把执行计划发出来看一下,去掉hint呢

稍等, 几个月没看OB了,好费劲啊

学习一下 赞一个

explain route select /*+read_consistency(weak) */ * from t1 where tid=2001;

tid=2001这条记录的leader副本在10.10.1.71,follower副本在10.10.1.72/10.10.1.73。

LOCATION_CACHE_LOOKUP:{mode:“oceanbase”}
TABLE_ENTRY_LOOKUP_DONE:{table:“t1”, table_id:“500002”, table_type:“USER TABLE”, partition_num:3, entry_from_remote:false}
略…
PARTITION_ENTRY_LOOKUP_DONE:{leader:“10.10.1.71:2881”, entry_from_remote:false}
ROUTE_POLICY:{replica:“10.10.1.71:2881”,role:“LEADER”,proxy_primary_zone:“zone1”,session_consistency:“WEAK”}
CONGESTION_CONTROL:{svr_addr:“10.10.1.71:2881”}
HANDLE_RESPONSE:{is_parititon_hit:“true”, send_action:“SERVER_SEND_REQUEST”, state:“CMD_COMPLETE”}
)

我明明要求它访问follower副本,结果它去访问leader副本了。

是查询sql么,DML会去进行二次路由到主副本执行。
下面是通过proxy修改弱读配置:

修改OBProxy配置项实现:通过 Hint 的方式设置弱读需要修改 SQL,修改 SQL 会有一定的业务侵入性,为了不侵入业务,可以指定连接某个OBProxy的所有请求都为弱一致性读,修改方式如下:

通过要设置为弱一致性读的OBProxy连接到数据库,执行如下命令进行修改

alter proxyconfig set obproxy_read_consistency = 1;

该配置项取值为 0 和 1,默认为 0,表示强读(需要读到最新的数据)。1 表示弱读。

开启弱一致性读只是配置读写分离的第一步,在开启弱一致性读时,如果没有设置LDC策略,所有的请求还是会按照最开始讲到的 OBProxy 路由策略,优先发送到primary zone,如果未设置primary zone,即primary zone为random,那么请求会按照随机路由的策略,随机发送到任意副本,因此时有可能发送到 Leader 副本,并未实现完全的读写分离。

设置LDC路由策略

alter proxyconfig set proxy_idc_name=‘idc1’;

FOLLOWER_FIRST设置

在设置了LDC路由策略之后,弱一致性的读请求只会就近访问,为了保证弱一致性的读请求能够优先路由到Follower 副本上,还需要对OBProxy设置 proxy_route_policy 参数,这个参数有两个值:

  • FOLLOWER_FIRST:优先发往备副本,如果无备副本可用则发往主副本。
  • FOLLOWER_ONLY:只能发往备副本,如果无备副本可用则报错。

设置方式如下,通过连接OBProxy,执行如下命令

obclient [oceanbase]> alter proxyconfig set proxy_route_policy="follower_first";
Query OK, 0 rows affected (0.005 sec)

obclient [oceanbase]> show proxyconfig like "%proxy_route_policy%";
+--------------------+----------------+--------------------+-------------+---------------+
| name               | value          | info               | need_reboot | visible_level |
+--------------------+----------------+--------------------+-------------+---------------+
| proxy_route_policy | follower_first | proxy route policy | false       | SYS           |
+--------------------+----------------+--------------------+-------------+---------------+
1 row in set (0.002 sec)

通过以上的设置,那么就可以实现弱一致性的优先访问 follower 副本的策略。