Skip to content

OceanBase OBProxy 架构

OBProxy 架构设计

整体架构

OBProxy 采用分层架构设计,主要包含以下几层:

  1. 客户端接入层:处理客户端连接,提供认证和加密功能
  2. 协议解析层:解析 SQL 语句和 OceanBase 协议
  3. 路由决策层:根据 SQL 语句和集群状态,决策请求的路由目标
  4. 连接管理层:管理与后端 OceanBase 节点的连接池
  5. 请求转发层:将请求转发到后端节点,并处理响应
  6. 监控统计层:收集和统计各种性能指标

核心组件

1. 连接管理器

  • 功能:管理客户端连接和后端节点连接
  • 连接池设计
    • 客户端连接池:管理客户端到 OBProxy 的连接
    • 后端连接池:管理 OBProxy 到 OceanBase 节点的连接
  • 连接复用:实现连接复用,减少连接创建和销毁的开销

2. 协议处理器

  • 功能:解析和处理数据库协议
  • 支持的协议
    • MySQL 协议:兼容 MySQL 客户端
    • OceanBase 私有协议:与后端 OceanBase 节点通信
  • 协议转换:在不同协议之间进行转换

3. SQL 解析器

  • 功能:解析 SQL 语句,提取关键信息
  • 解析内容
    • SQL 类型(SELECT、INSERT、UPDATE、DELETE 等)
    • 表名、分区键、WHERE 条件
    • 事务信息
  • 解析优化:优化解析过程,提高解析速度

4. 路由决策器

  • 功能:根据 SQL 语句和集群状态,决策请求的路由目标
  • 路由策略
    • 基于表分区的路由
    • 基于租户的路由
    • 基于负载的路由
    • 基于位置的路由
  • 智能路由:根据实时集群状态动态调整路由策略

5. 负载均衡器

  • 功能:将请求均衡分发到后端节点
  • 负载均衡算法
    • 轮询(Round Robin)
    • 加权轮询(Weighted Round Robin)
    • 最小连接数(Least Connections)
    • 响应时间(Response Time)
  • 动态调整:根据实时负载情况动态调整权重

6. 故障检测器

  • 功能:检测后端节点的故障状态
  • 检测方式
    • 心跳检测:定期发送心跳请求
    • 连接检测:检测连接状态
    • 响应检测:检测请求响应情况
  • 故障处理:自动将故障节点从路由列表中移除

7. 监控统计器

  • 功能:收集和统计各种性能指标
  • 监控指标
    • 连接数、请求数、响应时间
    • 错误率、成功率
    • CPU、内存、网络使用率
  • 统计方式:实时统计,定期上报

OBProxy 工作原理

请求处理流程

  1. 客户端连接建立:客户端通过 MySQL 协议连接到 OBProxy
  2. 认证和授权:OBProxy 对客户端进行认证和授权
  3. SQL 解析:OBProxy 解析客户端发送的 SQL 语句
  4. 路由决策:根据 SQL 语句和集群状态,决策请求的路由目标
  5. 连接池获取:从后端连接池中获取到目标节点的连接
  6. 请求转发:将 SQL 请求转发到目标后端节点
  7. 响应处理:接收后端节点的响应,进行必要的处理
  8. 响应返回:将处理后的响应返回给客户端
  9. 连接释放:将后端连接归还到连接池

路由决策流程

  1. 获取 SQL 类型:确定是读请求还是写请求
  2. 解析表名和分区键:提取 SQL 语句中的表名和分区键
  3. 获取集群拓扑:从缓存或直接从集群获取最新的集群拓扑
  4. 确定目标分区:根据分区键和分区规则,确定目标分区
  5. 选择目标节点:根据负载均衡算法,从目标分区的副本中选择一个节点
  6. 路由缓存更新:更新路由缓存,提高后续请求的路由效率

故障转移流程

  1. 故障检测:故障检测器检测到后端节点故障
  2. 故障上报:将故障节点信息上报给路由决策器
  3. 路由更新:路由决策器更新路由表,将故障节点从路由列表中移除
  4. 连接清理:清理与故障节点相关的连接
  5. 请求重定向:将后续请求重定向到健康节点
  6. 故障恢复:当故障节点恢复后,自动将其重新加入路由列表

OBProxy 部署架构

单节点部署

  • 架构:单个 OBProxy 节点部署在客户端和 OceanBase 集群之间
  • 适用场景:测试环境,小规模生产环境
  • 优势:部署简单,管理方便
  • 劣势:存在单点故障风险

集群部署

  • 架构:多个 OBProxy 节点组成集群,前端配置负载均衡器
  • 适用场景:大规模生产环境
  • 优势
    • 无单点故障,高可用性
    • 支持横向扩展,提高处理能力
    • 负载均衡,提高资源利用率
  • 劣势:部署和管理复杂

分层部署

  • 架构:根据业务需求,将 OBProxy 部署在不同的层级
  • 层级设计
    • 边缘层:靠近客户端,处理客户端请求
    • 核心层:处理复杂的路由和负载均衡
    • 接入层:直接连接后端 OceanBase 节点
  • 适用场景:超大规模集群,复杂网络环境

OBProxy 与其他组件的关系

OBProxy 与 OceanBase 集群

  • 通信协议:使用 OceanBase 私有协议
  • 交互方式
    • OBProxy 定期从 OceanBase 集群获取集群拓扑信息
    • OBProxy 将客户端请求转发到 OceanBase 节点
    • OceanBase 节点将响应返回给 OBProxy

OBProxy 与 OCP

  • OCP:OceanBase 企业管理器
  • 交互方式
    • OCP 管理 OBProxy 的部署和配置
    • OCP 监控 OBProxy 的状态和性能
    • OCP 提供 OBProxy 的故障诊断和修复功能

OBProxy 与 OBAgent

  • OBAgent:OceanBase 监控代理
  • 交互方式
    • OBAgent 收集 OBProxy 的监控数据
    • OBAgent 将监控数据上报给监控系统

常见问题(FAQ)

Q1: OBProxy 如何实现高可用性?

A1: OBProxy 实现高可用性的方式:

  • 部署多个 OBProxy 实例,前端配置负载均衡器
  • 实现故障自动检测和转移
  • 支持无状态设计,便于横向扩展
  • 提供完善的监控和告警机制

Q2: OBProxy 如何处理大规模集群的路由?

A2: OBProxy 处理大规模集群路由的方式:

  • 采用分布式路由缓存,减少路由决策的开销
  • 实现增量路由更新,只更新变化的部分
  • 支持分片路由,将大规模集群划分为多个分片
  • 优化路由算法,提高路由决策速度

Q3: OBProxy 如何保证数据一致性?

A3: OBProxy 保证数据一致性的方式:

  • 写请求路由到主副本,确保数据一致性
  • 读请求可以根据一致性级别,路由到主副本或备副本
  • 支持事务的完整处理,确保事务的 ACID 特性
  • 实现分布式事务的协调和处理

Q4: OBProxy 如何优化性能?

A4: OBProxy 性能优化的方式:

  • 采用高效的事件驱动模型
  • 实现连接复用,减少连接创建和销毁的开销
  • 优化协议解析和处理流程
  • 实现高效的路由算法
  • 采用内存池和对象池,减少内存分配的开销

Q5: OBProxy 支持哪些客户端?

A5: OBProxy 支持的客户端:

  • MySQL 客户端:支持所有兼容 MySQL 协议的客户端
  • OceanBase 专用客户端:提供更多高级功能
  • 各种编程语言的数据库驱动:
    • Java:JDBC
    • Python:PyMySQL, MySQLdb
    • PHP:PDO, mysqli
    • Go:go-sql-driver/mysql
    • C/C++:libmysqlclient