首批通过分布式安全可靠测评,为关键业务系统打造
配置用户级资源隔离
更新时间:2026-04-10 11:58:35
用户级资源隔离是通过将某个用户执行的 SQL 绑定到指定资源组上执行来实现的。本文主要介绍了 MySQL 模式下用户级资源隔离的配置方法。
前提条件
开始配置用户级资源隔离前,建议您先了解资源组、资源管理计划、资源管理计划内容等基础概念,用户级资源隔离相关的基础概念及适用场景请参见 资源隔离概述。
由于 CPU 的资源隔离依赖 cgroup,如果需要控制 CPU 的资源隔离,则在开始配置用户级资源隔离前,必须配置 cgroup 目录并开启 cgroup 功能。配置 cgroup 目录并开启 cgroup 功能的相关操作请参见 配置 cgroup。
如果仅需要控制 IOPS 的资源隔离,则不需要配置 cgroup。
在进行 IOPS 资源隔离前,需要先进行磁盘性能校准,磁盘性能校准的相关操作请参见 磁盘性能校准。
如果仅需要控制 CPU 的资源隔离,则不需要进行磁盘性能校准。
请确认已创建好需要进行资源隔离的用户。创建用户的详细操作请参见 创建用户。
背景信息
用户级的资源隔离又分为用户级 user 资源隔离和用户级 function 资源隔离两种。有关两种资源隔离的更详细说明请参见 资源隔离概述。
步骤一(可选):将租户的 MAX_IOPS 和 MIN_IOPS 配置为有效值
说明
如果您在创建租户所使用的 Unit 规格时,已将 MAX_IOPS 和 MIN_IOPS 设置为 16 KB 读对应的 IOPS 值,或者,您不需要控制 IOPS 的资源隔离,请忽略本步骤。
完成磁盘校准后,在配置资源隔离计划前,需要保证租户的资源规格中 MAX_IOPS 和 MIN_IOPS 的值为有效值,这里的有效值指的是以 16 KB 读对应的 IOPS 值作为租户 IOPS 配置的参考值。
使用
root用户登录集群的sys租户。执行以下命令,查看待进行资源隔离的租户的资源规格。
obclient [oceanbase]> 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 | 2023-12-19 13:55:04.463295 | 2023-12-19 13:56:08.969718 | 3 | 3 | 2147483648 | 3221225472 | 9223372036854775807 | 9223372036854775807 | 3 | | 1001 | small_unit | 2023-12-19 13:56:09.851665 | 2023-12-19 13:56:09.851665 | 1 | 1 | 2147483648 | 6442450944 | 9223372036854775807 | 9223372036854775807 | 1 | | 1002 | medium_unit | 2023-12-19 13:56:10.030914 | 2023-12-19 13:56:10.030914 | 8 | 4 | 8589934592 | 25769803776 | 9223372036854775807 | 9223372036854775807 | 4 | | 1003 | large_unit | 2023-12-19 13:56:10.112115 | 2023-12-19 13:56:10.112115 | 16 | 8 | 21474836480 | 64424509440 | 9223372036854775807 | 9223372036854775807 | 8 | +----------------+-----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+---------------------+---------------------+-------------+ 4 rows in set根据查询结果,如果该租户的
MAX_IOPS和MIN_IOPS均为默认值INT64_MAX(9223372036854775807),则需要对租户可使用的 IOPS 资源重新进行规划。执行以下命令,确认租户部署在哪些 OBServer 节点上。
obclient [oceanbase]> SELECT DISTINCT SVR_IP, SVR_PORT FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE tenant_id = xxxx;查询结果的示例如下:
+----------------+----------+ | SVR_IP | SVR_PORT | +----------------+----------+ | xx.xxx.xxx.xx1 | xxxx1 | | xx.xxx.xxx.xx1 | xxxx2 | | xx.xxx.xxx.xx1 | xxxx3 | +----------------+----------+ 3 rows in set执行以下命令,确认待进行资源隔离的租户所在的 OBServer 节点上的磁盘校准值,使用 16 KB 读的磁盘校准值作为该节点 IOPS 设置的上限值。
obclient [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 | +----------------+----------+--------------+------+-------+-------+------+---------+ | xx.xxx.xxx.xx1 | xxxx1 | DATA | READ | 16384 | 48162 | 752 | 331 | | xx.xxx.xxx.xx1 | xxxx2 | DATA | READ | 16384 | 47485 | 741 | 336 | | xx.xxx.xxx.xx1 | xxxx3 | DATA | READ | 16384 | 48235 | 753 | 331 | +----------------+----------+--------------+------+-------+-------+------+---------+ 3 rows in set根据查询结果,将获取到的各节点的磁盘校准值作为上限值来规划租户可用的 IOPS。由于集群内可能有多个租户部署在相同的 OBServer 节点,您可以需要根据业务实际情况来分配这些 IOPS。
假设某集群下有两个租户,且两个租户都部署在相同的 OBServer 节点上,每个 OBServer 节点的 16 KB 读的磁盘 IOPS 基准值均相同,为 20000 IOPS,同时,预计两个租户的负载差不多,则可以将 20000 IOPS 平分给两个租户(具体可根据实际业务情况来为租户划分可用的 IOPS),即每个租户的
MAX_IOPS和MIN_IOPS均配置为 10000,您也可以根据业务考虑,将MIN_IOPS设置为小于MAX_IOPS的某个值。执行以下命令,修改租户的
MAX_IOPS和MIN_IOPS值。建议先修改
MIN_IOPS后再修改MAX_IOPS。ALTER RESOURCE UNIT unit_name MIN_IOPS = xxx;ALTER RESOURCE UNIT unit_name MAX_IOPS = xxx;
步骤二:配置资源隔离计划
以下示例中,将 tp_user 用户、ap_user用户或 compaction_high 任务、ddl_high 任务分别绑定在 interactive_group 和 batch_group 2 个资源组上,再通过资源管理计划 daytime 来控制不同用户或后台任务使用不同的 CPU 资源和 IOPS 资源。
租户管理员登录集群的 MySQL 租户。
调用
DBMS_RESOURCE_MANAGER系统包中的CREATE_CONSUMER_GROUP子程序,创建 2 个资源组。obclient [test]> CALL DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP( CONSUMER_GROUP => 'interactive_group' , COMMENT => 'TP' ); obclient [test]> CALL DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP( CONSUMER_GROUP => 'batch_group' , COMMENT => 'AP' );相关参数说明如下:
CONSUMER_GROUP:定义资源组名称。COMMENT:填写资源组的备注信息。
创建成功后,可以查询
oceanbase.DBA_RSRC_CONSUMER_GROUPS视图进行确认。有关oceanbase.DBA_RSRC_CONSUMER_GROUPS视图的详细介绍请参见 oceanbase.DBA_RSRC_CONSUMER_GROUPS。调用
DBMS_RESOURCE_MANAGER系统包中的CREATE_PLAN子程序,创建资源管理计划。obclient [test]> CALL DBMS_RESOURCE_MANAGER.CREATE_PLAN( PLAN => 'daytime', comment => 'TP优先');相关参数说明如下:
PLAN:定义资源管理计划名称。COMMENT:填写资源管理计划的备注信息。
创建成功后,可以查询
oceanbase.DBA_RSRC_PLANS视图进行确认。有关oceanbase.DBA_RSRC_PLANS视图的详细介绍请参见 oceanbase.DBA_RSRC_PLANS。调用
DBMS_RESOURCE_MANAGER系统包中的CREATE_PLAN_DIRECTIVE子程序,创建资源管理计划内容。用于启用资源管理计划时,限制资源组所使用的 CPU 资源和 IOPS 资源。obclient [test]> CALL DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE( PLAN => 'daytime', GROUP_OR_SUBPLAN => 'interactive_group' , COMMENT => '', MGMT_P1 => 30, UTILIZATION_LIMIT =>80, MIN_IOPS => 30, MAX_IOPS => 90, WEIGHT_IOPS => 80); obclient [test]> CALL DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE( PLAN => 'daytime', GROUP_OR_SUBPLAN => 'batch_group' , COMMENT => '', MGMT_P1 => 50, 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 资源。如果取值为70则表示最大可使用租户 70% 的 CPU 资源。MIN_IOPS:用于出现 IO 争用时,资源组预留的 IOPS 资源,总和不超过 100,默认值为0。MAX_IOPS:用于指定资源组最大可使用的 IOPS 资源,总和可以超过 100,默认值为100。WEIGHT_IOPS:用于指定 IOPS 的权重值,总和可以超过100,默认值为0。
创建成功,可以查询
oceanbase.DBA_RSRC_PLAN_DIRECTIVES视图和oceanbase.DBA_OB_RSRC_IO_DIRECTIVES视图进行确认。有关
oceanbase.DBA_RSRC_PLAN_DIRECTIVES视图的详细介绍,请参见 oceanbase.DBA_RSRC_PLAN_DIRECTIVES。有关
oceanbase.DBA_OB_RSRC_IO_DIRECTIVES视图的详细介绍,请参见 oceanbase.DBA_OB_RSRC_IO_DIRECTIVES。调用
DBMS_RESOURCE_MANAGER系统包中的SET_CONSUMER_GROUP_MAPPING子程序,根据实际使用场景,创建用户级资源隔离匹配规则。创建用户级 user 资源隔离匹配规则。
obclient [test]> CALL DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING( ATTRIBUTE => 'user', VALUE => 'tp_user', CONSUMER_GROUP => 'interactive_group'); obclient [test]> CALL DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING( ATTRIBUTE => 'user', VALUE => 'ap_user', CONSUMER_GROUP => 'batch_group');相关参数说明如下:
ATTRIBUTE:指定属性类型,column表示 SQL 级资源隔离,user表示用户级 user 资源隔离,function表示用户级 function 资源隔离,属性名称不区分大小写。VALUE:指定属性值,此处指定用户名即可。当前仅支持指定一个用户。CONSUMER_GROUP:指定需要绑定的资源组。表示当 SQL 命中VALUE中所设置的匹配规则后,需要绑定在哪个资源组上执行该语句。当前仅支持绑定一个资源组。如果未指定要绑定的资源组,则默认绑定系统内置的
OTHER_GROUPS。系统内置的OTHER_GROUPS对应的资源如下:MIN_IOPS = 100 - SUM(租户内其他资源组的总和)
MAX_IOPS = 100
WEIGHT_IOPS = 100
创建用户级 function 资源隔离匹配规则。
obclient [test]> CALL DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING( ATTRIBUTE => 'function', VALUE => 'compaction_high', CONSUMER_GROUP => 'interactive_group'); obclient [test]> 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 线程对应的 8 种后台任务:compaction_high、ha_high、compaction_mid、ha_mid、compaction_low、ha_low、ddl 和 ddl_high,填写其中一个即可。当前仅支持指定一个任务。CONSUMER_GROUP:指定需要绑定的资源组。表示当 SQL 命中VALUE中所设置的匹配规则后,需要绑定在哪个资源组上执行该语句。当前仅支持绑定一个资源组。如果未指定要绑定的资源组,则默认绑定系统内置的
OTHER_GROUPS。系统内置的OTHER_GROUPS对应的资源如下:MIN_IOPS = 100 - SUM(租户内其他资源组的总和)
MAX_IOPS = 100
WEIGHT_IOPS = 100
创建成功后,可以查询
oceanbase.DBA_RSRC_GROUP_MAPPINGS视图进行确认。有关oceanbase.DBA_RSRC_GROUP_MAPPINGS视图的详细介绍请参见 oceanbase.DBA_RSRC_GROUP_MAPPINGS。为资源组启用合适的资源管理计划。
由于不同的资源管理计划中,同一个资源组被限制的资源可能不同。您需要为资源组启用合适的资源管理计划。
obclient [test]> SET GLOBAL resource_manager_plan = 'daytime';说明
如果不需要对资源进行限制,可以使用
SET GLOBAL resource_manager_plan = '';语句禁用所有资源计划。
配置后注意事项
资源隔离匹配规则添加后,如果删除了用户后再重建,资源隔离匹配规则仍然适用。
资源隔离匹配规则添加成功后不是立即生效,预计可能在 10 秒内开始生效,具体以实际环境为准。
用户级资源隔离的优先级低于 SQL 级资源隔离。
资源隔离匹配规则添加后,目前仅在
SELECT、INSERT、UPDATE、DELETE等语句中生效,在 DDL 和 DCL 语句中不生效,在 PL 中也不生效。在 prepareStatement 中可以生效。
配置项后性能影响
用户级资源隔离在 SQL 未解析前即可确认使用哪个资源组的资源,故对性能无影响。