---
title: "ODP 路由功能 - 数据库代理  V4.3.2 | OceanBase 文档中心"
description: ODP 路由功能 通过 ODP 可以访问不同集群中不同租户的不同机器，这也是 ODP 可以实现集群路由、租户路由和租户内路由的原因，本章将围绕前两部分介绍 ODP 的路由功能。有关租户内路由，详情请参见 租户内路由 。 集群路由 集群路由是指 ODP 路由功能支持访问不同的集群，它的关键点在于获取集群名和 rslis…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*nSAhQbrBXKwAAAAAAAAAAAAADiGDAQ/original) 数据库代理 V 4.3.2

# ODP 路由功能

更新时间：2026-04-14 17:41:09

[编辑](https://github.com/oceanbase/oceanbase-proxy-doc/edit/V4.3.2/zh-CN/600.data-routing/300.routing-function.md)  

通过 ODP 可以访问不同集群中不同租户的不同机器，这也是 ODP 可以实现集群路由、租户路由和租户内路由的原因，本章将围绕前两部分介绍 ODP 的路由功能。有关租户内路由，详情请参见 [租户内路由](https://www.oceanbase.com/docs/common-odp-doc-cn-1000000001601264)。

## 集群路由

集群路由是指 ODP 路由功能支持访问不同的集群，它的关键点在于获取集群名和 rslist 的映射关系。

- 对于启动参数指定 rslist 的启动方式，集群名和 rslist 的映射关系通过启动参数指定
 - 对于启动参数指定 `obproxy_config_server_url` 的启动方式，集群名和 rslist 的映射关系通过访问 url 获取

#### 注意

这里的 rslist 不需要包含所有的集群机器列表，ODP 会通过访问视图获取集群所有机器，一般 rslist 为 RootServer（OceanBase 的总控服务）所在的机器。

![集群路由](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/odp/V4.2.1/zh-CN/600.data-routing/4.png)

从上图可以看到，OCP 是集群路由时非常重要的一个模块。如果 OCP 模块出现异常，常见的问题有如下两个。

- 服务不可用：ODP 无法通过 OCP 获取集群名和 rslist 的映射关系，导致登录失败。
 - 返回结果有误：例如 ODP 通过 HTTP 协议访问 OCP 获取结果，获取到的结果为 JSON 格式，如果返回结果非 JSON 格式，会导致结果解析失败。

ODP 是在用户登录首次访问集群时获取 rslist，并保存到内存中，后续再访问该集群，可直接从 ODP 的内存中获取。

#### 注意

若 OCP 在集群内存信息创建好后出现异常，即使 ODP 仍可以正常工作，也要及时排查 OCP 问题。

## 租户路由

OceanBase 数据库中，一个集群有多个租户，租户路由是指 ODP 路由功能支持访问不同的租户。在众多租户中，sys 租户比较特殊，类似于管理员租户，和集群管理相关。本节将分开讨论 sys 租户路由和普通租户路由。

### sys 租户路由

ODP 完成集群路由后可获得集群的 rslist，此时 ODP 会通过 `proxyro@sys` 账号登录 rslist 中的一台机器，并通过视图 `DBA_OB_SERVERS` 获取集群的所有机器节点。在 OceanBase 数据库的现有实现中，sys 在每个节点都有分布，因此，`DBA_OB_SERVERS` 返回的结果也就是 sys 租户的路由信息。

ODP 会每 15 秒访问一次 `DBA_OB_SERVERS`，维护最新的路由信息，这样可以感知到集群发生的节点变更。

除了集群机器列表，ODP 还会通过 sys 租户获取 partition 分布信息、Zone 信息、租户信息等。由此可见 sys 租户对 ODP 的重要性。

### 普通租户路由

与 sys 租户的路由信息就是集群的机器列表不同，普通租户路由信息是租户资源所在的机器。

#### 注意

查询租户路由信息并不是通过 unit 相关的表，而是通过特殊表名 `__all_dummy` 表示查询租户信息。ODP 需要通过内部表 `__all_virtual_proxy_schema` 获取租户的机器列表，在访问 `__all_virtual_proxy_schema` 时，ODP 指定表名（`__all_dummy`）和指定租户名获取租户的节点信息。

![租户路由](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/odp/V4.2.1/zh-CN/600.data-routing/5.png)

ODP 会将获取到的租户信息保存在本地内存中，并根据一定策略进行缓存信息的更新。对于 sys 租户，通过每 15 秒一次的拉取任务获得最新的信息；对于普通租户，ODP 的刷新频率并不高，普通租户的路由缓存策略如下。

- 创建：首次访问租户时，通过 `__all_virtual_proxy_schema` 获得普通租户路由信息并创建。
 - 淘汰：当 OBServer 节点返回错误码 `OB_TENANT_NOT_IN_SERVER` 时设置缓存失效。
 - 更新：当缓存失效后重新访问 `__all_virtual_proxy_schema` 获得普通租户路由信息。

总的来说，在多租户架构下，ODP 通过 sys 租户获得元数据信息（sys 租户本身路由信息就是集群的机器列表），然后通过元数据信息获得租户的路由信息。通过租户路由功能，ODP 支持了 OceanBase 数据库的多租户架构。

路由实现了根据 OBServer 的数据分布精准访问到数据所在的机器。同时还可以根据一定的策略将一致性要求不高的读请求发送给副本机器，充分利用机器的资源。路由选择输入的是用户的 SQL、用户配置规则、和 OBServer 状态，路由选择输出的是一个可用 OBServer 地址。ODP 进行普通租户数据路由的过程大致如下：

![路由逻辑图](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/odp/V4.2.1/zh-CN/600.data-routing/6.jpg)

解析 SQL 模块使用的是 ODP 自己定制的 Parser 模块，只需要解析出 DML 语句中的数据库名、表名和 Hint，不需要通过其他复杂的表达式推演。

确定路由规则模块中，ODP 需要根据不同情况确定最佳的路由规则。比如：强一致性读的 DML 请求期望发到分区所属日志流的主副本 OBServer 上，弱一致性读的 DML 请求和其他请求则不要求，主副本和从副本均衡负载即可。如果 OceanBase 集群是多地部署，ODP 还提供了 LDC 路由，优先发给同机房的 OBServer 节点，其次是同城的 OBServer 节点，最后才是其他城市的 OBServer 节点。如果 OceanBase 集群是读写分离部署，ODP 还提供了读 Zone 优先、只限读 Zone、非合并优先等规则供业务按照自身特点配置。上述的几种情况在路由选择中是组合关系，输出是一个确定的路由规则。

获取路由表是指 ODP 根据用户的请求 SQL 获取该 SQL 涉及的副本位置。ODP 每次首先会尝试从本地线程缓存中获取路由表，其次是全局缓存，最后才是发起异步任务去向 OBServer 节点查询路由表。对于路由表的更新，ODP 采用触发更新机制。ODP 每次根据路由表转发给 OBServer 节点的请求，当 OBServer 节点不能本地执行时，会在回包时反馈给 ODP。ODP 根据反馈决定是否下次强制更新本地缓存路由表。通常是在 OBServer 节点合并或者负载均衡导致切主时，路由表才会发生变化。

选择目标 OBServer 则是根据确定的路由规则从上一步获取的路由表中选择最佳的 OBServer 节点，在经过黑名单、灰名单检查通过后作为最终的目标 OBServer 节点进行请求转发。

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
