集群中配置 Function 级资源隔离(MySQL 模式)

配置 Function 级资源隔离(MySQL 模式)

MySQL 模式下 Function 级资源隔离的配置方法。

磁盘性能校准

在控制 IOPS 资源隔离前,需要进行磁盘性能校准。

连接集群

使用 root 用户登录 obcluster 集群的 sys 租户。

obclient -h127.0.0.1 -P2883 -uroot@sys#obcluster -A 

对集群内的所有 Zone 触发磁盘校准任务

根据业务使用场景,选择合适的命令,触发磁盘校准任务。对集群内的所有 Zone 触发磁盘校准任务。

ALTER SYSTEM RUN JOB "io_calibration" ZONE = zone1;
ALTER SYSTEM RUN JOB "io_calibration" ZONE = zone2;
ALTER SYSTEM RUN JOB "io_calibration" ZONE = zone3;

查看磁盘 I/O 校准状态

触发磁盘校准任务后,可以通过 GV$OB_IO_CALIBRATION_STATUSV$OB_IO_CALIBRATION_STATUS 视图确认 I/O 校准状态。

SELECT * FROM oceanbase.V$OB_IO_CALIBRATION_STATUS;

输出结果如下:

obclient(root@sys)[(none)]> SELECT * FROM oceanbase.V$OB_IO_CALIBRATION_STATUS;
+-------------+----------+--------------+--------+----------------------------+----------------------------+
| SVR_IP      | SVR_PORT | STORAGE_NAME | STATUS | START_TIME                 | FINISH_TIME                |
+-------------+----------+--------------+--------+----------------------------+----------------------------+
| 10.43.51.60 |     2882 | DATA         | READY  | 2025-09-22 11:20:17.091085 | 2025-09-22 11:21:58.924208 |
+-------------+----------+--------------+--------+----------------------------+----------------------------+
1 row in set (0.032 sec)

磁盘 I/O 校准状态分为以下几种:

  • NOT AVAILABLE :表示未开始 I/O 校准。
  • IN PROGRESS :表示正在进行 I/O 校准。
  • READY :表示 I/O 校准已完成。
  • FAILED :表示 I/O 校准执行失败。

从查询结果可知,STATUS 字段的值为 IN PROGRESS ,表示正在进行磁盘 I/O 校准。待磁盘 I/O 校准完成后,STATUS 字段的值会变成 READY ,表示磁盘校准已完成,同时 FINISH_TIME 字段中会显示完成时间。

确认磁盘 I/O 校准是否生效

待磁盘 I/O 校准完成后,通过 V$OB_IO_BENCHMARK 视图确认磁盘 I/O 校准是否生效。

SELECT * FROM oceanbase.V$OB_IO_BENCHMARK;

输出结果如下:

obclient(root@sys)[(none)]> SELECT * FROM oceanbase.V$OB_IO_BENCHMARK;
+-------------+----------+--------------+-------+---------+-------+------+---------+
| SVR_IP      | SVR_PORT | STORAGE_NAME | MODE  | SIZE    | IOPS  | MBPS | LATENCY |
+-------------+----------+--------------+-------+---------+-------+------+---------+
| 10.43.51.60 |     2882 | DATA         | READ  |    4096 | 52846 |  206 |     303 |
| 10.43.51.60 |     2882 | DATA         | READ  |    8192 | 50615 |  395 |     315 |
| 10.43.51.60 |     2882 | DATA         | READ  |   16384 | 46924 |  733 |     341 |
| 10.43.51.60 |     2882 | DATA         | READ  |   32768 | 41230 | 1288 |     389 |
| 10.43.51.60 |     2882 | DATA         | READ  |   65536 | 30721 | 1920 |     521 |
| 10.43.51.60 |     2882 | DATA         | READ  |  131072 | 13629 | 1703 |    1176 |
| 10.43.51.60 |     2882 | DATA         | READ  |  262144 |  7492 | 1873 |    2148 |
| 10.43.51.60 |     2882 | DATA         | READ  |  524288 |  4008 | 2004 |    4025 |
| 10.43.51.60 |     2882 | DATA         | READ  | 1048576 |  2081 | 2081 |    7815 |
| 10.43.51.60 |     2882 | DATA         | READ  | 2097152 |   723 | 1446 |   22262 |
| 10.43.51.60 |     2882 | DATA         | WRITE |    4096 |  8180 |   31 |    1957 |
| 10.43.51.60 |     2882 | DATA         | WRITE |    8192 |  6679 |   52 |    2396 |
| 10.43.51.60 |     2882 | DATA         | WRITE |   16384 |  5177 |   80 |    3093 |
| 10.43.51.60 |     2882 | DATA         | WRITE |   32768 |  2306 |   72 |    6945 |
| 10.43.51.60 |     2882 | DATA         | WRITE |   65536 |  1186 |   74 |   13513 |
| 10.43.51.60 |     2882 | DATA         | WRITE |  131072 |   639 |   79 |   25091 |
| 10.43.51.60 |     2882 | DATA         | WRITE |  262144 |   350 |   87 |   46120 |
| 10.43.51.60 |     2882 | DATA         | WRITE |  524288 |   169 |   84 |   96060 |
| 10.43.51.60 |     2882 | DATA         | WRITE | 1048576 |    69 |   69 |  164141 |
| 10.43.51.60 |     2882 | DATA         | WRITE | 2097152 |    13 |   26 |  177397 |
+-------------+----------+--------------+-------+---------+-------+------+---------+
20 rows in set (0.032 sec)

将租户的 MAX_IOPS 和 MIN_IOPS 配置为有效值

说明:如果在创建租户所使用的 Unit 规格时,已将 MAX_IOPSMIN_IOPS 设置为 16 KB 读对应的 IOPS 值,或者,不需要控制 IOPS 的资源隔离,请忽略本步骤。

完成磁盘校准后,在配置资源隔离计划前,需要保证租户的资源规格中 MAX_IOPSMIN_IOPS 的值为有效值,这里的有效值指的是以 16 KB 读对应的 IOPS 值作为租户 IOPS 配置的参考值。

查看待进行资源隔离的租户的资源规格

执行以下命令,查看待进行资源隔离的租户的资源规格。

SELECT * FROM oceanbase.DBA_OB_UNIT_CONFIGS;

输出结果如下:

obclient(root@sys)[(none)]> SELECT * FROM oceanbase.DBA_OB_UNIT_CONFIGS;
+----------------+-------------------+----------------------------+----------------------------+---------+---------+-------------+---------------+---------------------+---------------------+-------------+
| UNIT_CONFIG_ID | NAME              | CREATE_TIME                | MODIFY_TIME                | MAX_CPU | MIN_CPU | MEMORY_SIZE | LOG_DISK_SIZE | MAX_IOPS            | MIN_IOPS            | IOPS_WEIGHT |
+----------------+-------------------+----------------------------+----------------------------+---------+---------+-------------+---------------+---------------------+---------------------+-------------+
|              1 | sys_unit_config   | 2025-06-16 17:12:20.916675 | 2025-06-16 17:12:20.916675 |       3 |       3 |  2147483648 |    2147483648 | 9223372036854775807 | 9223372036854775807 |           3 |
|           1004 | mysql_tenant_unit | 2025-06-17 19:03:57.866709 | 2025-06-17 19:03:57.866709 |       1 |       1 |  2147483648 |    6442450944 |               10000 |               10000 |           1 |
+----------------+-------------------+----------------------------+----------------------------+---------+---------+-------------+---------------+---------------------+---------------------+-------------+
2 rows in set (0.043 sec)

根据查询结果,如果该租户的 MAX_IOPSMIN_IOPS 均为默认值 INT64_MAX (9223372036854775807),则需要对租户可使用的 IOPS 资源重新进行规划。

查看租户id

use oceanbase
select * from dba_ob_tenants ;

输出信息如下:

obclient(root@sys)[oceanbase]> select * from dba_ob_tenants ;
+-----------+--------------+-------------+----------------------------+----------------------------+-------------------+---------------------------------------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+---------------------+---------------------+---------------------+---------------------+--------------+----------------------------+----------+------------+-----------+
| TENANT_ID | TENANT_NAME  | TENANT_TYPE | CREATE_TIME                | MODIFY_TIME                | PRIMARY_ZONE      | LOCALITY                                    | PREVIOUS_LOCALITY | COMPATIBILITY_MODE | STATUS | IN_RECYCLEBIN | LOCKED | TENANT_ROLE | SWITCHOVER_STATUS | SWITCHOVER_EPOCH | SYNC_SCN            | REPLAYABLE_SCN      | READABLE_SCN        | RECOVERY_UNTIL_SCN  | LOG_MODE     | ARBITRATION_SERVICE_STATUS | UNIT_NUM | COMPATIBLE | MAX_LS_ID |
+-----------+--------------+-------------+----------------------------+----------------------------+-------------------+---------------------------------------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+---------------------+---------------------+---------------------+---------------------+--------------+----------------------------+----------+------------+-----------+
|         1 | sys          | SYS         | 2025-06-16 17:12:20.944405 | 2025-06-16 17:12:20.944405 | RANDOM            | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | NULL              | MYSQL              | NORMAL | NO            | NO     | PRIMARY     | NORMAL            |                0 |                NULL |                NULL |                NULL |                NULL | NOARCHIVELOG | DISABLED                   |        1 | 4.3.1.0    |         1 |
|      1003 | META$1004    | META        | 2025-06-17 19:05:09.070275 | 2025-06-17 19:05:43.178280 | zone1,zone2,zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | NULL              | MYSQL              | NORMAL | NO            | NO     | PRIMARY     | NORMAL            |                0 |                NULL |                NULL |                NULL |                NULL | NOARCHIVELOG | DISABLED                   |        1 | 4.3.1.0    |         1 |
|      1004 | mysql_tenant | USER        | 2025-06-17 19:05:09.076734 | 2025-06-17 19:05:43.282319 | zone1,zone2,zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | NULL              | MYSQL              | NORMAL | NO            | NO     | PRIMARY     | NORMAL            |                0 | 1758511522787737001 | 1758511522787737001 | 1758511522787737001 | 4611686018427387903 | NOARCHIVELOG | DISABLED                   |        1 | 4.3.1.0    |      1003 |
+-----------+--------------+-------------+----------------------------+----------------------------+-------------------+---------------------------------------------+-------------------+--------------------+--------+---------------+--------+-------------+-------------------+------------------+---------------------+---------------------+---------------------+---------------------+--------------+----------------------------+----------+------------+-----------+
3 rows in set (0.015 sec)

确认租户部署在哪些 OBServer 节点上

执行以下命令,确认租户部署在哪些 OBServer 节点上。

SELECT DISTINCT SVR_IP, SVR_PORT FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE tenant_id = 1004;

输出结果如下:

obclient(root@sys)[oceanbase]> SELECT DISTINCT SVR_IP, SVR_PORT FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE tenant_id = 1004;
+--------------+----------+
| SVR_IP       | SVR_PORT |
+--------------+----------+
| 10.43.139.79 |     2882 |
| 10.43.231.92 |     2882 |
| 10.43.51.60  |     2882 |
+--------------+----------+
3 rows in set (0.022 sec)

确认待进行资源隔离的租户所在的 OBServer 节点上的磁盘校准值

执行以下命令,确认待进行资源隔离的租户所在的 OBServer 节点上的磁盘校准值,使用 16 KB 读的磁盘校准值作为该节点 IOPS 设置的上限值。

SELECT * FROM oceanbase.GV$OB_IO_BENCHMARK WHERE MODE='READ' AND SIZE=16384;

输出结果如下:

obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.GV$OB_IO_BENCHMARK WHERE MODE='READ' AND SIZE=16384;
+--------------+----------+--------------+------+-------+-------+------+---------+
| SVR_IP       | SVR_PORT | STORAGE_NAME | MODE | SIZE  | IOPS  | MBPS | LATENCY |
+--------------+----------+--------------+------+-------+-------+------+---------+
| 10.43.51.60  |     2882 | DATA         | READ | 16384 | 46924 |  733 |     341 |
| 10.43.139.79 |     2882 | DATA         | READ | 16384 | 47248 |  738 |     341 |
| 10.43.231.92 |     2882 | DATA         | READ | 16384 | 48435 |  756 |     331 |
+--------------+----------+--------------+------+-------+-------+------+---------+
3 rows in set (0.008 sec)

根据查询结果,将获取到的各节点的磁盘校准值作为上限值来规划租户可用的 IOPS。由于集群内可能有多个租户部署在相同的 OBServer 节点,您可以需要根据业务实际情况来分配这些 IOPS。

假设某集群下有两个租户,且两个租户都部署在相同的 OBServer 节点上,每个 OBServer 节点的 16 KB 读的磁盘 IOPS 基准值均相同,为 20000 IOPS,同时,预计两个租户的负载差不多,则可以将 20000 IOPS 平分给两个租户(具体可根据实际业务情况来为租户划分可用的 IOPS),即每个租户的 MAX_IOPSMIN_IOPS 均配置为 10000,您也可以根据业务考虑,将 MIN_IOPS 设置为小于 MAX_IOPS 的某个值。

查询当前 MySQL 租户对应的 unit

SELECT a.UNIT_CONFIG_ID, a.NAME AS UNIT_NAME, b.NAME AS POOL_NAME FROM oceanbase.DBA_OB_UNIT_CONFIGS a,oceanbase.DBA_OB_RESOURCE_POOLS b WHERE b.UNIT_CONFIG_ID=a.UNIT_CONFIG_ID;

输出结果如下:

+----------------+-------------------+-------------------+
| UNIT_CONFIG_ID | UNIT_NAME         | POOL_NAME         |
+----------------+-------------------+-------------------+
|              1 | sys_unit_config   | sys_pool          |
|           1004 | mysql_tenant_unit | mysql_tenant_pool |
+----------------+-------------------+-------------------+
2 rows in set (0.006 sec)

修改租户的 MAX_IOPSMIN_IOPS

执行以下命令,修改租户的 MAX_IOPSMIN_IOPS 值。

ALTER RESOURCE UNIT mysql_tenant_unit MAX_IOPS = 35000;

ALTER RESOURCE UNIT mysql_tenant_unit MIN_IOPS = 30000;

结束后, 执行 exit 退出数据库。

配置资源隔离计划

compaction_high 任务、ddl_high 任务分别绑定在 interactive_groupbatch_group 2 个资源组上,再通过资源管理计划 daytime 来控制后台任务使用不同的 CPU 资源和 IOPS 资源。

连接集群

使用 root 用户登录 obcluster 集群的 mysql_tenant 租户。

obclient -h127.0.0.1 -P2883 -uroot@mysql_tenant#obcluster -Doceanbase -A

创建资源隔离所需的 2 个资源组

调用 DBMS_RESOURCE_MANAGER 系统包中的 CREATE_CONSUMER_GROUP 子程序创建资源隔离所需的 2 个资源组。

CALL DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
CONSUMER_GROUP => 'interactive_group' ,
COMMENT => 'TP'
);

 CALL DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
CONSUMER_GROUP => 'batch_group' ,
COMMENT => 'AP'
);

参数说明如下:

  • CONSUMER_GROUP :定义资源组名称。
  • COMMENT :填写资源组的备注信息。

创建成功后,可以查询 DBA_RSRC_CONSUMER_GROUPS 视图进行确认。

SELECT * FROM oceanbase.DBA_RSRC_CONSUMER_GROUPS;

输出结果如下:

obclient(root@mysql_tenant)[oceanbase]> SELECT * FROM oceanbase.DBA_RSRC_CONSUMER_GROUPS;
+-------------------+-------------------+------------+-------------+--------------+----------+----------+--------+-----------+
| CONSUMER_GROUP_ID | CONSUMER_GROUP    | CPU_METHOD | MGMT_METHOD | INTERNAL_USE | COMMENTS | CATEGORY | STATUS | MANDATORY |
+-------------------+-------------------+------------+-------------+--------------+----------+----------+--------+-----------+
|             10001 | batch_group       | NULL       | NULL        | NULL         | AP       | NULL     | NULL   | NULL      |
|             10000 | interactive_group | NULL       | NULL        | NULL         | TP       | NULL     | NULL   | NULL      |
+-------------------+-------------------+------------+-------------+--------------+----------+----------+--------+-----------+
2 rows in set (0.032 sec)

创建资源管理计划

调用 DBMS_RESOURCE_MANAGER 系统包中的 CREATE_PLAN 子程序,创建一个名为 daytime 的资源管理计划,并添加备注信息。

CALL DBMS_RESOURCE_MANAGER.CREATE_PLAN(
PLAN => 'daytime',
comment => 'TPFirst');

参数说明如下:

  • PLAN :定义资源管理计划名称。
  • COMMENT :填写资源管理计划的备注信息。

创建成功后,可以查询 DBA_RSRC_PLANS 视图进行确认。

SELECT * FROM oceanbase.DBA_RSRC_PLANS;

输出结果如下:

obclient(root@mysql_tenant)[oceanbase]> SELECT * FROM oceanbase.DBA_RSRC_PLANS;
+---------+---------+---------------------+------------+-------------+----------------------+---------------------------+-------------+----------+----------+--------+-----------+
| PLAN_ID | PLAN    | NUM_PLAN_DIRECTIVES | CPU_METHOD | MGMT_METHOD | ACTIVE_SESS_POOL_MTH | PARALLEL_DEGREE_LIMIT_MTH | QUEUING_MTH | SUB_PLAN | COMMENTS | STATUS | MANDATORY |
+---------+---------+---------------------+------------+-------------+----------------------+---------------------------+-------------+----------+----------+--------+-----------+
|    NULL | daytime |                NULL | NULL       | NULL        | NULL                 | NULL                      | NULL        | NULL     | TPFirst  | NULL   | NULL      |
+---------+---------+---------------------+------------+-------------+----------------------+---------------------------+-------------+----------+----------+--------+-----------+
1 row in set (0.011 sec)

创建资源管理计划对应的资源管理计划内容

调用 DBMS_RESOURCE_MANAGER 系统包中的 CREATE_PLAN_DIRECTIVE 子程序,创建资源管理计划对应的资源管理计划内容,用于启用资源管理计划时,限制资源组所使用的 CPU 资源和 IOPS 资源。

  • 指定资源计划为 daytime ,绑定资源组 interactive_group ,并指定可使用的 CPU 资源上限为租户 CPU 总资源的 80%。同时,当出现出现 IO 争用时,指定最少可用的 IOPS 资源为 30%,可使用的 IOPS 资源上限为 IOPS 总资源为 90%,IOPS 资源权重为 80。
CALL DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
PLAN => 'daytime',
GROUP_OR_SUBPLAN => 'interactive_group' ,
COMMENT  => '',
UTILIZATION_LIMIT =>80,
MIN_IOPS => 30,
MAX_IOPS => 90,
WEIGHT_IOPS => 80);

指定资源计划为 daytime ,绑定资源组 batch_group ,并指定可使用的 CPU 资源上限为租户 CPU 总资源的 40%。同时,当出现出现 IO 争用时,指定最少可用的 IOPS 资源为 40%,可使用的 IOPS 资源上限为 IOPS 总资源为 80%,IOPS 资源权重为 70。

CALL DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
PLAN => 'daytime',
GROUP_OR_SUBPLAN => 'batch_group' ,
COMMENT  => '',
UTILIZATION_LIMIT => 40,
MIN_IOPS => 40,
MAX_IOPS => 80,
WEIGHT_IOPS => 70);

参数说明如下:

  • PLAN :指定该资源管理计划内容所关联的资源管理计划名。
  • GROUP_OR_SUBPLAN :指定资源组。
  • COMMENT :填写资源管理计划内容的备注信息,默认值为 NULL
  • MGMT_P1 :指定系统满负载情况下,承诺分配给本资源组的 CPU 占比。默认值为 100
  • UTILIZATION_LIMIT :指定资源组使用的 CPU 资源的上限。该参数的默认值为 100 ,取值范围为 [0, 100]。100 表示最大可使用租户全部 CPU 资源。如果取值为 40 则表示最大可使用租户 40% 的 CPU 资源。
  • MIN_IOPS :用于出现 IO 争用时,资源组预留的 IOPS 资源,总和不超过 100,默认值为 0
  • MAX_IOPS :用于指定资源组最大可使用的 IOPS 资源,总和可以超过 100,默认值为 100
  • WEIGHT_IOPS :用于指定 IOPS 的权重值,总和可以超过100,默认值为 0

创建成功,可以查询 DBA_OB_RSRC_IO_DIRECTIVES 视图进行确认。

SELECT * FROM oceanbase.DBA_OB_RSRC_IO_DIRECTIVES;

输出结果如下:

obclient(root@mysql_tenant)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_RSRC_IO_DIRECTIVES;
+---------+-------------------+----------+----------+----------+-------------+
| PLAN    | GROUP_OR_SUBPLAN  | COMMENTS | MIN_IOPS | MAX_IOPS | WEIGHT_IOPS |
+---------+-------------------+----------+----------+----------+-------------+
| daytime | batch_group       |          |       40 |       80 |          70 |
| daytime | interactive_group |          |       30 |       90 |          80 |
+---------+-------------------+----------+----------+----------+-------------+
2 rows in set (0.013 sec)

创建 SQL 资源隔离匹配规则

调用 DBMS_RESOURCE_MANAGER 系统包中的 SET_CONSUMER_GROUP_MAPPING 子程序。

  • 指定执行 compaction_high 的任务时,系统绑定到名为 interactive_group 的资源组上执行,并使用该资源组所限制的 CPU 资源和 IOPS 资源。
CALL DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING(
ATTRIBUTE => 'function',
VALUE => 'compaction_high',
CONSUMER_GROUP => 'interactive_group');
  • 指定执行 ddl_high 任务时,系统绑定到名为 batch_group 资源组上执行,并使用该资源组所限制的 CPU 资源和 IOPS 资源。
CALL DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING(
ATTRIBUTE => 'function',
VALUE => 'ddl_high',
CONSUMER_GROUP => 'batch_group');

参数说明如下:

  • ATTRIBUTE :指定属性类型,column 表示 SQL 级资源隔离,user 表示用户级 user 资源隔离,function 表示用户级 function 资源隔离,属性名称不区分大小写。
  • VALUE :指定属性值,此处指定 DAG 线程对应的后台任务:compaction_high、ha_high、compaction_mid、ha_mid、compaction_low、ha_low、ddl 和 ddl_high,填写其中一个即可。当前仅支持指定一个任务。

为资源组启用合适的资源管理计划

由于不同的资源管理计划中,同一个资源组被限制的资源可能不同。您需要为资源组启用合适的资源管理计划。

SET GLOBAL resource_manager_plan = 'daytime';