如何路由到只读型副本查询数据

【 使用环境 】生产环境
【 OB or 其他组件 】oceanbase
【 使用版本 】4.2.2.0
【问题描述】
目前在云上部署3个全能型副本,同时在本地部署了一个只读型副本。
image

每天有一部分数据统计sql需要执行,这部分sql对数据的一致性要求不高。由于sql质量不可控,希望通过路由到只读型副本执行。不占用线上的3个全能型副本的资源。
希望不需要每个sql执行前都设置弱一致性读
该如何配置

如果只读的SQL是单独通过一个应用发送的可以在单独部署一个OBProxy关联集群然后设置OBProxy参数 proxy_primary_zone_name 为只读副本,只读应用连接这个OBProxy
如果应用只有一套那么就只有配置 OBProxy参数 obproxy_read_consistency = 1 ,这样也能把单独的读请求路由到备,但是这种不一定会路由到只读副本上

强读 Primary Zone 路由-OceanBase 数据库代理-OceanBase文档中心-分布式数据库使用文档

OceanBase分布式数据库-海量数据 笔笔算数

1 个赞

通过OB的ODP功能可以设置,比如你把只读副本设置成sh1,然后在proxy里面设置只读全部路由到只读副本所在的地域即可,具体可以看一下官网相关配置:
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000819443

  1. 新建一个proxy,比容用zone4里的observer服务器,创建一个proxy:readonly_proxy,proxy版本3.1以上

  2. 修改proxy的参数:
    proxy_route_policy=‘follower_first/follower_only’;
    obproxy_read_consistency=1;
    proxy_idc_name=‘readonly’; --这个参数我这里的版本只能黑屏改,所以proxy集群有几个成员,都需要改一次,登录sys租户的root用户,进行修改

  3. 如果ocp里出现告警(Oceabase集群zone的IDC/Region是逻辑上的划分,当集群中IDC/Region信息变更后,需要在OCP metadb中手动进行同步,ocp中是没有weakread_sy这个idc信息的,所以会产生相关告警)
    –登录ocp的meta租户的ocp库,在相关表中新增IDC的信息
    MySQL [ocp]> insert into compute_idc(name,description,region_id) select ‘readonly’,‘readonly_idc’,id from compute_region where name = ‘sh’;
    MySQL [ocp]> commit;
    MySQL [ocp]> select * from compute_idc;
    MySQL [ocp]> update compute_host set idc_id = (select id from compute_idc where name = ‘readonly’) where inner_ip_address in (‘xxxx.xxxx.xxxx.xx’,‘xxxx.xxxx.xxxx.xx’,‘xxxx.xxxx.xxxx.xx’)
    –查看告警是否恢复

####测试环境验证充分,再上生产。
连接只读poroxy,执行一个sql,最好带hint,通过GV$SQL_AUDIT 进行检查是否在zone4上执行的

2 个赞

在这两篇博客里搜 “弱读” 关键字:

https://open.oceanbase.com/blog/12326664480

https://open.oceanbase.com/blog/5581452032

1 个赞

这个是 ODP 的 LDC 路由功能。
具体步骤如下:

    1. 确认一下 OB 集群节点 IDC 信息。
      虽然 OCP 里有展示,不过这个东西是 OB 内部数据,可以 SQL 修改。所以确认一下。
      登录 SYS 租户,查询
select zone, name, info from __all_zone where name in ('region','idc');
    1. 在 OCP 里部署一个新的 OBProxy 集群,其中 OBProxy 部署在 zone4 上。如果此前将 zone4 的 OBProxy 跟其他三个 OBProxy 部署到一起了,那在 OCP 里从那个 OBProxy 集群里删除这个 OBproxy 先。如果业务不能接受 zone4 上的OBProxy 删除重建,那方法另说。
    1. 从 Zone4 的 OBProxy 登录 OB 集群 (root@sys#集群名),确认 OBProxy 的 IDC 信息。
obclient -h xxx.yyy.zzz.www -uroot@sys#集群名 -P2883 -paaAA11__ -c -A
show proxyinfo idc;
show proxyconfig like '%idc%';  
    1. 进一步设置该 OBProxy 的 LDC 路由参数。
alter proxyconfig set proxy_idc_name='sh';
alter proxyconfig set obproxy_read_consistency=1;
show proxyconfig like '%proxy_idc_name%';

你这个例子里 region和idc 的名字取得不够好。

也可以在 OCP 里针对该 OBProxy 所在集群设置 OBProxy 参数。建议用 OCP 设置,有个记录。

    1. 观察业务读查询实际路由信息。

这个就是查看视图 gv$ob_sql_audit 定位到业务sql 所在记录的 server_ip 字段。

以上设置只对独立的查询(查询不用设置弱一致性读hint)有效。要求集群参数 ob_proxy_readonly_transaction_routing_policy 值为 false 。
如果 查询在事务中,则依然是走强一致性读,被路由到主副本所在节点。

如果照上面步骤做了,有什么不符合预期的地方可以提出来再讨论。

2 个赞