多租户管理

PolarDB MySQL提供了多租户模式,允许多个租户在同一集群下共享计算资源和存储资源,同时保证各租户之间的数据隔离和资源隔离。各租户仅能访问其自身的数据,不会出现资源争抢现象,从而保证业务的稳定运行。

技术原理

image
说明

DB_1user_1虽然在系统租户、普通租户A及普通租户B中均存在,但它们是不同的数据库和用户,仅名称相同。

术语

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

  • 系统租户系统租户是为适应原有模式下的用户而设立的。在数据库集群中,原有的数据库和用户默认归属于系统租户。当通过系统租户下的用户连接数据库时,若该用户具备相应的数据库访问权限,则可以访问所有租户下的数据库。

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

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

    • 共享型租户min_cpu=0。

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

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

使用前提

若要开启多租户模式,您的集群需满足如下条件:

数据库引擎MySQL 8.0.2及以上,产品版本企业版系列集群版,且集群的节点规格保持一致

说明

多租户模式目前处于灰度发布阶段。如有需求,请通过钉钉群联系相关工作人员来开启该功能。功能开启后,您需要重启目标集群才能生效。

钉钉群号为:59535005981。

注意事项

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

  • 暂不支持对用户部分撤销权限(Partial Revoke)。

快速体验

  1. 开启单机多租户模式。

    说明

    多租户模式目前处于灰度发布阶段。如有需求,请通过钉钉群联系相关工作人员来开启该功能。功能开启后,您需要重启目标集群才能生效。

    钉钉群号为:59535005981。

  2. 使用高权限账号连接数据库。

  3. 创建资源配置r1r2

    CREATE resource_config r1 min_cpu 1 max_cpu 2;
    CREATE resource_config r2 min_cpu 1 max_cpu 4;
    说明
    • 请根据您集群的节点规格来填写min_cpumax_cpu。

    • 任意一个租户的min_cpu不超过当前集群节点规格的核数-1,需要为系统租户预留至少1CPU。否则,在创建租户时,租户与资源配置会绑定失败。

  4. 创建租户tn1tn2。创建租户时需绑定上述创建的资源配置。

    CREATE tenant tn1 resource_config r1;
    CREATE tenant tn2 resource_config r2;
    说明

    需要保证所有租户的资源配置中min_cpu之和不能超过当前集群节点规格中的核数-1

  5. 创建用户u1u2,数据库db1db2

    -- 在租户 tn1 下创建用户 u1
    CREATE USER 'u1@tn1' IDENTIFIED BY 'password';
    
    -- 在租户 tn1 下创建数据库 db1
    CREATE DATABASE `db1@tn1`;
    
    -- 在租户 tn2 下创建用户 u2
    CREATE USER 'u2@tn2' IDENTIFIED BY 'password';
    
    -- 在租户 tn2 下创建数据库 db2
    CREATE DATABASE `db2@tn2`;
    说明

    使用高权限账号创建用户与数据库时,需在用户名或数据库名后添加@租户名称后缀进行操作。

  6. 对用户u1u2授权。

    -- 给用户 u1 授予租户 tn1 的权限。
    GRANT ALL PRIVILEGES ON `%@tn1`.* TO 'u1@tn1'@'%' WITH GRANT OPTION;
    
    -- 给用户 u2 授予租户 tn2 的权限。
    GRANT ALL PRIVILEGES ON `%@tn2`.* TO 'u1@tn2'@'%' WITH GRANT OPTION;
  7. 现在,您可以使用用户u1@tn1u2@tn2来验证不同租户之间的数据和资源隔离效果。如何进行负载测试,请参见步骤四:进行资源隔离测试

  8. (可选)查看上述所创建的租户、用户及数据库。

    • 租户:使用高权限账号连接数据库,并通过SELECT语句来查看租户。示例如下:

      SELECT * FROM mysql.tenants;
    • 用户:您可以前往PolarDB控制台配置与管理 > 账户管理页面查看。

      • 账户名不带@租户名称后缀的为系统租户下的用户。

      • 账户名@租户名称后缀的为对应租户下的用户。

    • 数据库:您可以前往PolarDB控制台配置与管理 > 数据库管理页面查看。

      • 数据库名不带@租户名称后缀的为系统租户下的数据库。

      • 数据库名@租户名称后缀的为对应租户下的数据库。

功能详解

开启单机多租户模式

说明

多租户模式目前处于灰度发布阶段。如有需求,请通过钉钉群联系相关工作人员来开启该功能。功能开启后,您需要重启目标集群才能生效。

钉钉群号为:59535005981。

开启数据隔离功能

开启数据隔离功能,需要将参数enable_multi_tenant的值设置为ON

开启资源隔离功能

开启资源隔离功能,需先开启数据隔离功能。需要将参数enable_multi_tenantthread_pool_multi_tenant_enabled以及thread_pool_enabled的值均设置为ON,且需要保证参数thread_pool_size的值与目标集群的节点规格的核数保持一致。

  • 查看节点规格

    您可以在目标集群的基本信息页面的数据库节点区域查看集群的节点规格。如下图:

    image

  • 设置参数

    • enable_multi_tenantthread_pool_multi_tenant_enabled请联系相关工作人员来开启。

    • thread_pool_enabledthread_pool_size您可以前往PolarDB控制台配置与管理 > 参数配置页面来修改参数。更多信息,请参见设置集群参数和节点参数

资源管理

PolarDB MySQL单机多租户模式下的资源隔离仅支持CPU资源隔离。在创建资源配置时,指定此资源配置所对应的CPU资源限制条件min_cpumax_cpu。当某一租户绑定此资源限制条件时便可限制此租户下用户连接使用的CPU资源。

创建资源配置

使用高权限账号连接数据库,并通过CREATE语句来创建资源配置。

语法

CREATE resource_config <resource_config_name> min_cpu <min_cpu> max_cpu <min_cpu>;

示例

CREATE resource_config r1 min_cpu 0 max_cpu 1;
CREATE resource_config r2 min_cpu 1 max_cpu 4;
说明
  • 请根据您集群的节点规格来填写min_cpumax_cpu。

  • 创建资源配置时,将不会检测资源配置信息与集群节点规格的关系,仅当租户绑定资源限制条件时才会进行检测。

  • 任意一个租户的min_cpu不超过当前集群节点规格的核数-1,需要为系统租户预留至少1CPU。否则,在创建租户时,租户与资源配置会绑定失败。

  • 系统租户下的用户可使用的资源为CPU资源总和减去所有独占型租户占用的CPU资源

查看资源配置

使用高权限账号连接数据库,并通过SELECT语句来查看资源配置。

示例

SELECT * FROM mysql.tenant_resource_config;
+----------------------+-------------------------+-------------------------+
| resource_config_name | resource_config_min_cpu | resource_config_max_cpu |
+----------------------+-------------------------+-------------------------+
| r1                   |                       0 |                       1 |
| r2                   |                       1 |                       4 |
+----------------------+-------------------------+-------------------------+

修改资源配置

使用高权限账号连接数据库,并通过ALTER语句来修改资源配置。

语法

ALTER resource_config <resource_config_name> min_cpu <min_cpu> max_cpu <min_cpu>;

示例

ALTER resource_config r2 min_cpu 1 max_cpu 2;
说明
  • 若有租户正在使用该资源配置,则无法进行更新操作。

  • 请根据您集群的节点规格来填写min_cpumax_cpu。

  • 创建资源配置时,将不会检测资源配置信息与集群节点规格的关系,仅当租户绑定资源限制条件时才会进行检测。

  • 任意一个租户的min_cpu不超过当前集群节点规格的核数-1,需要为系统租户预留至少1CPU。否则,在创建租户时,租户与资源配置会绑定失败。

  • 系统租户下的用户可使用的资源为CPU资源总和减去所有独占型租户占用的CPU资源

删除资源配置

使用高权限账号连接数据库,并通过DROP语句来删除资源配置。

语法

DROP resource_config <resource_config_name>;

示例

DROP resource_config r1;
说明

若有租户正在使用该资源配置,则无法进行删除操作。

租户管理

租户分为系统租户和普通租户。系统租户是为适应原有模式下的用户所设立的,不涉及管理操作。此处所管理的对象为普通租户。

创建租户

使用高权限账号连接数据库,并通过CREATE语句来创建新租户。

语法

CREATE tenant <tenant_name> resource_config <resource_config_name>;

示例

CREATE tenant tn1 resource_config r1;
说明
  • 租户名称的长度不能超过10个字符,并且支持包含大写字母、小写字母、数字或下划线(_)。

  • 需要保证所有租户的资源配置中min_cpu之和不能超过当前集群节点规格中的核数-1

查看租户

使用高权限账号连接数据库,并通过SELECT语句来查看租户。

示例

SELECT * FROM mysql.tenants;
+-------------+----------------------+
| tenant_name | resource_config_name |
+-------------+----------------------+
| tn1         | r1                   |
+-------------+----------------------+

修改租户

使用高权限账号连接数据库,并通过ALTER语句来修改租户。

语法

ALTER tenant <tenant_name> resource_config <resource_config_name>;

示例

ALTER tenant tn1 resource_config r2;
说明
  • 租户名称的长度不能超过10个字符,并且支持包含大写字母、小写字母、数字或下划线(_)。

  • 需要保证所有租户的资源配置中min_cpu之和不能超过当前集群节点规格中的核数-1

删除租户

使用高权限账号连接数据库,并通过DROP语句来删除租户。

语法

DROP tenant <tenant_name>;

示例

DROP tenant tn1;
说明
  • 删除租户时,需要保证对应租户下的数据库已经被删除。否则,将无法删除对应租户。

  • 删除租户时,会默认将对应租户下的所有用户删除,请谨慎操作。

用户管理

用户分为系统租户下的用户和普通租户下的用户。系统租户下的用户为原有模式下的用户,具体管理方式请参见账号管理此处所管理的对象为普通租户下的用户。

您可以在系统租户下或普通租户下进行相应的管理操作。

说明
  • 在系统租户下创建或删除用户时,需要以'用户名称@租户名称'的方式对用户进行操作。

  • 开启单机多租户模式下,用户名称的长度被限制为不超过20个字符,并仅可包含大写字母、小写字母、数字和下划线(_)。

  • 租户内不可以创建以下用户:

    • replicator

    • root

    • mysql.infoschema

    • mysql.session

    • mysql.sys

    • aurora

    • aliyun_root

  • 租户下的用户不能拥有__recycle_bin__mysqlperformance_schemasys库权限。

系统租户

在系统租户下,使用高权限账号创建和删除某普通租户下的用户。

创建用户

使用高权限账号连接数据库,并通过CREATE语句来创建普通租户下的用户。

语法

CREATE USER <user_name>@<tenant_name> [IDENTIFIED BY <password>];

示例

-- 不带密码
CREATE USER 'u1@tn1';
-- 带密码
CREATE USER 'u1@tn1' IDENTIFIED BY 'password';

删除用户

使用高权限账号连接数据库,并通过DROP语句来删除普通租户下的用户。

语法

DROP USER <user_name>@<tenant_name>;

示例

DROP USER 'u1@tn1';

用户授权

使用高权限账号连接数据库,对普通租户下的用户进行授权。

  • 授予租户下的权限。授权完成后,该用户即可拥有当前租户下所有数据库的访问权限了。

    示例:为用户u1授予租户tn1下的权限。

    GRANT ALL PRIVILEGES ON `%@tn1`.* to 'u1@tn1'@'%' WITH GRANT OPTION;
  • 授予CREATE USER权限。授权完成后,该用户即可在当前租户下创建其他用户了。

    示例:为用户u1授予CREATE USER权限。

    GRANT CREATE USER ON *.* TO 'u1@tn1'@'%';
  • 查看用户拥有的权限。

    示例:查看用户u1拥有的权限。

    SHOW GRANTS FOR 'u1@tn1';
    +---------------------------------------------------------------------+
    | Grants for u1@tn1@%                                                 |
    +---------------------------------------------------------------------+
    | GRANT CREATE USER ON *.* TO `u1@tn1`@`%`                            |
    | GRANT ALL PRIVILEGES ON `%@tn1`.* TO `u1@tn1`@`%` WITH GRANT OPTION |
    +---------------------------------------------------------------------+

普通租户

在普通租户下,使用租户下的用户创建和删除当前租户下的用户。操作前,请确认您登录的用户具有CREATE USER权限。如何授权,请参见用户管理 > 系统租户 > 用户授权

创建用户

使用租户下的用户连接数据库,并通过CREATE语句来创建当前租户的用户。如何创建租户下的用户,请参见用户管理 > 系统租户 > 创建用户

语法

CREATE USER <user_name> [IDENTIFIED BY <password>];

示例

-- 不带密码
CREATE USER 'u2';
-- 带密码
CREATE USER 'u2' IDENTIFIED BY 'password';

删除用户

使用租户下的用户连接数据库,并通过DROP语句来删除当前租户下的用户。

语法

DROP USER <user_name>;

示例

DROP USER 'u2';

用户授权

使用租户下的用户连接数据库,对当前租户下的用户进行授权。

  • 对当前租户下的用户进行全局授权。

    语法

    GRANT SELECT ON *.* TO <user_name>

    示例

    GRANT SELECT ON *.* TO 'u2';
  • 对当前租户下的用户进行数据库授权。

    语法

    GRANT SELECT ON <database_name>.* TO <user_name>

    示例

    GRANT SELECT ON db.* TO 'u2';
说明
  • 多租户模式下,暂不支持将数据库授权和全局授权混合使用,若混合使用,可能无法正确鉴别权限。建议仅使用全局授权或仅使用数据库级别的授权。

  • 查看用户拥有的权限,请参见系统租户 > 用户授权

连接数据库

通过客户端来连接数据库时,需要将用户指定为用户名称@租户名称的形式。连接成功后,该用户将受到对应租户下的资源限制。

语法

mysql -h <host> -P <port> -u <user_name>@<tenant_name> -p

示例

mysql -h pc... -P 3306 -u u1@tn1 -p
Enter password: 

数据库管理

数据库分为系统租户下的数据库和普通租户下的数据库。系统租户下的数据库为原有模式下的数据库,具体管理方式请参见数据库管理此处所管理的对象为普通租户下的数据库。

您可以在系统租户下或普通租户下进行相应的管理操作。

说明
  • 在系统租户下创建或删除数据库时,需要以'数据库名称@租户名称'的方式对数据库进行操作。

  • 开启单机多租户模式下,数据库名称的长度被限制为不超过50个字符,并且仅可包含大写字母、小写字母、数字和下划线(_)。

  • 租户内不可以创建以下数据库:

    • information_schema

    • performance_schema

    • mysql

    • sys

    • __recycle_bin__

    • query_rewrite

  • 若在租户下创建dbms_ccldbms_outlndbms_consensus等库,租户下的用户将无法调用数据库中的内置存储过程。此时,您可以使用CALL dbms_admin.show_native_procedure();来查看数据库中所有的内置存储过程。

  • 若在租户下创建的数据库名称与内置存储过程中的schema_name相同,将无法调用该数据库下的内置存储过程。

系统租户

在系统租户下,使用高权限账号创建和删除某普通租户下的数据库。

创建数据库

使用高权限账号连接数据库,并通过CREATE语句来创建普通租户下的数据库。

语法

CREATE DATABASE <database_name>@<tenant_name>;

示例

CREATE DATABASE `db1@tn1`;

删除数据库

使用高权限账号连接数据库,并通过DROP语句来删除普通租户下的数据库。

语法

DROP DATABASE <database_name>@<tenant_name>;

示例

DROP DATABASE `db1@tn1`;

普通租户

在普通租户下,使用租户下的用户创建和删除当前租户下的数据库。操作前,请确认您登录的用户具有全局权限。如何授权,请参见用户管理 > 系统租户 > 用户授权

创建数据库

使用租户下的用户连接数据库,并通过CREATE语句来创建当前租户的数据库。如何创建租户下的用户,请参见用户管理 > 系统租户 > 创建用户

语法

CREATE DATABASE <database_name>;

示例

CREATE DATABASE `db2`;

删除数据库

使用租户下的用户连接数据库,并通过DROP语句来删除当前租户下的数据库。

语法

DROP DATABASE <database_name>;

示例

DROP DATABASE `db2`;

查看线程组与租户绑定关系

  1. 使用高权限账号连接数据库,并通过以下SQL语句来查看线程组与租户的绑定关系:

    SELECT * FROM information_schema.thread_pool_status;
  2. 返回示例如下所示:

    在开启多租户资源隔离模式下,查询结果中会显示此线程组所绑定的独占型租户。若查询结果中的租户信息为空,则表示线程组被多个租户共享。

    TENANT_NAME:线程池中当前线程组所绑定的独占型租户名。

    +----+--------------+---------------------+----------------------+-------------------+----------------+-------------+
    | ID | THREAD_COUNT | ACTIVE_THREAD_COUNT | WAITING_THREAD_COUNT | DUMP_THREAD_COUNT |      ...       | TENANT_NAME |
    +----+--------------+---------------------+----------------------+-------------------+----------------+-------------+
    |  0 |            2 |                   0 |                    0 |                 0 |      ...       |             |
    |  1 |            2 |                   1 |                    0 |                 0 |      ...       | tn1         |
    |  2 |            4 |                   0 |                    0 |                 1 |      ...       |             |
    |  3 |            2 |                   0 |                    0 |                 0 |      ...       |             |
    |  4 |            3 |                   0 |                    0 |                 1 |      ...       |             |
    +----+--------------+---------------------+----------------------+-------------------+----------------+-------------+

查看审计日志

在多租户模式下进行的操作,审计日志中将会展示其使用的物理数据库和物理用户等信息。

例如,在租户t2下,用户u1db3数据库内执行的SQL语句被记录在审计日志中,数据库列将显示为db3@t2用户列将显示为u1@t2

image