本文介绍了PolarDB MySQL版提供的租户管理简介以及使用说明等内容。
简介
PolarDB MySQL版提供的多租户模式,可以使得多个租户在同一个集群下共享计算资源和存储资源,且保证各租户下的数据隔离和资源隔离。 各个租户仅能访问到自己的数据,租户之间不会出现资源争抢,以保证业务的稳定运行。技术原理如下图所示:

术语
租户:租户(Tenant)为实现多租户模式所提出的概念,租户的层级结构在一个数据库实例之下,在数据库与用户之上。租户分为系统租户和普通租户:
系统租户:系统租户是为了适配原有模式下用户的使用,原有数据库实例中的用户默认属于系统租户,也可以称为系统用户。当通过系统租户下的用户连接数据库时,若该用户拥有对应的数据库实例访问权限,即可访问所有租户下的数据库实例。
普通租户:普通租户需要在系统租户下进行创建,普通租户下的数据库实例与用户完全隔离,无法互相访问,并且普通租户无法访问系统租户下的数据库实例。在进行CPU资源调度时,普通租户根据min_cpu是否大于0将普通租户分为独占型租户和共享型租户。
独占型租户:min_cpu>0,需要保证任何时刻的CPU资源不小于min_cpu。
共享型租户:min_cpu=0。
独占型租户和共享型租户可以通过调整min_cpu的值进行相互转换。
资源配置:资源配置(resource_config)是为了实现多租户资源隔离与资源调度所提出的概念,一个资源配置描述了一个租户下能够使用的资源。当前PolarDB MySQL版仅支持对CPU资源进行隔离以及调度。
优势
阿里云的云原生数据库 PolarDB MySQL 版的多租户管理功能提供了一系列的优势,主要包括:
资源优化与共享:多租户模式允许多个租户在同一集群下共享计算和存储资源,优化资源使用效率,同时降低成本。
数据隔离与安全性:每个租户只能访问自己的数据,确保了数据的隔离性和安全性,防止数据泄露和未授权访问。
资源隔离与调度:通过资源配置,可以实现对CPU资源的隔离和调度,保证不同租户之间的资源不会发生争抢,从而确保业务的稳定运行。
灵活的租户管理:支持创建、更新、查看和删除租户,以及对租户的资源配置进行管理,提供了灵活的租户管理能力。
用户权限控制:在系统租户和普通租户下进行用户的创建、删除和权限管理,确保了用户权限的精确控制。
数据库操作的简化:在系统租户下创建或删除数据库时,可以简化操作,通过指定租户名称来执行数据库操作。
审计日志的增强:在租户模式下进行的操作会被记录在审计日志中,提供了物理数据库和物理用户的详细信息,增强了审计和合规性。
线程组与租户的绑定关系查看:可以通过SQL查询来查看线程组与租户的绑定关系,便于管理和监控。
这些优势使得 PolarDB MySQL 版的多租户管理功能成为一个强大的工具,适用于需要高度数据隔离和资源优化的企业级应用场景。
使用前提
PolarDB MySQL版集群的产品版本为企业版,集群的内核版本需为8.0.2及以上,且集群的节点规格需要保持一致。
租户管理与资源隔离功能目前处于灰度发布阶段,如有需求,您可以添加钉钉群联系工作人员来开启该功能。功能开启后,您需要重启目标集群才能生效。钉钉群号:59535005981。
注意事项
暂不支持租户下的Binlog信息同步。
暂不支持对用户部分权限进行撤销。
使用说明
开启单机多租户模式
开启数据隔离功能
开启数据隔离功能,需要将参数enable_multi_tenant的值设置为ON,且目标集群中的数据库名或用户名中不包含参数multi_tenant_separator的值。
开启资源隔离功能
若需要同时开启数据隔离功能和资源隔离功能,则需要将参数thread_pool_enabled、enable_multi_tenant以及thread_pool_multi_tenant_enabled的值均设置为ON,且需要保证参数thread_pool_size的值与目标集群的节点规格的核数保持一致。您可以在目标集群的基本信息页面的数据库节点区域查看集群的节点规格。如下图:

若有单机多租户需求,您可以添加钉钉群来联系工作人员开启数据隔离功能或同时开启数据隔离和资源隔离功能。钉钉群号:59535005981。功能开启后,您需要重启目标集群才能生效。
资源管理
PolarDB MySQL版单机多租户模式下的资源隔离仅支持CPU资源隔离,在创建资源配置时,指定此资源配置所对应的CPU资源限制条件min_cpu和max_cpu。当某一租户绑定此资源限制条件时便可限制此租户下user连接使用的CPU资源。
创建资源配置
使用高权限账号连接数据库,并通过CREATE语句来创建资源配置。示例如下:
CREATE resource_config r1 min_cpu 0 max_cpu 1;
CREATE resource_config r2 min_cpu 1 max_cpu 4;创建资源配置时,PolarDB将不会检测资源配置信息与集群节点规格的关系,仅当租户绑定资源限制条件时才会进行检测。
任意一个租户的
min_cpu不超过当前集群节点规格的核数-1,需要为系统租户预留1CPU。否则,在创建租户时,租户与资源配置会绑定失败。系统租户下的用户可使用的资源为CPU资源总和减去所有独占型租户占用的CPU资源。
查看资源配置
使用高权限账号连接数据库,并通过SELECT语句来查看资源配置。示例如下:
SELECT * FROM mysql.tenant_resource_config;更新资源配置
使用高权限账号连接数据库,并通过ALTER语句来更新资源配置。示例如下:
ALTER resource_config r2 min_cpu 1 max_cpu 2;若租户正在使用该资源配置,则无法进行更新操作。
删除资源配置
使用高权限账号连接数据库,并通过DROP语句来删除资源配置。示例如下:
DROP resource_config r1;若租户正在使用该资源配置,则无法进行删除操作。
租户管理
创建租户
使用高权限账号连接数据库,并通过CREATE语句来创建新租户。示例如下:
CREATE tenant tenant_name resource_config r1;tenant_name长度不超过10个字符,并且支持包含大写字母、小写字母、数字或下划线(_)。
需要保证所有租户的资源配置中
min_cpu之和不能超过当前集群节点规格中的核数-1。
更新租户
使用高权限账号连接数据库,并通过AlTER语句来更新租户。示例如下:
ALTER tenant tenant_name resource_config r2;需要保证所有租户的资源配置中min_cpu之和不能超过当前集群节点规格中的核数-1。
查看租户
使用高权限账号连接数据库,并通过SELECT语句来查看租户。示例如下:
SELECT * FROM mysql.tenants;删除租户
使用高权限账号连接数据库,并通过DROP语句来删除租户。示例如下:
DROP tenant tenant_name;删除租户时,需要保证租户下的数据库已经被删除。否则,无法删除租户。
删除租户操作默认会将租户下的所有用户都删除,请谨慎操作。
用户管理
在系统租户下创建或删除用户时,需要以
'用户名称@租户名称'的方式对用户进行操作。开启单机多租户模式下,用户名称的长度被限制为不超过20个字符,并仅可包含大写字母、小写字母、数字和下划线(_)。
租户内不可以创建以下用户:
replicator
root
mysql.infoschema
mysql.session
mysql.sys
aurora
aliyun_root
租户下的用户不能拥有
__recycle_bin__、mysql、performance_schema和sys库权限。
在系统租户下进行用户管理
创建用户
连接数据库,并通过CREATE语句来创建用户。示例如下:
CREATE user 'user_1@tenant_1';删除用户
连接数据库,并通过DROP语句来删除用户。示例如下:
DROP user 'user_1@tenant_1';用户授权管理
对用户授予租户下的权限。
使用高权限账号连接数据库,对用户授予租户下的权限。如为用户
user1@tenant_1授予租户tenant_1下的权限的SQL语句如下:GRANT all privileges ON `%@tenant_1`.* to 'user_1@tenant_1'@'%' with grant option;说明为用户授予当前租户下的权限时,不能超出当前租户的权限,也不能授予其他租户的权限。
授予CREATE USER权限。
使用高权限账号连接数据库,对用户授予CREATE USER权限。示例如下:
GRANT CREATE user ON *.* to 'user_1@tenant_1'@'%';查看当前用户拥有的权限。示例如下:
SHOW grants for 'user_1@tenant_1';
在普通租户下进行用户管理
创建用户
通过租户下的用户连接数据库,并在其他租户下创建用户。示例如下:
CREATE user user_2;删除用户
通过租户下的用户连接数据库,并在其他租户下删除用户。示例如下:
DROP user user_2;用户授权管理
通过租户下的用户连接数据库,并为数据库
db1授权。示例如下:GRANT SELECT ON db1.* to 'user_2'@'%';在租户模式下,将租户内的全局权限授予某个用户。示例如下:
GRANT SELECT ON *.* to user在租户模式下,为某个数据库授权。示例如下:
GRANT SELECT ON db.* to user
多租户模式下,暂不支持将数据库授权和全局授权混合使用,若混合使用,可能无法正确鉴别权限。建议仅使用全局授权或仅使用数据库级别的授权。
数据库管理
在系统租户下创建或删除数据库时,需要以
'数据库名称@租户名称'的方式对数据库进行操作。开启单机多租户模式下,数据库名称的长度被限制为不超过50个字符,并且仅可包含大写字母、小写字母、数字和下划线(_)。
租户内不可以创建以下数据库:
information_schema
performance_schema
mysql
sys
__recycle_bin__
query_rewrite
若在租户下创建
dbms_ccl、dbms_outln和dbms_consensus等库,租户下的用户将无法调用数据库中的内置存储过程。此时,您可以使用CALL dbms_admin.show_native_procedure();来查看数据库中所有的内置存储过程。若在租户下创建的数据库名称与内置存储过程中的
schema_name相同,将无法调用该数据库下的内置存储过程。
在系统租户下管理数据库
创建数据库
连接数据库,在系统租户下创建数据库。示例如下:
CREATE database 'db1@tenant_1';删除数据库
连接数据库,在系统租户下删除数据库。示例如下:
DROP database 'db1@tenant_1';在普通租户下管理数据库
创建数据库
连接数据库,在普通租户下创建数据库。示例如下:
CREATE database db2;删除数据库
连接数据库,在系统租户下删除数据库。示例如下:
DROP database db2;通过租户下的用户连接数据库
通过客户端来连接数据库时,需要将用户指定为用户名称@租户名称的形式。示例如下:
mysql --host=xxxxxx -u user1@tenant_1 -p pwssword连接成功后,该用户将受到对应租户下的资源限制。
查看租户绑定关系
使用高权限账号连接数据库,并通过以下SQL语句来查看线程组与租户的绑定关系:
SELECT * FROM information_schema.thread_pool_status;在开启租户资源隔离模式下,查询结果中会显示此线程组所绑定的独占型租户。若查询结果中的租户信息为空,则表示线程组被多个租户共享。
查看审计日志
在租户模式下进行的操作,审计日志中将会展示其使用的物理数据库和物理用户等信息。
例如,在租户t2下,用户u1在db3数据库内执行的SQL语句被记录在审计日志中,数据库列将显示为db3@t2,用户列将显示为u1@t2。





