数据链路介绍
OceanBase 数据库作为一款分布式数据库,数据天然分布于多个节点上。为了屏蔽分布式数据库给应用程序带来的复杂性,使得应用程序访问 OceanBase 数据库像访问单机数据库一样简单,从架构上引入了 ODP,全称是 OceanBase 数据库代理(OceanBase Database Proxy,又称为 OBProxy),ODP 是 OceanBase 专用的反向服务代理,以解决 OceanBase 数据库的 SQL 路由和 容灾问题。

ODP 作为数据链路上的核心组件,存在多种部署形态:
- OBServer 端部署:ODP 与 OBServer 部署于同一台机器上,当压力大时可能存在资源竞争,排查问题比较困难。常见于私有云场景。
- ODP 独立部署:ODP 作为独立集群部署,减少了 ODP 与 OBServer 的相互影响。常见于公有云场景。
- 客户端部署:在 APPServer 容器旁再运行一个容器运行 ODP,两者位于同一个 Pod 中,可进行独立升级、发布、运维等。该部署形态对控制面要求较高,实际使用较少。
前两种部署形态,APPServer 访问 ODP 需要经过一层负载均衡组件,负载均衡组件负责 ODP 的高可用和负载均衡。例如 F5 将请求分散到多台 ODP 上。
在产品形态上,ODP 除了代理形态,还有 SDK 形态。SDK 形态以库形式集成到业务代码中,相比代理模式,访问链路上少一跳,性能更好,排查问题链路更短。但存在与业务代码耦合度更高,互相影响,且 ODP SDK 升级时需要业务重启等缺点。
引入 ODP 后,OceanBase 的数据链路为 APPServer <-> OBProxy <-> OBServer。APPServer 通过数据库驱动连接 ODP 发送请求,由于 OceanBase 数据库的分布式架构,用户数据以多日志流多副本的方式分布于多个 OBServer 上,ODP 将用户请求转发到最合适的 OBServer 上执行,并将执行结果返回用户。每个 OBServer 也有路由转发的功能,如果发现请求不能在当前节点执行,则会转发请求到正确的 OBServer,该场景需要进行一次远程执行,对请求的 RT(Response Time) 会有一定影响。

ODP 是 OceanBase 数据库的反向代理层,提供了从用户端到数据库端的路由选择和容灾功能,屏蔽应用程序对分布式数据库的感知。OBServer 包含完整的 SQL 引擎、存储引擎和分布式事务引擎,负责解析 SQL 生成物理执行计划并执行,及事务提交时通过 Paxos 协议达成多数派提交,提供高性能、高可用、高扩展的数据库服务。ODP 和 OBServer 采用松耦合的方式,允许 ODP 上的路由信息更新不及时导致错误的路由选择,OBServer 内部会再转发一次,返回结果时通知 ODP 更新路由信息。
如上所述,应用层将用户请求发送到代理服务 ODP ,经过 ODP 的路由后,发送到实际服务数据的数据库节点 OBServer ,执行结果沿着反向路径返回给应用层。整个链路中的组件通过不同的方式来达到高可用能力。




