更新时间:2025-09-04 GMT+08:00

使用多租户模式进行资源隔离

操作场景

本章节为您介绍开启多租户模式后,进行资源配置管理及租户管理。

功能列表

表1 功能简介

模块

子模块

描述

租户级

租户级资源配置管理

资源配置(resource_config)和租户是一对多的关系,当某一租户绑定此资源配置时便可限制此租户下用户使用的CPU资源。仅在高权限root用户下可使用。

租户管理

创建租户时,需要绑定已经创建的资源配置(resource_config),以此限制该租户下用户使用的CPU资源。仅在高权限root用户下可使用。

数据库管理

数据库分为系统租户下的数据库和普通租户下的数据库。系统租户可以访问所有数据库,普通租户只能访问属于自己的数据库。

表空间管理

当前实现了通用表空间GENERAL TABLESPACE的租户间隔离,其中TABLESPACE分为系统租户下的TABLESPACE和普通租户下的TABLESPACE。

用户级

用户管理

开启多租模式后,用户分为系统租户下的用户和普通租户下的用户。存量的用户均属于系统租户,新创的用户根据接口语义属于系统租户或者普通租户。

用户级资源配置

租户下的用户默认共享当前租户的资源,若要进行用户级资源限制,请使用本节提供的用户级资源配置接口。

资源消费组管理

多个用户可以归属到同一个资源消费组(consumer_group),这些用户共享资源消费组所关联的资源,通过租户下的用户连接数据库,进行资源消费组管理。

资源计划管理

资源计划(plan)用于控制资源计划指令(plan_directive)的启用或禁用。一个资源计划关联一个或多个资源计划指令。启用或禁用资源计划可使对应的资源计划指令生效或失效,同一个租户内至多只能启用一个资源计划。

资源计划指令管理

资源计划指令描述了一个资源消费组具体的资源配置情况,一个资源计划指令唯一对应一个资源消费组;一个资源消费组可以关联多个资源计划指令,其中至多只允许启用一个资源计划指令,启用资源计划指令由上述启用资源计划实现。

清空用户级配置

清空当前租户下所有的用户级资源配置相关的数据。

-

CPU使用率统计

查询用户级CPU使用率和租户级CPU使用率。

租户级资源配置管理

资源配置(resource_config)和租户是一对多的关系,当某一租户绑定此资源配置时便可限制此租户下用户使用的CPU资源。仅在高权限root用户下可使用。

各租户下的实例的读写性能峰值并非和分配到的CPU资源呈线性关系。例如16U的实例分配给2个租户的MAX_CPU均为8U,那么两个租户同时满载跑业务的总共的TPS将达不到8U实例的2倍。即租户下的实例性能可能比同等规格的非多租实例的性能稍低。

  • 创建资源配置
    CREATE resource_config config_name MAX_CPU [=] max_cpu_value [MIN_CPU [=] min_cpu_value];
  • 更新资源配置
    如果该resource_config已经绑定租户,且更新后MIN_CPU值大于原有的MIN_CPU值,则需要校验修改后的值是否满足资源约束,否则不做资源约束校验。
    ALTER resource_config config_name MAX_CPU [=] max_cpu_value [MIN_CPU [=] min_cpu_value];
  • 删除资源配置
    若租户正在使用该资源配置,则无法进行删除操作。
    DROP resource_config config_name;
  • 查看资源配置
    • TaurusDB实例内核版本大于等于2.0.60.241200
      SELECT * FROM information_schema.MT_RESOURCE_CONFIG;
    • TaurusDB实例内核版本小于2.0.60.241200
      SELECT * FROM information_schema.DBA_RSRC_TENANT_RESOURCE_CONFIGS;
表2 参数说明

参数

描述

config_name

资源配置名称。最大长度为64,仅支持包含大写字母、小写字母、数字或下划线。

MAX_CPU

绑定该资源配置的租户能够使用的最大CPU资源,单位为核数,最小值为0.1,最大值为实例规格中的CPU核数,可查看变量“mt_flavor_cpu”获取。粒度0.1。

CPU争抢时,租户间资源分配会尽量按照租户的MIN_CPU分配资源,但存在一定的误差,误差通常在1U以内。

MIN_CPU

在CPU资源争抢时,承诺分配给绑定该资源配置的租户的CPU资源,单位为核数,为可选项。

默认等于MAX_CPU,最小值为0.1,最大值不超过MAX_CPU。粒度为0.1。shared_tenants_config为系统内置的资源配置,其MIN_CPU为0。

承诺分配给租户的CPU资源遵循按需分配策略,不会预留,例如:承诺给租户分配1U,但如果租户业务空闲,只会使用0.3U,则剩余的0.7U会按需分配给其他租户。

租户管理

包含创建、更改、删除及查看租户。

创建租户时,需要绑定已经创建的资源配置(resource_config),以此限制该租户下用户使用的CPU资源。仅在高权限root用户下可使用。

创建租户会进行资源约束检查,需要保证所有租户的资源配置中MIN_CPU之和满足资源约束。

租户间资源充分利用。例如8U实例,分配给租户A的MIN_CPU是3U,MAX_CPU是8U。分配给租户B的MIN_CPU是5U,MAX_CPU是8U。当租户A没有负载情况下,租户B可以使用到8U。如果租户A负载1U,则租户B可使用7U。

CREATE TENANT tenant_name RESOURCE_CONFIG config_name [COMMENT [=] 'comment_string'];
  • tenant_name长度不超过10个字符,仅支持包含小写字母、数字或下划线_。
  • 如果租户绑定shared_tenants_config,则租户成为共享租户,否则是独占租户。当发生资源争抢时,优先满足独占租户的MIN_CPU承诺资源需求,剩余的资源再由共享租户和独占租户争抢。
ALTER TENANT tenant_name RESOURCE_CONFIG config_name [COMMENT [=] 'comment_string'];
  • 如果新绑定的resource_config的MIN_CPU值大于等于原有resource_config的MIN_CPU值时,会进行资源约束检查,需要保证所有租户的资源配置中MIN_CPU之和满足资源约束。
  • 如果独占租户新绑定到shared_tenants_config,则成为共享租户,将同时删除租户下的用户级资源隔离相关的配置。
DROP TENANT tenant_name;
  • 需要保证租户下的DB和用户已经被删除,否则,无法删除租户。
  • 删除租户的同时将删除租户关联的用户级资源隔离相关的配置。
  • TaurusDB实例内核版本大于等于2.0.60.241200
    SELECT * FROM information_schema.MT_TENANT;
  • TaurusDB实例内核版本小于2.0.60.241200
    SELECT * FROM information_schema.DBA_RSRC_TENANT;

数据库管理

数据库分为系统租户下的数据库和普通租户下的数据库。

租户内不可以创建部分特殊数据库:INFORMATION_SCHEMA, PERFORMANCE_SCHEMA, MYSQL, SYS, __recyclebin__。

  • 系统租户:可以访问所有数据库,在系统租户下需要以db_name@tenant_name的方式对普通租户下的数据库进行操作。在系统租户下,原有连接数据库方式不变。
  • 普通租户:只能访问属于自己的数据库。系统库SYS、MYSQL暂不允许普通租户访问。
    连接数据库指定用户时,需要以user_name@tenant_name的形式;指定数据库时,支持db_name和db_name@tenant_name两种形式。
    mysql --host=**** -u user1@tenant_1 -D db1 -p password;
    mysql --host=**** -u user1@tenant_1 -D db1@tenant_1 -p password;
  • 创建数据库
    • 创建系统租户的数据库。
      CREATE DATABASE [IF NOT EXISTS] `db_name`;
    • 创建普通租户的数据库。
      CREATE DATABASE [IF NOT EXISTS] `db_name@tenant_name`; 
  • 删除数据库
    • 删除系统租户的数据库。
      DROP DATABASE [IF EXISTS] `db_name`;
    • 删除普通租户的数据库。
      DROP DATABASE [IF EXISTS] `db_name@tenant_name`;
  • 创建当前租户的数据库。
    CREATE DATABASE [IF NOT EXISTS] 'db_name'; 
  • 删除当前租户的数据库。
    DROP DATABASE [IF EXISTS] 'db_name';

为保证兼容性,升级或者迁移到多租实例后,存量的数据库默认属于系统租户,可以通过如下语法将存量的数据库分配给租户。此外,对于已经开启多租特性后,系统租户创建的且未分配给普通租户的数据库,也可通过如下语法分配数据库给对应租户。

仅在高权限root用户下可使用。

  • 数据库分配
    • 将数据库分配给租户名为tenant_name的普通租户。
      ALTER DATABASE db_name TENANT = `tenant_name`;
    • 将数据库回收到系统租户下。
      ALTER DATABASE db_name TENANT = ``;
  • 查看映射关系
    • TaurusDB实例内核版本大于等于2.0.60.241200
      SELECT * FROM information_schema.MT_TENANT_DB
    • TaurusDB实例内核版本小于2.0.60.241200
      SELECT * FROM information_schema.DBA_RSRC_TENANT_DB;
  • 如果数据库是开启多租后创建的,以db_name@tenant_name格式命名的数据库不允许分配调用此接口,接口会返错。
  • 如果tenant不存在,且不为空,接口返错。

表空间管理

当前实现了通用表空间GENERAL TABLESPACE的租户间隔离,其中TABLESPACE分为系统租户下的TABLESPACE和普通租户下的TABLESPACE。系统租户可以访问所有TABLESPACE,普通租户只能访问属于自己的TABLESPACE。在升级和迁移场景下,存量的TABLESPACE不做改动,统一归属于系统租户的TABLESPACE。

  • 创建表空间
    • 创建系统租户的表空间
      CREATE TABLESPACE `tablespace_name`;
      CREATE TABLESPACE `tablespace_name` add datafile `tablespace_file_name.ibd`;
    • 创建普通租户的表空间
      CREATE TABLESPACE `tablespace_name@tenant_name`;
      CREATE TABLESPACE `tablespace_name@tenant_name` add datafile `tablespace_file_name.ibd`;
  • 删除表空间
    • 删除系统租户的表空间
      DROP TABLESPACE `tablespace_name`;
    • 删除普通租户的表空间
      DROP TABLESPACE `tablespace_name@tenant_name`;
  • 重命名表空间
    • 重命名系统租户的表空间
      ALTER TABLESPACE `tablespace_name` RENAME TO `tablespace_name`;
    • 重命名普通租户的表空间
      ALTER TABLESPACE ` tablespace_name@tenant_name ` RENAME TO `new_tablespace_name@tenant_name`;
  • 表空间与表绑定
    • 创建系统租户下的表,并与指定TABLESPACE关联
      CREATE TABLE table_name … TABLESPACE [=] `tablespace_name`;
    • 创建普通租户下的表,并与指定TABLESPACE关联
      CREATE TABLE table_name … TABLESPACE [=] `tablespace_name@tenant_name`;
    • 将系统租户下的存量表与指定TABLESPACE关联
      ALTER TABLE table_name TABLESPACE `tablespace_name`;
    • 将普通租户下的存量表到指定TABLESPACE关联
      ALTER TABLE table_name TABLESPACE `tablespace_name@tenant_name`;

在系统租户下将普通租户的表与普通租户的tablespace进行绑定, 需要表和tablespace属于同一个tenant。

  • 创建当前租户的表空间

    若某个租户创建的tablespace的datafile与自己或者其他租户创建的tablespace的datafile相同,那么这个租户此次创建的tablespace会失败.

    CREATE TABLESPACE tablespace_name;

    启用多租开关后,表空间名称的最大长度由64降低到50,且不能包含`@`字符。

    特殊的表空间无法被创建,如以innodb_开头的表空间无法被创建。

  • 删除当前租户的表空间
    DROP TABLESPACE tablespace_name;
  • 重命名当前租户的表空间
    ALTER TABLESPACE old_tablespace_name RENAME TO new_tablespace_name ;
  • 创建当前租户的表,并与指定TABLESPACE关联
    CREATE TABLE table_name … TABLESPACE [=] tablespace_name;
  • 将当前租户的存量表与指定TABLESPACE关联
    ALTER TABLE table_name TABLESPACE tablespace_name;

    在系统租户下将普通租户的表与tablespace进行绑定,若新的tablespace的名字以innodb_开头,说明此tablespace为系统tablespace,此时tablespace_name不用带上@tenant_name。

用户管理

开启多租模式后,用户分为系统租户下的用户和普通租户下的用户。存量的用户均属于系统租户,新创的用户根据接口语义属于系统租户或者普通租户。

约束限制:

  • 以系统租户身份创建或删除普通租户下的用户时,需要以user_name@tenant_name的方式对用户进行操作。
  • 普通租户下的用户名称的长度被限制为不超过20个字符。
  • 租户内不可以创建部分特殊用户:mysql.sys, mysql.session, mysql.infoschema以及参数rds_reserved_users中保留的用户。
  • 多租户隔离特性关闭时,无法重命名普通租户下的用户。
  • 在系统租户下,对普通租户下的用户重命名时,需要保证user_from和user_to中的tenant_name相同,如不相同,则接口返错。
  • 创建用户
    • 创建系统租户下的用户。
      CREATE user [IF NOT EXISTS] user_name@'host' IDENTIFIED BY 'password';
    • 创建普通租户下的用户。
      CREATE user [IF NOT EXISTS] 'user_name@tenant_name'@'host' IDENTIFIED BY 'password'; 
  • 重命名用户
    • 重命名系统租户下的用户。
      RENAME USER user_from@host1 TO user_to@'host'; 
    • 重命名普通租户下的用户。
      RENAME USER 'user_from@tenant_name'@host1 TO 'user_to@tenant_name'@'host'; 
  • 删除用户
    • 删除系统租户下的用户。
      DROP USER [IF EXISTS] user_name@'host'; 
    • 删除普通租户下的用户。
      DROP USER [IF EXISTS] 'user_name@tenant_name'@'host';
  • 授权用户
    • 为用户'user_1@tenant_1'@'%'授予租户tenant_1下的priv_type权限。
      GRANT priv_type ON *.* to 'user_1@tenant_1'@'%' with grant option;
    • 查看权限:
      SHOW grants for 'user_1@tenant_1'@'%';
  • 创建用户

    创建当前租户下的用户。

    CREATE user [IF NOT EXISTS] user_name@'host' IDENTIFIED BY 'password'; 
  • 重命名用户
    RENAME USER user_from@host1 TO user_to@'host';
  • 删除用户
    DROP USER [IF EXISTS] user_name@'host';
  • 授权用户
    • 为用户user1授予当前租户下的priv_type权限。
      GRANT priv_type ON *.* to 'user_1'@'%' with grant option;
    • 查看权限。
      SHOW grants for 'user_1';

用户级资源配置

租户下的用户默认共享当前租户的资源,若要进行用户级资源限制,请使用本节提供的用户级资源配置接口。

共享租户无法进行用户级资源配置。

多个用户可以归属到同一个资源消费组(consumer_group),这些用户共享资源消费组所关联的资源,通过租户下的用户连接数据库,进行资源消费组管理。

  • 创建消费组
    dbms_resource_manager.create_consumer_group (
       consumer_group     CHAR(128),
       comment            CHAR(2000));

    参数说明:

    • consumer_group:资源消费组名称,仅支持包含大写字母、小写字母、数字或下划线。
    • comment:资源消费组说明,可为''。
  • 添加用户到资源消费组/从资源消费组中移除用户
    dbms_resource_manager.set_consumer_group_mapping ( 
       attribute        CHAR(128),  
       value            varbinary(128),  
       consumer_group   CHAR(128));

    参数说明:

    • attribute:要添加或修改的映射属性,当前版本仅支持USER。
    • value:要添加或修改的映射属性,当前版本仅支持用户名。
    • consumer_group:资源消费组名称,当参数不为空时将用户添加到资源消费组,当参数为空('')时,将用户从所在的资源消费组中移除。
  • 删除消费组
    dbms_resource_manager.delete_consumer_group (
        consumer_group   CHAR(128));

    参数说明:

    consumer_group:资源消费组名称。

    • 删除consumer_group的时候会同步删除该资源消费组对应的plan_directive以及consumer_group_mapping。
    • 如果特性开关打开,删除用户时,会自动将用户从已关联的资源消费组中移除。当特性关闭时,删除用户时不会自动从已关联的资源消费组中移除,但不会有任何影响,当后续重新打开特性时,如果发现关联到资源消费组的用户已经被删除,会自动将这些用户从已关联的资源消费组中移除。
    • 如果特性开关打开,重命名用户时,不影响用户与资源消费组的关联关系。如果特性开关关闭后,删除用户,再创建同名用户,后续打开特性,该用户依然属于原有的资源消费组。
  • 查看资源消费组

    视图DBA_RSRC_CONSUMER_GROUPS记录了资源消费组信息。如果以系统租户下的用户身份下查看,则可以查询到所有租户的资源消费组信息,如果在普通租户下查看,只能看到当前租户下的资源消费组信息。

    • TaurusDB实例内核版本大于等于2.0.60.241200
      SELECT * FROM information_schema.MT_CONSUMER_GROUP;
    • TaurusDB实例内核版本小于2.0.60.241200
      SELECT * FROM information_schema.DBA_RSRC_CONSUMER_GROUPS;
  • 查看资源消费组和用户的关联关系

    视图DBA_RSRC_GROUP_MAPPINGS记录了用户和资源消费组的关联关系。如果以系统租户下的用户身份下查看,则可以查询到所有租户的用户和资源消费组的关联关系,如果在普通租户下查看,只能看到当前租户下的用户和资源消费组的关联关系。

    • TaurusDB实例内核版本大于等于2.0.60.241200
      SELECT * FROM information_schema.MT_GROUP_MAPPING_RULE;
    • TaurusDB实例内核版本小于2.0.60.241200
      SELECT * FROM information_schema.DBA_RSRC_GROUP_MAPPINGS;

资源计划(plan)用于控制资源计划指令(plan_directive)的启用或禁用。一个资源计划关联一个或多个资源计划指令。启用或禁用资源计划可使对应的资源计划指令生效或失效,同一个租户内至多只能启用一个资源计划。

  • 创建资源计划
    dbms_resource_manager.create_plan (
       plan_name         VARCHAR(128), 
       comment           VARCHAR(2000));
    • 若删除当前启用的资源计划,则会将当前启用的资源计划设置为空,同时删除对应的资源计划指令(plan_directive)。
    • plan默认可配置的最大数量为128,由参数mt_resource_plan_num控制。

    参数说明:

    • plan_name:资源计划名称,仅支持包含大写字母、小写字母、数字或下划线。
    • comment:资源计划描述信息,可为''。
  • 启用或禁用资源计划
    dbms_resource_manager.set_resource_manager_plan( 
        plan_name     VARCHAR(128));

    参数说明:

    plan_name:资源计划名称。如果为空(''),则禁用资源计划。

  • 删除资源计划
    dbms_resource_manager.delete_plan (
        plan_name    VARCHAR(128));

    删除当前正在启用的资源计划,则会将当前启用的资源计划设置为空,同时删除所关联的资源计划指令(plan_directive)。

    参数说明:

    plan_name:资源计划名称。

  • 查看资源计划

    视图DBA_RSRC_PLANS记录资源计划的详细信息。如果在系统租户下查看,则可以查询到所有租户的资源计划,如果在普通租户下查看,只能看到当前租户下的资源计划。

    • TaurusDB实例内核版本大于等于2.0.60.241200
      SELECT * FROM information_schema.MT_RESOURCE_PLAN;
    • TaurusDB实例内核版本小于2.0.60.241200
      SELECT * FROM information_schema.DBA_RSRC_PLANS;

资源计划指令描述了一个资源消费组具体的资源配置情况,一个资源计划指令唯一对应一个资源消费组;一个资源消费组可以关联多个资源计划指令,其中至多只允许启用一个资源计划指令,启用资源计划指令由上述启用资源计划实现。

  • 更新资源计划指令
    dbms_resource_manager.update_plan_directive (
       plan                    CHAR(128), 
       group_or_subplan        CHAR(128), 
       new_comment             VARCHAR(2000), 
       new_mgmt_p1             bigint(20),
       new_utilization_limit   bigint(20));

    同一资源消费组下的用户共享当前启用的资源计划指令配置的资源。例如:同一租户下的用户user1和user2都添加到资源消费组consumer_group1中,consumer_group1当前启用的资源计划指令的UTILIZATION_LIMIT为70,mgmt_p1为10,则user1和user2可使用的CPU资源总和最大为当前租户70%,CPU争抢时,保证user1和user2可获得的CPU资源总和为当前租户10%。

    表3 参数说明

    参数

    说明

    plan

    资源计划(plan)的名称。

    group_or_subplan

    资源消费组(consumer_group)的名称。

    comment

    资源计划指令的描述信息,可为''。

    mgmt_p1

    在CPU资源争抢的情况下,承诺分配给本资源消费组的CPU资源占所属租户总CPU资源的比例,取值范围[0, 100],表示使用所属租户100%的CPU。同一租户且同一个资源计划(plan)所关联的所有资源计划指令(plan_directive)的mgmt_p1总和不超过100。当租户内的各个资源消费组发生CPU争抢,优先保证承诺分配各个资源消费组CPU资源,剩余的CPU资源由各个资源消费组争抢。承诺分配给资源消费组的CPU资源也遵循按需分配策略,不会预留。

    例如:承诺给当前资源消费组20%的CPU资源,但当前资源消费组业务量较少,只需要5%的CPU资源,则剩余的15%的CPU资源会按需分配给其他资源消费组。

    utilization_limit

    资源消费组可用的CPU资源的上限占所属租户总CPU资源的比例,取值范围为 [1, 100]。表示最大可使用租户全部CPU资源,如果取值为70则表示最大可使用租户 70%的CPU资源。

  • 删除资源计划指令

    删除正在启用的plan_directive, 将导致对应用户的资源配置失效。

    dbms_resource_manager.delete_plan_directive (
        plan                   CHAR(128), 
        group_or_subplan       VARCHAR(128));
    表4 参数说明

    参数

    说明

    plan

    资源计划(plan)的名称。

    group_or_subplan

    资源消费组(consumer_group)的名称。

  • 查看资源计划指令

    DBA_RSRC_PLAN_DIRECTIVES记录资源计划指令的详细信息。如果在系统租户下查看,则可以查询到所有租户的资源计划指令,如果在普通租户下查看,只能看到当前租户下的资源计划指令。

    • TaurusDB实例内核版本大于等于2.0.60.241200
      SELECT * FROM information_schema.MT_PLAN_DIRECTIVE;
    • TaurusDB实例内核版本小于2.0.60.241200
      SELECT * FROM information_schema.DBA_RSRC_PLAN_DIRECTIVES;

清空当前租户下所有的用户级资源配置相关的数据,包括资源消费组、资源计划,资源计划指令。在系统租户下执行,也只会清空系统租户下的用户级资源配置。

dbms_resource_manager.clear_all_configs();

CPU使用率统计

新增视图cpu_summary_by_user和cpu_summary_by_tenant,用于显示用户级和租户级的CPU使用信息。