Bootstrap

【OceanBase 诊断调优】—— 止血良方「SQL 限流」

1. 知识点

1. 对于Oceanbase,限流的意思是限制其在单台主机上处理的并发度,因此假设对某SQL限流的并发度为1,该集群有N台机器可以执行该SQL,则实际并发度是N。

2. OceanBase 是通过在 SQL 上绑定 Outline 的方式来实现的,有一个 /*+max_concurrent(1)*/ 的 hint 。比如说你给它设置成一的时候,那在租户级别,这个 SQL 只能开一个线程跑,它的并发度只能是一。比如说这个 SQL 它的 rt 是一百毫秒的话,那它的 qps 最多只能到十。如果你想把这个 SQL 给限死的话,那你直接把并发度都改成零就可以了。

2. 集群业务限流

OceanBase 集群的业务流量主要由租户需执行的 SQL 引起,SQL 的处理速度过快会导致如下问题:

  • 活跃内存来不及被转储。

  • 写类型的 SQL 处理过快会导致内存短期压力过大。

通过限制 SQL 的并发执行量可降低 SQL 处理速度,从而达到为 OceanBase 集群限流的目的,在资源不足或业务流量大的时候避免上述问题的出现。

操作步骤

  1. 找到该 OceanBase 集群执行频率高的 SQL。

    1. 登录 OCP。

    2. 在 租户 界面的 租户列表 中找到该集群的租户,并单击租户名。

      系统默认进入 总览 页。

    3. 选择 SQL 诊断 ,随后选择 TopSQL 页签。

    4. 根据业务情况自定义时间后,找到执行次数多的 SQL 文本,并记录这些文本和 SQL 文本的 ID。

    说明

    记录下来的文本将会被限制执行并发数,具体需要限制的高执行频率的 SQL 文本,需根据业务自行判断。比如以下场景:

    • 若业务写比查询更重要,则建议限制高频查询的 SQL 并发数。
    • 若写导致内存压力大,则建议限制高频写的 SQL 并发数。
  2. 为这些 SQL 增加并发执行限制的 Hint。

    1. 登录到该 SQL 执行的数据库。

    2. 为这些 SQL 文本增加 HINT 索引 /*+max_concurrent(1)*/,该索引将限制这个 SQL 文本的并发数为 1,从而限制该 SQL 的执行速度。可参考 绑定索引 或下述语句进行限流。

      #otl_idx 为索引名,需自定义;SQLID 为 SQL 文本的 ID。
      CREATE OUTLINE otl_idx_c2 ON "SQLID" 
           USING HINT  
      /*+max_concurrent(1)*/ 
       ;
      
      #举例如下:
      create outline  otl_name  on "ED570339F2C856BA96008A29EDF04C74" using hint  
      /*+max_concurrent(1)*/  
      ;
      

      通过如上语句,ID 为 "ED570339F2C856BA96008A29EDF04C74" 的 SQL 文本在单台 OBServer 节点上的执行并发数则被限制为 1。

    3. 逐个将步骤 1 中记录的 SQL 文本都按照 2.1 ~ 2.2 的方法加上并发数的限制。

;