本文介紹了多租戶資源隔離示例,您可以按照本文的內容自行測試,以快速了解和使用多租戶資源隔離功能。
測試環境
使用的ECS實例和PolarDB MySQL版集群均位于同一地域和同一可用區。
網絡類型均為VPC網絡。
說明ECS實例和PolarDB MySQL版集群需保證在同一個VPC中。
使用的PolarDB MySQL版集群信息如下:
版本為PolarDB MySQL版8.0.2版本。
產品系列為集群版。
節點規格為polar.mysql.x4.xlarge(8核32 GB獨享規格)
節點數量為2(一個主節點和一個只讀節點)。
使用的連接串為集群地址。查看PolarDB MySQL版集群地址的具體步驟請參見查看連接地址和端口。
關鍵信息配置如下:
thread_pool_enable = ON thread_pool_size = 8 // 與PolarDB MySQL版集群規格中的核數保持一致 thread_pool_multi_tenant_enabled = ON enable_multi_tenant = ON
使用的ECS實例信息如下:
實例規格為ecs.g7.2xlarge。
實例使用的鏡像為Ubuntu 22.04 64位。
測試流程
步驟一:創建資源配置信息
使用高權限賬號連接數據庫,并創建多種資源配置信息,用于對租戶資源進行限制。
CREATE resource_config r1 min_cpu 0 max_cpu 1;
CREATE resource_config r2 min_cpu 0 max_cpu 2;
CREATE resource_config r3 min_cpu 0 max_cpu 4;
CREATE resource_config r4 min_cpu 0 max_cpu 8;
CREATE resource_config r5 min_cpu 1 max_cpu 2;
CREATE resource_config r6 min_cpu 2 max_cpu 4;
CREATE resource_config r7 min_cpu 4 max_cpu 8;
CREATE resource_config r8 min_cpu 6 max_cpu 8;
CREATE resource_config r9 min_cpu 7 max_cpu 8;
資源配置信息創建完成后,您可以通過查詢mysql.tenant_resource_config
表來查看當前所有的配置資源。
SELECT * FROM mysql.tenant_resource_config;
步驟二:創建租戶
使用高權限賬號連接數據庫,分別創建tenant_1
和tenant_2
兩個租戶,且在創建租戶時與指定的資源配置信息綁定。
# 創建租戶 tenant_1
CREATE tenant tenant_1 resource_config r1;
# 創建租戶 tenant_2
CREATE tenant tenant_2 resource_config r5;
創建租戶
tenant_1
時,將此租戶與資源配置r1
綁定。此租戶CPU資源限制min_cpu
為0,在后臺資源調度時,將不保證此租戶下使用CPU的最小限額。限制此租戶使用CPU的最大額度為1 CPU。min_cpu=0
的租戶稱之為共享租戶。創建租戶
tenant_2
時,將此租戶與資源配置r5
綁定,此租戶CPU資源限制min_cpu
為1,在后臺資源調度時,將保證此租戶下使用CPU的最小限額為1 CPU,min_cpu >0
的租戶為獨享租戶。
租戶創建完成后,您可以通過查詢mysql.tenants
表來查看當前的所有租戶。
SELECT * FROM mysql.tenants;
在調度CPU資源時,通過調度分配給租戶的線程組進行實現,您可以通過查詢information_schema.thread_pool_status
表來查看租戶使用的線程組情況。
SELECT * FROM information_schema.thread_pool_status;
執行結果如下:
從上圖可以看出,ID為2的線程組被分配給tenant_2
,tenant_2
為獨享租戶,將會獨占ID為2的線程組。而tenant_1
為共享租戶,故不會獨占任何一個線程組。
步驟三:創建用戶和數據庫
租戶創建成功后,分別在兩個租戶下創建用戶和數據庫。
在租戶tenant_1
下創建用戶user_1
,并授予user_1
在tenant_1
租戶下的所有執行權限。此處可以將user_1@tenant_1
當做租戶tenant_1
下的一個高權限賬號。
#在系統租戶下創建'user_1@tenant_1'
CREATE user 'user_1@tenant_1' IDENTIFIED WITH mysql_native_password BY {pwssword};
#在高權限賬戶下,為user1@tenant_1授予租戶tenant_1下的所有執行權限
#(需注意不要超出當前租戶權限,不要授予其他租戶的權限)
GRANT all privileges ON `%@tenant_1`.* to 'user_1@tenant_1'@'%' with grant option;
#在高權限賬戶下,為user1@tenant_1授予CREATE USER權限
GRANT CREATE user ON *.* to 'user_1@tenant_1'@'%';
用戶創建成功后,通過該用戶連接數據庫的SQL語句如下:
mysql --host=xxxxxx -u user1@tenant_1 -p pwssword
使用該賬號登錄數據庫成功后,您僅可查看當前租戶下的數據庫。對于系統租戶下的數據庫以及其他租戶下的數據庫該賬號均不可見。
繼續在當前連接中創建用戶user_2
以及數據庫sbtest
。
# 創建user_2
CREATE user 'user_2' IDENTIFIED WITH mysql_native_password BY {pwssword};
# 授予user_2權限
GRANT CREATE,INSERT,SELECT,UPDATE,DELETE,DROP,index ON *.* to user_2;
# 創建sbtest
CREATE database sbtest;
在租戶tenant_1
下創建用戶以及數據庫后,您可以通過相同的方式在tenant_2
下創建用戶和數據庫。
步驟四:進行資源隔離測試
Sysbench數據準備
sysbench oltp_read_only --threads=512 --mysql-host=xxxx --mysql-user=user_2@tenant_1 --mysql-password={password} --mysql-db=sbtest --tables=10 --table-size=50000 --report-interval=1 --time=7200 prepare
執行Sysbench測試
sysbench oltp_read_only --threads=512 --mysql-host=xxxx --mysql-user=user_2@tenant_1 --mysql-password={password} --mysql-db=sbtest --tables=10 --table-size=50000 --report-interval=1 --time=7200 run
在執行Sysbench測試期間,您需要使用高權限賬號user_1
按照資源配置順序切換tenant_1
所對應的資源配置信息。調整資源配置信息的ALTER語法如下:
ALTER tenant tenant_1 resource_config r7;
資源配置切換測試一
該測試將使用租戶tenant_1
下的user_2
來進行Sysbench測試,通過切換tenant_1
綁定的資源配置信息來觀察集群使用的CPU資源變化情況。此時tenant_2
的資源配置信息為r5
。tenant_1
綁定的資源配置信息切換順序為r1->r4->r5->r6->r7->r3->r2->r1。
測試結果
讀寫(RW)節點的測試數據如下:
CPU/內存利用率
TPS/QPS
只讀(RO)節點的測試數據如下:
CPU/內存利用率
TPS/QPS
在該測試中,因為tenant_2
的資源配置信息為r5
,在對tenant_1
執行測試時,所能達到的最高CPU為7,CPU占比約為CPU總量的87%。根據tenant_1
所綁定資源配置的變化,讀寫節點和只讀節點的CPU使用率與QPS均發生相應的變化。
資源配置切換測試二
該測試將tenant_2
的resource_config
修改為r7
,后續的測試過程中不再修改tenant_2
的資源信息。僅調整tenant_1
綁定的資源配置信息,資源配置信息的切換順序為r1->r4->r5->r6->r3->r2->r1。
測試結果
讀寫(RW)節點的測試數據如下:
CPU/內存利用率
TPS/QPS
只讀(RO)節點的測試數據如下:
CPU/內存利用率
TPS/QPS
在該測試中,由于租戶tenant_2
的resource_config
配置為r7
,在對租戶tenant_1
執行測試時,所能達到的最高CPU為4,CPU占比約為CPU總量的50%。根據tenant_1
綁定的資源配置信息變化,讀寫節點和只讀節點的CPU使用率與QPS均發生相應的變化。