暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PolarDB 单实例多租户模式介绍(二)

ZzzMickey 2024-06-26
128

使用方式

SaaS 场景实践

以某客户典型的SaaS场景为例,该客户使用典型的SaaS部署模式,按库分租户,一个租户对应一个库,一个库中含有多个表。所有租户共同使用同一个实例的资源。
image.png

当使用 PolarDB 提供的多租户模式后,不再需要按照库去划分租户,而是可以直接创建租户。在租户下可以创建多个库表,无需担心库名重复问题,同时以某个租户下的user进行登录后,无需为多个租户进行业务代码上的适配。

  1. 当业务上有多个租户时,可以在PolarDB MySQL实例中创建对应的多个租户。

  2. 创建租户完成后,各租户间的数据完全隔离,互不可见其他租户数据。以租户下user进行登录后,无需根据租户来对业务代码进行适配,即使不同租户间有同名库,也可以直接对库表进行操作,仅会影响当前租户下的库表。

    a. 以下文中“租户间数据隔离测试”为例,不同租户间执行相同的查询sql,将会返回当前租户下的数据。

  3. 可以为不同租户绑定不同的资源配置,来防止某一个租户流量突增导致影响其他租户。

    a. 以下文中“租户间资源隔离对比测试”为例,可以为某个重要的租户A设置独占的CPU资源,来防止其他租户流量增长影响租户A

    b. 也可以分别限制不同租户的最高CPU资源,来防止实例CPU资源消耗过多的情况。

image.png

资源配置创建

目前PolarDB MySQL 单机多租户资源隔离仅支持CPU资源隔离。在创建资源配置(resource_config)时指定此资源配置所对应的CPU资源限制,即min_cpu、max_cpu,当某一租户绑定此资源限制时便可限制此租户下user连接所使用的CPU资源。 通过create resource_config 语句来创建资源配置。

// 资源配置创建 create resource_config r1 min_cpu 0 max_cpu 1; create resource_config r2 min_cpu 1 max_cpu 4; // 查看资源配置 select * from mysql.tenant_resource_config;

租户创建

通过create tenant 语句来创建租户,创建租户时将与指定的resource config进行绑定。

// 创建租户 && 绑定资源限制 create tenant tenant_1 resource_config r2; //查询租户 select * from mysql.tenants;

租户下创建 user & DB

系统租户下创建某一租户下的user

# 系统租户下删除user create user 'user_1@tenant_1'; # 高权限账户下,为user1@tenant_1 授予 租户tenant_1下的权限 grant all privileges on `%@tenant_1`.* to 'user_1@tenant_1'@'%' with grant option;

租户下user 进行连接,连接后将会受到租户所对应resource_config的限制

mysql --host=xxxxxx -u user1@tenant_1 -p pwssword

租户下user进行连接后,即可进行创建DB等其他操作

# 创建租户下user create user user2; # 创建租户下DB create database db2; use db2; create table t(a int); insert into t values(100); select * from t; drop table t; drop database db2;

单实例多租户具体使用手册可参考:
多租户管理使用说明

场景测试

测试环境

  • 测试的ECS和PolarDB MySQL版均在同一地域、同一可用区。
  • 网络类型均为VPC网络
    • ECS实例和PolarDB MySQL版需保证在同一个VPC中。
  • 测试用的PolarDB MySQL版如下:
    • PolarDB MySQL版本: 集群版 PolarDB802
    • 节点规格为polar.mysql.x4.xlarge (8C 32G) (8核32 GB独享规格)
    • 两节点集群(一主一只读)
    • 使用的连接串为集群地址
  • 测试用的ECS实例信息如下:
    • 实例规格为ecs.g7.2xlarge
    • 实例所使用的镜像为Ubuntu 22.04 64位
      PolarDB 关键参数配置:
thread_pool_enable = ON thread_pool_size = 8 // 与PolarDB实例核心数一致 thread_pool_multi_tenant_enabled = ON enable_multi_tenant = ON

租户间数据隔离测试

此次测试中,我们在同一实例中创建不同租户,并在不同租户间创建相同name的user、相同name的DB,在DB中创建不同结构的table,执行测试,比较两个租户下show database 以及查询table 展示出的结果。

创建租户 & user #创建resource_config create resource_config r1 min_cpu 0 max_cpu 1; #创建两个不同租户 create tenant tenant_1 resource_config r1; create tenant tenant_2 resource_config r1; #在不同租户下分别创建相同name user create user 'user_1@tenant_1' IDENTIFIED BY 'xxxx'; create user 'user_1@tenant_2' IDENTIFIED BY 'xxxx'; #为user进行授权 grant all privileges on `%@tenant_1`.* to 'user_1@tenant_1'@'%' with grant option; grant all privileges on `%@tenant_2`.* to 'user_1@tenant_2'@'%' with grant option;

创建 DB

# tenant_1 下 user_1 进行创建DB & table create database dbtest; use dbtest create table t(a int); insert into t values(1); create database db_of_tenant_1; use db_of_tenant_1 create table table_of_db_tenant_1(id int); # tenant_2 下user_1 进行创建DB & table create database dbtest; use dbtest create table t(a int); insert into t values(2); create database db_of_tenant_2; use db_of_tenant_2 create table table_of_db_tenant_2(id int);

最终在 tenant_1 与 tenant_2 下查询的结果分别如下图所示,可以看出在不同租户下执行相同sql,sql将会被重定向至不同租户中的DB,最终返回自己租户下的数据,且在此过程中,租户间的数据是互不可见的。

image.png

文章转载自ZzzMickey,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论