ODP路由解释

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】
【 使用版本 】
【问题描述】oceanbase数据库中 ODP路由是什么
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

2 个赞

OceanBase 数据库 中,ODP(OceanBase Database Proxy)路由 是一个非常核心的机制,它决定了应用程序的 SQL 请求最终会被转发到哪个 OBServer 节点(即数据库实例)。

一、ODP 简介

ODP(OceanBase Database Proxy) 是 OceanBase 的中间层代理组件,作用类似于 MySQL 的 Proxy 或 Oracle RAC 的 SCAN Listener,它位于应用与数据库集群之间,主要功能包括:

  • 连接管理与复用(Connection Pooling)
  • SQL 解析与路由(Routing)
  • 负载均衡(Load Balancing)
  • 容灾切换与高可用支持

应用程序不直接连接 OBServer,而是连接到 ODP,由 ODP 决定该把 SQL 请求发给哪个 OBServer

二、ODP 路由机制

ODP 的路由决定逻辑大致分为以下几类

1. 根据租户(Tenant)和分区(Partition)路由

OceanBase 是一个多租户、多分区的分布式数据库。
当应用发出一条 SQL 时:

  • ODP 会先根据 租户信息 确定应该连接的集群和租户。
  • 再根据 表的分区键SQL 条件(如 WHERE user_id = 123),通过分区规则(例如 Hash、Range 等)计算出 目标分区
  • 通过 ODP 内部维护的 分区位置缓存(Partition Location Cache),找到目标分区所在的 OBServer 节点,然后把 SQL 请求路由过去。

例如

SELECT * FROM t_user WHERE user_id = 1001;

假设 t_user 是按 user_id Hash 分区的,ODP 解析 SQL 后会:

  • 计算 1001 落在哪个分区(比如 P3)
  • 查询分区 P3 当前主副本的所在 OBServer 节点(比如 observer_2)
  • 将该请求路由到 observer_2

2. 主/从路由

ODP 支持区分 读写路由

  • DML、DDL 语句(INSERT/UPDATE/DELETE/ALTER)会路由到 主副本(Leader)
  • SELECT 语句可根据租户配置选择:
    • 路由到主副本(强一致读)
    • 或路由到从副本(Follower)做只读查询(读写分离,提升性能)

3. 负载均衡与容灾

ODP 维护一份集群拓扑信息:

  • 当目标分区的 Leader 所在节点宕机或迁移时,ODP 会自动刷新分区位置缓存,重新路由到新的 Leader 节点。
  • 对于只读请求,ODP 可以根据负载情况,将请求分发到多个 Follower 节点以分摊压力。

三、ODP 路由的重要性

ODP 路由机制直接影响:

  • SQL 的访问性能(是否命中正确的分区与副本)
  • 系统的可扩展性(分布式负载均衡)
  • 高可用性(节点异常时自动切换)
2 个赞