多租户管理使用说明

本文介绍了PolarDB MySQL版提供的租户管理简介以及使用说明等内容。

简介

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

image

术语

租户:租户(Tenant)为实现多租户模式所提出的概念,租户的层级结构在一个数据库实例之下,在数据库与用户之上。租户分为系统租户和普通租户:

  • 系统租户:系统租户是为了适配原有模式下用户的使用,原有数据库实例中的用户默认属于系统租户,也可以称为系统用户。当通过系统租户下的用户连接数据库时,若该用户拥有对应的数据库实例访问权限,即可访问所有租户下的数据库实例。

  • 普通租户:普通租户需要在系统租户下进行创建,普通租户下的数据库实例与用户完全隔离,无法互相访问,并且普通租户无法访问系统租户下的数据库实例。在进行CPU资源调度时,普通租户根据min_cpu是否大于0将普通租户分为独占型租户和共享型租户。

    • 独占型租户:min_cpu>0,需要保证任何时刻的CPU资源不小于min_cpu。

    • 共享型租户:min_cpu=0。

    独占型租户和共享型租户可以通过调整min_cpu的值进行相互转换。

资源配置:资源配置(resource_config)是为了实现多租户资源隔离与资源调度所提出的概念,一个资源配置描述了一个租户下能够使用的资源。当前PolarDB MySQL版仅支持对CPU资源进行隔离以及调度。

使用前提

PolarDB MySQL版集群的产品版本企业版,集群的内核版本需为8.0.2及以上,且集群的节点规格需要保持一致。

说明

租户管理与资源隔离功能目前处于灰度发布阶段,如有需求,您可以添加钉钉群联系工作人员来开启该功能。功能开启后,您需要重启目标集群才能生效。钉钉群号:59535005981。

注意事项

  • 暂不支持租户下的Binlog信息同步。

  • 暂不支持对用户部分权限进行撤销。

使用说明

开启单机多租户模式

开启数据隔离功能

开启数据隔离功能,需要将参数enable_multi_tenant的值设置为ON,且目标集群中的数据库名或用户名中不包含参数multi_tenant_separator的值。

开启资源隔离功能

若需要同时开启数据隔离功能和资源隔离功能,则需要将参数thread_pool_enabledenable_multi_tenant以及thread_pool_multi_tenant_enabled的值均设置为ON,且需要保证参数thread_pool_size的值与目标集群的节点规格的核数保持一致。您可以在目标集群的基本信息页面的数据库节点区域查看集群的节点规格。如下图:

image

说明

若有单机多租户需求,您可以添加钉钉群来联系工作人员开启数据隔离功能或同时开启数据隔离和资源隔离功能。钉钉群号:59535005981。功能开启后,您需要重启目标集群才能生效。

资源管理

PolarDB MySQL版单机多租户模式下的资源隔离仅支持CPU资源隔离,在创建资源配置时,指定此资源配置所对应的CPU资源限制条件min_cpumax_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__mysqlperformance_schemasys库权限。

在系统租户下进行用户管理

创建用户

连接数据库,并通过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_ccldbms_outlndbms_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下,用户u1db3数据库内执行的SQL语句被记录在审计日志中,数据库列将显示为db3@t2,用户列将显示为u1@t2

image