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

当使用 PolarDB 提供的多租户模式后,不再需要按照库去划分租户,而是可以直接创建租户。在租户下可以创建多个库表,无需担心库名重复问题,同时以某个租户下的user进行登录后,无需为多个租户进行业务代码上的适配。
-
当业务上有多个租户时,可以在PolarDB MySQL实例中创建对应的多个租户。
-
创建租户完成后,各租户间的数据完全隔离,互不可见其他租户数据。以租户下user进行登录后,无需根据租户来对业务代码进行适配,即使不同租户间有同名库,也可以直接对库表进行操作,仅会影响当前租户下的库表。
a. 以下文中“租户间数据隔离测试”为例,不同租户间执行相同的查询sql,将会返回当前租户下的数据。
-
可以为不同租户绑定不同的资源配置,来防止某一个租户流量突增导致影响其他租户。
a. 以下文中“租户间资源隔离对比测试”为例,可以为某个重要的租户A设置独占的CPU资源,来防止其他租户流量增长影响租户A
b. 也可以分别限制不同租户的最高CPU资源,来防止实例CPU资源消耗过多的情况。

资源配置创建
目前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,最终返回自己租户下的数据,且在此过程中,租户间的数据是互不可见的。





