首批通过分布式安全可靠测评,为关键业务系统打造
指定 IP 路由
更新时间:2026-04-14 17:41:09
指定 IP 路由方式下 ODP 会将 SQL 请求直接路由到指定的 OBServer 节点,指定的方式有如下两种。
通过 ODP 配置项
target_db_server指定,配置格式为'ip:port,ip:port, ...;ip:port,ip:port, ... ;ip:port,ip:port, ...'。使用英文逗号(,)分隔两个地址,使用英文分号(;)对若干个地址分组,英文分号(;)左边的地址分组优先级较高,地址分组内优先级随机。通过 SQL 语句注释指定,语法为
/* TARGET_DB_SERVER = 'addrs' */ executable_sql;。
本节通过两个示例分别介绍两种指定方法。
示例一:通过配置项指定 IP
执行如下命令使用 root@proxysys 用户登录 ODP。
obclient -h10.10.10.1 -uroot@proxysys -P2883 -p -c通过配置项指定 IP 路由,此处以首个分组使用非法地址,第二组使用合法地址为例。
obclient [(none)]> ALTER PROXYCONFIG SET target_db_server = '127.0.0.1:2993,127.0.0.1:2994;10.10.10.1:50109';使用用户租户登录 OceanBase 数据库,执行 SQL 语句触发路由,此处以执行
SELECT 888;为例。obclient [test]> SELECT 888;通过诊断日志查看路由选取过程。
[~/cl-deploy/log]$ tail -n1 obproxy_diagnosis.log | sed "s/\/n/\n/g"输出如下,SQL 语句经过多轮重试最终被路由到 10.10.10.1:50109。
[2023-08-21 16:12:50.404037] [56910][Y0-00007FDF4FB404E0] [ROUTE]((*route_diagnosis= Trans Current Query:"SELECT 888" Route Prompts > SQL_PARSE [INFO] Maybe counldn't get location cache of the query table since table name is empty. > ROUTE_INFO [INFO] Will route target db server and loopback addr (127.0.0.1:2993) wouldn't do congestion control > CONGESTION_CONTROL [INFO] This replica(127.0.0.1:2993) is no need to pass congestion control > CONGESTION_CONTROL [INFO] This replica(127.0.0.1:2994) is no need to pass congestion control Route Plan > SQL_PARSE:{cmd:"COM_QUERY", table:""} > ROUTE_INFO:{route_info_type:"USE_CONFIG_TARGET_DB", svr_addr:"127.0.0.1:2993"} > CONGESTION_CONTROL:{svr_addr:"127.0.0.1:2993", need_congestion_lookup:false} > HANDLE_RESPONSE:{is_parititon_hit:"false", state:"CONNECT_ERROR"} > RETRY:{attempts:2, retry_status:"FOUND_EXISTING_ADDR", retry_type:"CONF_TARGET_DB_SERVER", retry_addr:{127.0.0.1:2994}} > CONGESTION_CONTROL:{svr_addr:"127.0.0.1:2994", need_congestion_lookup:false} > HANDLE_RESPONSE:{is_parititon_hit:"false", state:"CONNECT_ERROR"} > RETRY:{attempts:3, retry_status:"FOUND_EXISTING_ADDR", retry_type:"CONF_TARGET_DB_SERVER", retry_addr:{10.10.10.1:50109}} > CONGESTION_CONTROL:{svr_addr:"10.10.10.1:50109"} > HANDLE_RESPONSE:{is_parititon_hit:"false", state:"CONNECTION_ALIVE"} )使用 root@proxysys 用户登录 ODP 后,执行如下命令将配置项重置。
obclient [(none)]> ALTER PROXYCONFIG SET TARGET_DB_SERVER = '';
示例二:通过 SQL 语句注释指定 IP
执行如下命令使用用户租户登录 OceanBase 数据库,此处以用户租户为 root@test 为例。
obclient -h10.10.10.1 -uroot@test -P2883 -p -c通过 SQL 语句注释使用指定 IP 路由,此处以执行
SELECT 888;为例。obclient [test]> /* TARGET_DB_SERVER = '127.0.0.1:2993,127.0.0.1:2994;10.10.10.1:50109' */ SELECT 888;通过诊断日志查看路由选取过程。
[~/cl-deploy/log]$ tail -n1 obproxy_diagnosis.log | sed "s/\/n/\n/g"输出如下,SQL 语句经过多轮重试最终被路由到 10.10.10.1:50109。
[2023-08-21 16:09:39.564334] [56910][Y0-00007FDF4FB404E0] [ROUTE]((*route_diagnosis= Trans Current Query:"/* target_db_server = '127.0.0.1:2993,127.0.0.1:2994;10.10.10.1:50109' */ SELECT 888" Route Prompts > SQL_PARSE [INFO] Maybe counldn't get location cache of the query table since table name is empty. > ROUTE_INFO [INFO] Will route target db server and loopback addr (127.0.0.1:2993) wouldn't do congestion control > CONGESTION_CONTROL [INFO] This replica(127.0.0.1:2993) is no need to pass congestion control > CONGESTION_CONTROL [INFO] This replica(127.0.0.1:2994) is no need to pass congestion control Route Plan > SQL_PARSE:{cmd:"COM_QUERY", table:""} > ROUTE_INFO:{route_info_type:"USE_COMMENT_TARGET_DB", svr_addr:"127.0.0.1:2993"} > CONGESTION_CONTROL:{svr_addr:"127.0.0.1:2993", need_congestion_lookup:false} > HANDLE_RESPONSE:{is_parititon_hit:"false", state:"CONNECT_ERROR"} > RETRY:{attempts:2, retry_status:"FOUND_EXISTING_ADDR", retry_type:"CMNT_TARGET_DB_SERVER", retry_addr:{127.0.0.1:2994}} > CONGESTION_CONTROL:{svr_addr:"127.0.0.1:2994", need_congestion_lookup:false} > HANDLE_RESPONSE:{is_parititon_hit:"false", state:"CONNECT_ERROR"} > RETRY:{attempts:3, retry_status:"FOUND_EXISTING_ADDR", retry_type:"CMNT_TARGET_DB_SERVER", retry_addr:{10.10.10.1:50109}} > CONGESTION_CONTROL:{svr_addr:"10.10.10.1:50109"} > HANDLE_RESPONSE:{is_parititon_hit:"false", state:"CONNECTION_ALIVE"} )