首批通过分布式安全可靠测评,为关键业务系统打造
SQL 路由
更新时间:2026-04-04 18:50:31
ODP 会充分考虑用户请求涉及的副本位置、用户配置的读写分离路由策略、OceanBase 数据库多地部署的最优链路,以及 OceanBase 数据库各机器的状态及负载情况,将用户的请求路由到最佳的 OBServer 节点,最大程度的保证了 OceanBase 数据库整体的高性能运转。
开始阅读本节内容之前,您可以先了解一些路由相关的概念,便于您更好的了解下面的内容。
Zone
Region
Server List
RS List
Location Cache
副本
合并
强一致性读/弱一致性读
读写 Zone
分区表
分区键
OceanBase 数据库执行计划
执行计划分为三种:Local 、Remote 、Distribute。ODP 的作用主要是尽量避免 Remote 计划(效率低,性能差),将路由尽可能准确变为 Local 计划。
ODP 路由作用
理解了上述 可用区/Region/分区/副本的基本概念和物理含义后,就能理解 ODP 的路由思路了。从分区的设计到其物理分布,以及本地执行计划的高效性考虑,ODP 需要尽可能对 SQL 进行准确路由,主要过程将经历:SQL 解析、分区计算、分区信息获取、副本策略选择等。
非分区表路由
非分区表可以直接利用 Location Cache 中的副本信息。ODP 保存了分区和 OBServer 节点地址的映射,通过解析 SQL 中的表名,根据表名查询 ODP 缓存中的分区对应的机器 IP。缓存的有效性,有以下三种情况:
缓存中找不到,此时需要访问 OBServer 节点查询最新映射并缓存。
缓存中存在但不可用,此时需要重新去 OBServer 节点查询并更新。
缓存中存在且可用,此时可以直接使用。
分区表路由
分区表的路由相比非分区表而言,增加了分区 ID 及其相关的计算和查询过程。在获取了 Location Cache 后,分区表需要继续判定表的一级/二级分区,根据不同分区键类型和计算方式,计算分区 ID 并获取对应主备副本信息。
做分区计算时,通过表结构可以得知分区键及其类型,之后通过解析 SQL 语句获取对应分区键的值,并根据表结构和分区键类型做分区计算,从而能转发到对应分区所在的机器。
正常情况下,通过分区计算,ODP 可以将 SQL 路由到分区对应的机器上,从而避免 Remote 执行,提升效率。在 ODP V3.2.0 版本,已针对分区表且无法计算分区路由的场景进行优化,由随机选择租户的机器路由,优化成随机从分布了分区的机器中随机路由,提升命中率,尽可能减少 Remote 执行。
副本路由选择(常规部署)
对于强一致性读,且 SQL 指定了表名,将路由到该表对应分区的 Leader 的 OBServer 节点;对于弱一致性读、登录认证请求、强一致性读但没有指定表名等情况,存在主备均衡路由(默认)、备优先路由、不合并备优先路由这三种路由策略。
主备均衡路由(默认)
将按照以下优先级进行路由选择:
相同 Region,相同 IDC(同一个数据中心),不在合并状态的节点。
相同 Region,不同 IDC(不同的数据中心),不在合并状态的节点。
相同 Region,相同 IDC(同一个数据中心),正在合并状态的节点。
相同 Region,不同 IDC(不同的数据中心),正在合并状态的节点。
不同 Region,不在合并状态的节点。
不同 Region,正在合并状态的节点。
备优先路由
常规部署下,支持备优先读策略。通过用户级别的系统变量 proxy_route_policy 控制,仅在常规部署和弱一致性读的情况下生效,优先读 Follower 而非主备均衡路由。
在常规模式部署和弱一致性读时,设置 set @proxy_route_policy='follower_first';,路由将优先发往备节点,即使 OBServer 节点处于正在合并状态。将按照以下优先级进行路由选择:
相同 Region,相同 IDC,不在合并状态的备节点。
相同 Region,不同 IDC,不在合并状态的备节点。
相同 Region,相同 IDC,正在合并状态的备节点。
相同 Region,不同 IDC,正在合并状态的备节点。
相同 Region,相同 IDC,不在合并状态的主节点。
相同 Region,不同 IDC,不在合并状态的主节点。
不同 Region,不在合并状态的备节点。
不同 Region,正在合并状态的备节点。
不同 Region,不在合并状态的主节点。
不同 Region,正在合并状态的主节点。
不在合并的备优先路由
常规部署下,弱一致性读,设置 set @proxy_route_policy='unmerge_follower_first'; 时,路由将优先发往不在合并的备节点。将按照以下优先级进行路由选择:
相同 Region,相同 IDC,不在合并状态的备节点。
相同 Region,不同 IDC,不在合并状态的备节点。
相同 Region,相同 IDC,不在合并状态的主节点。
相同 Region,不同 IDC,不在合并状态的主节点。
相同 Region,相同 IDC,正在合并状态的备节点。
相同 Region,不同 IDC,正在合并状态的备节点。
不同 Region,不在合并状态的备节点。
不同 Region,不在合并状态的主节点。
不同 Region,正在合并状态的备节点。
不同 Region,正在合并状态的主节点。
强制发送到只读副本的路由
常规部署下,弱一致性读,设置 set @proxy_route_policy='FORCE_READONLY_ZONE'; 时,路由将所有的只读请求不会转发到非只读副本。其规则如下:
- 弱读请求:路由到只读副本中的节点。
- 非弱读请求:报错
4007,该路由规则下不允许非只读请求,如果业务确实需要发送非只读请求,请将变量ob_route_policy的值设置为其他的规则。
其他
常规部署下,弱一致性读,当 proxy_route_policy 变量取其他值时,路由选择将退化为普通的弱一致性读主备均衡路由策略,即主备均衡路由(默认)。
副本路由选择(读写分离部署)
即使用了只读副本的部署模式。读写分离部署时,不存在备优先读的路由策略,路由依赖系统变量 ob_route_policy。主要存在以下几种情况:
对于强一致性读语句,且 SQL 指定了表名,那么直接路由到该表涉及的分区的 Leader 的 OBServer 节点执行。
对于强一致性读语句,SQL 为"select 不指定表名/use database/set session 级别系统变量"时,忽略 Zone 属性,此时等同于常规部署下的主备均衡路由(默认)。
对于强一致性读语句,不包含登录认证请求,且去除 1 & 2 场景的请求,将按照以下策略进行路由:
相同 Region,相同 IDC,不在合并状态的读写 Zone 中的节点。
相同 Region,不同 IDC,不在合并状态的读写 Zone 中的节点。
相同 Region,相同 IDC,正在合并状态的读写 Zone 中的节点。
相同 Region,不同 IDC,正在合并状态的读写 Zone 中的节点。
不同 Region,不在合并状态的读写 Zone 中的节点。
不同 Region,正在合并状态的读写 Zone 中的节点。