路由诊断结果解读

explain route select /* +read_consistency(strong) */ * from t1 where tid=2002;

cat obproxy_diagnosis.log | sed “s//n/\n/g”

ROUTE_POLICY:{replica:“10.11.253.64:2881”, idc_type:“SAME_IDC”, zone_type:“ReadWrite”, role:“FOLLOWER”, type:“FULL”, is_partition_server:true, proxy_primary_zone:“zone3”, chosen_route_type:“ROUTE_TYPE_PARTITION_UNMERGE_LOCAL”, route_policy:“MERGE_IDC_ORDER”, trans_consistency:“STRONG”, session_consistency:“STRONG”}
CONGESTION_CONTROL:{svr_addr:“10.11.253.64:2881”}
HANDLE_RESPONSE:{is_parititon_hit:“false”, send_action:“SERVER_SEND_REQUEST”, state:“CMD_COMPLETE”}

这个分区的leader在zone1 10.11.253.63

但是,在obproxy下设置了alter proxyconfig set proxy_primary_zone_name = ‘zone3’,所以才有了以上诊断信息。

问题:
1 ROUTE_POLICY:{replica:"10.11.253.64:2881 表示最终路由到这个节点?去读这个节点?

2 CONGESTION_CONTROL:{svr_addr:“10.11.253.64:2881”} 表示最终路由到这个节点?去读这个节点?

3 HANDLE_RESPONSE:{is_parititon_hit:“false” 表示在10.11.253.64:2881没有读到leader分区?

4 既然在10.11.253.64:2881没有读到,它也不告诉你它去哪里去读了,那这个路由信息有啥作用?

1.使用cat obproxy_diagnosis.log | sed 's/\n/\n/g’命令可以使日志格式化展示

2.ROUTE_POLICY.replica表示目标路由的数据副本在此节点,预期sql转发到这个副本所在节点执行。

3.CONGESTION_CONTROL.svr_addr表示目标路由到这个节点。因为此节点状态正常,所以仅展示了节点地址。如果节点异常,会展示节点的异常信息表示该节点不可用(比如observer停机或observer在拦截黑名单中)。

4.HANDLE_RESPONSE.is_parititon_hit=false表示没有路由到leader分区,属于不准确路由场景。因为分区的leader在zone1 10.11.253.63,实际路由到10.11.253.64与leader不一致,符合预期。

这个路由信息记录了Obproxy执行这条SQL到转发时的一些路由配置信息。使用路由诊断功能时可能仅预期路由不准的执行SQL记录在诊断日志中。这些信息可供排查单条SQL路由不准时,根据当时的配置场景路由不准是否符合预期。如果出现预期路由准确实际路由不准的SQL,需要根据具体场景进行问题排查。

1 个赞