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 集群限流的目的,在资源不足或业务流量大的时候避免上述问题的出现。
操作步骤
-
找到该 OceanBase 集群执行频率高的 SQL。
-
登录 OCP。
-
在 租户 界面的 租户列表 中找到该集群的租户,并单击租户名。
系统默认进入 总览 页。
-
选择 SQL 诊断 ,随后选择 TopSQL 页签。
-
根据业务情况自定义时间后,找到执行次数多的 SQL 文本,并记录这些文本和 SQL 文本的 ID。
说明
记录下来的文本将会被限制执行并发数,具体需要限制的高执行频率的 SQL 文本,需根据业务自行判断。比如以下场景:
- 若业务写比查询更重要,则建议限制高频查询的 SQL 并发数。
- 若写导致内存压力大,则建议限制高频写的 SQL 并发数。
-
-
为这些 SQL 增加并发执行限制的 Hint。
-
登录到该 SQL 执行的数据库。
-
为这些 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。
-
逐个将步骤 1 中记录的 SQL 文本都按照 2.1 ~ 2.2 的方法加上并发数的限制。
-