外观
OceanBase OBProxy 架构
OBProxy 架构设计
整体架构
OBProxy 采用分层架构设计,主要包含以下几层:
- 客户端接入层:处理客户端连接,提供认证和加密功能
- 协议解析层:解析 SQL 语句和 OceanBase 协议
- 路由决策层:根据 SQL 语句和集群状态,决策请求的路由目标
- 连接管理层:管理与后端 OceanBase 节点的连接池
- 请求转发层:将请求转发到后端节点,并处理响应
- 监控统计层:收集和统计各种性能指标
核心组件
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 工作原理
请求处理流程
- 客户端连接建立:客户端通过 MySQL 协议连接到 OBProxy
- 认证和授权:OBProxy 对客户端进行认证和授权
- SQL 解析:OBProxy 解析客户端发送的 SQL 语句
- 路由决策:根据 SQL 语句和集群状态,决策请求的路由目标
- 连接池获取:从后端连接池中获取到目标节点的连接
- 请求转发:将 SQL 请求转发到目标后端节点
- 响应处理:接收后端节点的响应,进行必要的处理
- 响应返回:将处理后的响应返回给客户端
- 连接释放:将后端连接归还到连接池
路由决策流程
- 获取 SQL 类型:确定是读请求还是写请求
- 解析表名和分区键:提取 SQL 语句中的表名和分区键
- 获取集群拓扑:从缓存或直接从集群获取最新的集群拓扑
- 确定目标分区:根据分区键和分区规则,确定目标分区
- 选择目标节点:根据负载均衡算法,从目标分区的副本中选择一个节点
- 路由缓存更新:更新路由缓存,提高后续请求的路由效率
故障转移流程
- 故障检测:故障检测器检测到后端节点故障
- 故障上报:将故障节点信息上报给路由决策器
- 路由更新:路由决策器更新路由表,将故障节点从路由列表中移除
- 连接清理:清理与故障节点相关的连接
- 请求重定向:将后续请求重定向到健康节点
- 故障恢复:当故障节点恢复后,自动将其重新加入路由列表
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
