读写分离路由策略未生效如何排查?

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】OB
【 使用版本 】V3/V4
【问题描述】 在OceanBase测试环境中,即使正确配置了 ob_proxy_readonly_transaction_routing_policy 参数,期望在事务中的只读语句能路由到Follower节点,但实际执行时却发现 SELECT 语句依然留在了Leader节点。这会导致Leader节点压力无法分摊,影响系统性能。@论坛小助手

1 个赞

针对您描述的情况,我们可以先通过日志采集来查看具体的配置和执行情况。虽然 obdiag 没有直接针对读写分离问题的根因分析场景,但我们可以通过日志采集来进一步排查问题。下面是推荐的日志采集命令:

日志采集场景: SQL执行出错
日志采集命令: obdiag gather scene run --scene=observer.sql_err --env “{db_connect=’-h127.0.0.1 -P2881 -utest@test -p****** -Dtest’, trace_id=‘Yxx’}”

请使用上述命令采集日志,并将生成的日志文件提供给我们,这将有助于我们更准确地定位问题。

此外,为了更好地理解您的环境并帮助您解决问题,请回答以下几个问题:

  1. 您当前使用的 OceanBase 版本是什么?
  2. ob_proxy_readonly_transaction_routing_policy 参数的具体配置值是什么?
  3. 在执行 SELECT 语句时,是否有任何特定的上下文或条件,例如是否涉及特定的表或视图?
  4. 您是否有启用任何其他的读写分离相关参数或配置?
  5. 您是否已经检查过 obproxy 的日志,看是否有相关的错误信息或警告?
  6. 您能否提供一个简单的示例,展示如何重现这个问题?

附上敏捷诊断工具 obdiag 使用帮助链接

1 个赞

ob_proxy_readonly_transaction_routing_policy参数以及确认了在4.x版本作废。

在标准事务中(以 BEGIN 开头或第一条语句为 DML/DDL),SELECT 无法独立路由到 Follower,
SELECT 作为独立语句(autocommit=1),配合弱一致性读和 follower_first 策略,使其脱离事务上下文

1 个赞

在OceanBase测试环境中,即使正确配置了 ob_proxy_readonly_transaction_routing_policy 参数,期望在事务中的只读语句能路由到Follower节点,但实际执行时却发现 SELECT 语句依然留在了Leader节点。这会导致Leader节点压力无法分摊,影响系统性能。

诊断命令:
可以通过查询 gv$sql_audit 虚拟表来检查SQL的实际执行情况和路由结果,重点关注 plan_type 字段。

sql
– 查看SQL审计信息,确认路由情况
SELECT
svr_ip,
query_sql,
plan_type,
elapsed_time
FROM
oceanbase.gv$sql_audit
WHERE
sql_id IN (‘你的SQL_ID’)
ORDER BY
request_time DESC
LIMIT 10
;
说明:plan_type 字段的值可以帮助判断SQL执行计划类型,例如在特定上下文中,值可能代表本地执行计划。

解决方案:
确认配置:首先确保ODP(OceanBase Database Proxy)上的 ob_proxy_readonly_transaction_routing_policy 参数已按文档要求正确设置。
检查连接:尝试通过不同的ODP节点连接数据库,以排除特定ODP节点配置缓存或异常的问题。
排查路由:若问题依旧,需检查SQL中是否因未提供分区键值或在条件中使用了特殊表达式,导致ODP无法准确计算数据位置,从而路由到默认的Leader节点。

1 个赞

多谢~

谢谢~

thanks