使用多租户模式进行资源隔离
操作场景
本章节为您介绍开启多租户模式后,进行资源配置管理及租户管理。
功能列表
模块 |
子模块 |
描述 |
---|---|---|
租户级 |
资源配置(resource_config)和租户是一对多的关系,当某一租户绑定此资源配置时便可限制此租户下用户使用的CPU资源。仅在高权限root用户下可使用。 |
|
创建租户时,需要绑定已经创建的资源配置(resource_config),以此限制该租户下用户使用的CPU资源。仅在高权限root用户下可使用。 |
||
数据库分为系统租户下的数据库和普通租户下的数据库。系统租户可以访问所有数据库,普通租户只能访问属于自己的数据库。 |
||
当前实现了通用表空间GENERAL TABLESPACE的租户间隔离,其中TABLESPACE分为系统租户下的TABLESPACE和普通租户下的TABLESPACE。 |
||
用户级 |
开启多租模式后,用户分为系统租户下的用户和普通租户下的用户。存量的用户均属于系统租户,新创的用户根据接口语义属于系统租户或者普通租户。 |
|
租户下的用户默认共享当前租户的资源,若要进行用户级资源限制,请使用本节提供的用户级资源配置接口。 |
||
多个用户可以归属到同一个资源消费组(consumer_group),这些用户共享资源消费组所关联的资源,通过租户下的用户连接数据库,进行资源消费组管理。 |
||
资源计划(plan)用于控制资源计划指令(plan_directive)的启用或禁用。一个资源计划关联一个或多个资源计划指令。启用或禁用资源计划可使对应的资源计划指令生效或失效,同一个租户内至多只能启用一个资源计划。 |
||
资源计划指令描述了一个资源消费组具体的资源配置情况,一个资源计划指令唯一对应一个资源消费组;一个资源消费组可以关联多个资源计划指令,其中至多只允许启用一个资源计划指令,启用资源计划指令由上述启用资源计划实现。 |
||
清空当前租户下所有的用户级资源配置相关的数据。 |
||
- |
查询用户级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;
- TaurusDB实例内核版本大于等于2.0.60.241200
参数 |
描述 |
---|---|
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暂不允许普通租户访问。
- 创建数据库
- 创建系统租户的数据库。
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 = ``;
- 将数据库分配给租户名为tenant_name的普通租户。
- 查看映射关系
- 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;
- TaurusDB实例内核版本大于等于2.0.60.241200

- 如果数据库是开启多租后创建的,以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进行绑定, 需要表和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'@'%';
- 为用户'user_1@tenant_1'@'%'授予租户tenant_1下的priv_type权限。
- 创建用户
创建当前租户下的用户。
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';
- 为用户user1授予当前租户下的priv_type权限。
多个用户可以归属到同一个资源消费组(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;
- TaurusDB实例内核版本大于等于2.0.60.241200
- 查看资源消费组和用户的关联关系
视图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;
- TaurusDB实例内核版本大于等于2.0.60.241200
资源计划(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;
- TaurusDB实例内核版本大于等于2.0.60.241200
资源计划指令描述了一个资源消费组具体的资源配置情况,一个资源计划指令唯一对应一个资源消费组;一个资源消费组可以关联多个资源计划指令,其中至多只允许启用一个资源计划指令,启用资源计划指令由上述启用资源计划实现。
- 更新资源计划指令
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;
- TaurusDB实例内核版本大于等于2.0.60.241200