暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

新基建 | 一个伪DBA的信创修养——代理篇

落风潭 2024-02-27
200


数据库产品不同,架构也略有差别,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 Session
    obclient> 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:地域,通常表示城市,

    • LDCLogical 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 -


          感谢阅读。如果觉得写得还不错,就请点个赞或“在看”吧。


          • 公众号所有文章仅代表个人观点,与供职单位无关。


          推荐阅读:



          文章转载自落风潭,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论