
数据库产品不同,架构也略有差别,GaussDB和TDSQL都有CN,但OB没有。
不过,OB有个OBProxy,潭主觉得功能上有点类似。
本期就以OBProxy为题,扩展一下OceanBase的架构。

OBProxy集群架构
OBProxy,也叫OceanBase Database Proxy,简称ODP,是OceanBase专用的高性能反向代理服务器,类似F5和SLB。
每个OBServer都有完整的SQL引擎和存储引擎,负责解析SQL、生成物理执行计划并执行。
架构中,OBProxy只承担基本的路由和容灾功能,而数据库功能由OBServer实现,分工协作有利于充分发挥OB性能。
考点:OBProxy的两种部署模式
集中部署:架构上OBProxy集群形成一个单独的层,ODP前端再做一层负载
客户端部署:每客户端分别部署
考点:OBProxy的两种启动模式
测试模式:用于开发调试,不依赖ConfigServer,可指定集群的RSList(IP列表)启动,OBProxy集群与OB集群一对一。
生产模式:通过指定ConfigServer提供的config_url来启动,配置服务可以协助获取集群的配置信息。同一个ConfigServer可以保存多个OB集群的RSList信息,一个OBProxy集群可访问多个OB集群。
OBProxy的核心功能
路由转发
负责将客户SQL请求路由转发到合适的OBServer上,并将执行结果返回。
OBProxy对SQL进行Fast Parser,根据解析结果从Cache中获取对象的Schema信息,如果是分区表,还要提取相应的分区表达式。
考点:路由规则的确定(Sort Route Entry)
根据各种相关属性对路由表中IP进行排序:
强一致性读/弱一致性读
目标OBServer状态:合并/常态
路由精准度:PS/TS
LDC匹配:本地、同城、异地
Zone类型
读写分离的ob_route_policy取值
ODP通过黑名单机制自适应处理OBServer节点的错峰合并、升级、Leader切换、宕机、启动和停止等过程中的OBServer节点访问控制。
连接管理
OBProxy作为负载均衡代理,充当网关,使得OBServer对客户端变得透明。
当OBServer宕机、升级或重启时,客户端与OBProxy的连接不会断开,OBProxy可以迅速切换到正常的OBServer上。
考点:同一个客户端独占相应的Server端会话,且会话状态保持同步(Session变量)。
运维监控
OBProxy会定期向OCP上报信息,实现语句、事务、Session和OBProxy级别的各种统计。
支持慢查询日志、SQL Audit功能、可远程监控,查询和运维。
OBProxy的运维管理
OBProxy算是OB的一个模块,安装部署比较简单,OCP白屏界面有相应的菜单。
考点:无状态的OBProxy
OBProxy无状态,即使宕机重启也不会影响数据一致性。守护进程周期性检查OBProxy的健康状况,一旦发现宕机就立即重启OBProxy。
考点:ODP的多种连接格式
用户名@租户名#集群名(常用)
集群名:租户名:用户名
集群名-租户名-用户名
集群名.租户名.用户名
root@proxysys账号用于登录OBProxy进行ODP的参数管理等工作。
在OBProxy的V4.0以下版本,OB集群与OBProxy集群的proxyro密码保持一致时,proxyro账号才能通过OBProxy访问OceanBase集群。
潭主当初测OB时,把注意力都放在OceanBase数据库上了,少了OBProxy的实操。
考点:笔试时很尴尬,有道题考ODP的运维命令,包括show proxyinfo idc等。
//查看ODP上所有租户连接的Client Sessionobclient> SHOW PROXYSESSION;
其中,id为ODP内部标记每个Client的id,即cs_id,而proxy_sessid为整个OB标记每个Client的64位id。
考点:OB服务端口
2881:OB的SQL直连端口
2882:OBServer的RPC端口,SVR_IP和SVR_PORT
2883:OBProxy提供OB的连接端口,也是OBProxy的监听端口

OBProxy的集群设置
前面介绍SQL引擎的时候提到过OBProxy,ODP可以做Fast Parser,进行轻量级SQL解析,从客户端的SQL中解析Database名和Table名,然后再根据用户的租户名、数据库名、表名以及分区ID等信息,向OBServer拉取表分区路由表。
所谓的路由表是指表分区的主、从副本所在OBServer的IP地址列表信息。
OBProxy将请求路由至主副本所在的机器上,同时将副本的位置信息更新到自己的 Location Cache中,当再次访问时,会命中该Cache以加速访问。
与路由相关的基础概念:
Region:地域,通常表示城市,
LDC(Logical Data Center):逻辑数据中心,相对于IDC的一个概念,主要用于描述本地、同城和异地。
在架构层面,一个OB集群可以包含若干个Region,每个Region包含若干个IDC,每个IDC可部署若干个Zone。

这部分内容跟架构篇的知识有一定的关联性。
通过命令就可以给OB的Zone进行Region和IDC的系统设置,OBProxy按照根据城市、机房等信息就近路由访问OBServer。
oblient> alter system modify zone "zone1" set region="BJ";oblient> alter system modify zone "zone1" set idc="CP";
检查OBServer的LDC设置可以查看__all_zone视图(V4:DBA_OB_ZONES)。
考点:OBProxy配置项设置方式
可通过启动参数、登陆修改、OCP配置项进行设置更新。
在OBProxy的启动脚本中使用-i参数将机房名启动传入
OBProxy运行后通过alter proxyconfig set proxy_idc_name='机房名';
全局配置项或会话变量proxy_idc_name
//全局配置项obclient> alter proxyconfig set proxy_idc_name='XXX';/Session变量obclient> set @proxy_idc_name='XXX';
OBPorxy的路由策略
ODP的路由策略分为强一致性读和弱一致性读。对于强一致性就是把流量打到分区的Leader副本上,而弱一致性读则相对比较复杂,包括三种策略:
主备均衡路由策略(默认)
备优先读策略
读写分离策略
考点:弱一致性读的配置实现
变量:ob_read_consistency='weak'
Hint:/*+ read_consistency(weak)*/
主备均衡路由策略
默认策略,其路由的优先策略:Region>合并状态>IDC,从两地三中心的角度考虑更容易理解。
备优先读策略
通过变量proxy_route_policy控制:
follower_first:优先路由给Follower,即使备点处于合并状态
unmerge_follower_first:优先路由给不在合并状态的Follower
当取其他值时:退化至普通弱一致性读主备均衡的路由逻辑。
读写分离策略
通过变量ob_route_policy控制,设置OBProxy或Java客户端与OBServer节点内部重试的路由策略。
将写请求路由到ReadWrite Zone主副本,将弱一致性读请求路由到ReadOnly Zone。
//root登录业务租户obclient> set @@global.ob_route_policy=readonly_zone_first;
总体上感觉这部分内容比较琐碎,潭主笔试没遇到。
OBProxy的其他考点
考点:ODP启动失败诊断
是否存在hostname:hostname -i,确认IP是否存在
目录是否存在,权限是否正确:确保当前目录下有读、写、执行权限
端口是否被占用:使用obproxyd.sh启动OBProxy, 2883端口
启动环境是否指定正确:通过obproxyd.sh启动,需要-e参数指定运行环境
在V4版本中,ODP提供了丰富的内部表和系统日志用来定位性能瓶颈,主要通过审计日志、慢日志、统计日志分析ODP行为,涉及相关参数:
query_digest_time_threshold:请求执行时间超过阈值打印digest日志
slow_query_time_threshold:慢请求执行时间超过阈值打印slow日志
考点:超时参数默认设置
SQL执行耗时长和连接空闲时间长是常见的超时原因,解决方案是通过ping保持活动或调大参数。
ob_query_timeout:查询超时,默认10s
ob_trx_timeout:事务未提交超时,默认100s
ob_trx_idle_timeout:事务空闲超时,默认120s
ODP的内容并不难,但知识点好像还挺多。
好啦,就到这里吧!休息,休息!
- END -
感谢阅读。如果觉得写得还不错,就请点个赞或“在看”吧。
公众号所有文章仅代表个人观点,与供职单位无关。
推荐阅读:





