首批通过分布式安全可靠测评,为关键业务系统打造
二次路由
更新时间:2026-04-14 17:41:09
当 ODP 首次转发请求至 OBServer 节点,OBServer 节点判断会生成远程计划时,会回包告诉 ODP 可以执行该语句的副本位置,ODP 则根据此次回包重新转发。当您的读写请求产生大量远程计划时,可以开启 ODP 的二次路由功能,其可以有效减少远程计划带来的网络开销。
您可通过配置 ODP 配置项 ENABLE_REROUTE 为 True 开启二次路由,命令如下:
ALTER PROXYCONFIG SET ENABLE_REROUTE = True;
说明
仅 root@proxysys 账号和 root@sys 账号可执行 ALTER PROXYCONFIG 命令。
需要注意的是,仅以下场景支持二次路由。
事务首条语句
分布式事务路由
没有发生过二次路由
非大请求,即请求长度不大于 ODP 配置项
request_buffer_length未指定 Primary Zone
非指定 IP 路由
关闭 Cached Server
示例
此处以对路由不准的请求进行二次路由为例。
开启二次路由开关
ALTER PROXYCONFIG SET proxy_primary_zone_name=''; ALTER PROXYCONFIG SET enable_reroute = True; ALTER PROXYCONFIG SET enable_cached_server = False;创建表,执行一条无法正确计算路由的语句,如下所示。
创建表
obclient [test]> CREATE TABLE t_reroute(C1 INT) PARTITION BY HASH(C1) PARTITIONS 8;执行 SQL 语句
obclient [test]> SELECT * FROM t_reroute WHERE C1=substr('abc',1,2);
通过诊断日志查看路由选取过程
[2023-08-21 17:05:38.148301] [70901][Y0-00007F9A7B45A4E0] [ROUTE]((*route_diagnosis= Trans Current Query:"SELECT * FROM t_reroute WHERE C1=substr('abc',1,2)" Route Prompts > ROUTE_INFO [INFO] Will route to partition server or routed by route policy > PARTITION_ID_CALC_DONE [WARN] Fail to calculate first part idx Route Plan > SQL_PARSE:{cmd:"COM_QUERY", table:"t_reroute"} > ROUTE_INFO:{route_info_type:"USE_PARTITION_LOCATION_LOOKUP"} > LOCATION_CACHE_LOOKUP:{mode:"oceanbase"} > TABLE_ENTRY_LOOKUP_DONE:{table:"t_reroute", table_id:500030, partition_num:8, table_type:"USER TABLE", entry_from_remote:false} > PARTITION_ID_CALC_START:{} > EXPR_PARSE:{col_val:"C1=substr"} > RESOLVE_EXPR:{part_range:"[ab ; ab]"} > RESOLVE_TOKEN:{token_type:"TOKEN_FUNC", resolve:{"VARCHAR":"ab", collation:"utf8mb4_general_ci"}, token:"substr", expr_type:"OB_PROXY_EXPR_TYPE_FUNC_SUBSTR"} > CALC_PARTITION_ID:{error:-4226, part_description:"partition by hash(INT(binary)) partitions 8"} > PARTITION_ID_CALC_DONE:{error:-4226, partition_id:-1, level:1, partitions:"(p-1)"} > ROUTE_POLICY:{replica:"10.10.10.3:50111", idc_type:"SAME_IDC", zone_type:"ReadWrite", role:"FOLLOWER", type:"FULL", chosen_route_type:"ROUTE_TYPE_NONPARTITION_UNMERGE_LOCAL", route_policy:"MERGE_IDC_ORDER_OPTIMIZED", trans_consistency:"STRONG", session_consistency:"STRONG", proxy_idc_name:"zue"} > CONGESTION_CONTROL:{svr_addr:"10.10.10.3:50111"} > HANDLE_RESPONSE:{is_parititon_hit:"false", state:"CONNECTION_ALIVE"} > RETRY:{attempts:2, retry_status:"FOUND_EXISTING_ADDR", retry_type:"REROUTE", retry_addr:{10.10.10.2:50110}} > CONGESTION_CONTROL:{svr_addr:"10.10.10.2:50110"} > HANDLE_RESPONSE:{is_parititon_hit:"false", state:"CONNECTION_ALIVE"} )通过
> RETRY:{attempts:2, retry_status:"FOUND_EXISTING_ADDR", retry_type:"REROUTE", retry_addr:{10.10.10.2:50110}}可以看到在计算路由失败,转发给 OBServer 节点生成远程计划后,ODP 进行二次路由重试。