本文将通过操作示例向您介绍如何使用资源管理。
注意事项
如有资源隔离的需求,可联系工作人员后台开启参数。目前资源隔离仅在PolarDB MySQL版8.0.1企业版或PolarDB MySQL版 8.0.2企业版中支持。
您可以加入官方钉钉群进行咨询,获取更多技术支持。钉钉群号:59535005981。
使用Resource control功能需开启Thread Pool功能。
只读(RO)节点异步从读写(RW)节点同步资源控制信息,因此可能会出现延迟。
测试环境
测试所用ECS实例规格:
ecs.g7.2xlarge(8 vCPU,32 GB内存)。
测试所用PolarDB MySQL版集群配置如下:
产品版本:企业版。
系列:集群版。
子系列:独享规格。
数据库引擎:MySQL 8.0.1。
规格:polar.mysql.x4.xlarge(8 vCPU,32 GB内存)。
测试所用PolarDB MySQL版集群的参数配置如下:
thread_pool_enable
修改为ON
。enable_resource_control
修改为ON
。
说明关于配置集群参数的具体操作,请参见参数配置。
测试准备
创建数据库用户和数据库
执行如下代码,创建2个用户user_1
和user_2
,2个数据库database_1
和database_2
:
CREATE USER user_1 IDENTIFIED WITH mysql_native_password BY 'password';
CREATE USER user_2 IDENTIFIED WITH mysql_native_password BY 'password';
CREATE DATABASE database_1;
CREATE DATABASE database_2;
GRANT ALL ON database_1.* TO user_1;
GRANT ALL ON database_2.* TO user_1;
GRANT ALL ON database_1.* TO user_2;
GRANT ALL ON database_2.* TO user_2;
导入测试数据
执行如下代码,使用Sysbench工具分别为database_1
和database_2
导入测试数据:
sysbench oltp_read_write --threads=16 --mysql-host={host} --mysql-user={user} --mysql-password={pswd} --mysql-port=3306 --mysql-db=database_1 --tables=10 --table-size=500000 --report-interval=1 --time=7200 prepare
sysbench oltp_read_write --threads=16 --mysql-host={host} --mysql-user={user} --mysql-password={pswd} --mysql-port=3306 --mysql-db=database_2 --tables=10 --table-size=500000 --report-interval=1 --time=7200 prepare
关于Sysbench工具的更多信息,请参见使用Sysbench工具进行测试。
创建资源管理(Resource Control)
执行如下代码,创建多个Resource Control:
CREATE polar_resource_control rc_1 max_cpu 20;
CREATE polar_resource_control rc_2 max_cpu 50;
CREATE polar_resource_control rc_3 max_cpu 70;
CREATE polar_resource_control rc_4 max_cpu 100;
通过如下代码,可以查询已创建的Resource Control信息:
SELECT * FROM mysql.polar_resource_control;
执行测试
以数据库用户维度限制CPU资源
执行如下代码,分别启动2个Sysbench测试,使用
user_1
分别在database_1
和database_2
下进行测试:sysbench oltp_read_only --threads=256 --mysql-host={host} --mysql-user_1 --mysql-password={pswd} --mysql-port=3306 --mysql-db=database_1 --tables=10 --table-size=500000 --report-interval=1 --time=3600 run sysbench oltp_read_only --threads=256 --mysql-host={host} --mysql-user_1 --mysql-password={pswd} --mysql-port=3306 --mysql-db=database_2 --tables=10 --table-size=500000 --report-interval=1 --time=3600 run
执行如下代码,在Sysbench测试过程中依次将
user_1
和rc_1
、rc_2
、rc_3
、rc_4
绑定和解绑:SET polar_resource_control rc_1 FOR USER user_1; RELEASE polar_resource_control rc_1 FOR USER user_1; SET polar_resource_control rc_2 FOR USER user_1; RELEASE polar_resource_control rc_2 FOR USER user_1; SET polar_resource_control rc_3 FOR USER user_1; RELEASE polar_resource_control rc_3 FOR USER user_1; SET polar_resource_control rc_4 FOR USER user_1; RELEASE polar_resource_control rc_4 FOR USER user_1;
下图为Sysbench测试过程中,统计的RW节点和RO节点的CPU使用率和QPS的统计图:
说明如上图所示CPU使用率以及QPS都随着
user_1
绑定的Resource Control的变化而变化(例如rc_1
的CPU最大为20,rc_2
的CPU最大为50)。通过绑定不同CPU资源的Resource Control可以对user_1
所能使用的CPU资源进行有效控制。
以数据库维度限制CPU资源
执行如下代码,启动2个Sysbench测试,分别使用
user_1
与user_2
在database_1
下进行测试:sysbench oltp_read_only --threads=256 --mysql-host={host} --mysql-user_1 --mysql-password={pswd} --mysql-port=3306 --mysql-db=database_1 --tables=10 --table-size=500000 --report-interval=1 --time=3600 run sysbench oltp_read_only --threads=256 --mysql-host={host} --mysql-user_2 --mysql-password={pswd} --mysql-port=3306 --mysql-db=database_1 --tables=10 --table-size=500000 --report-interval=1 --time=3600 run
执行如下代码,在Sysbench测试过程中,依次将
database_1
和rc_1
、rc_2
绑定和解绑:SET polar_resource_control rc_1 FOR DATABASE database_1; RELEASE polar_resource_control rc_1 FOR DATABASE database_1; SET polar_resource_control rc_2 FOR DATABASE database_1; RELEASE polar_resource_control rc_2 FOR DATABASE database_1;
Sysbench测试过程中,统计的RW节点和RO节点的CPU使用率和QPS的统计图:
说明如上图所示CPU使用率以及QPS都随着
database_1
绑定的Resource Control的变化而变化(例如rc_1
的CPU最大为20,rc_2
的CPU最大为50)。通过绑定不同CPU资源的Resource Control可以对database_1
所能使用的CPU资源进行有效控制。
以单条查询维度限制CPU资源
使用Resource Control可以对单条查询进行资源限制,当这个查询执行结束后,限制会自动结束,后续同一个连接(Connection)中的查询不受影响。
执行如下代码,模拟大查询:
CREATE DATABASE rc_test; USE rc_test; CREATE TABLE t1(id INT NOT NULL auto_increment PRIMARY KEY, name VARCHAR(10)); INSERT INTO t1(name) VALUES('aaaaaaaaaa'); INSERT INTO t1(name) SELECT name FROM t1; -- 重复执行20次此SQL -- 在2个客户端分别同时执行,模拟产生2条大查询 SELECT COUNT(*) FROM t1 a JOIN t1 B ON a.name = B.name;
执行如下代码,获取2个大查询的Connection ID:
SHOW processlist;
执行如下代码,创建
rc_5
用来限制大查询:CREATE polar_resource_control rc_5 max_cpu 5; SET polar_resource_control rc_5 FOR query {connection_id_1}; SET polar_resource_control rc_5 FOR query {connection_id_2};
大查询进行限制之后,集群整体CPU使用率下降的统计图:
执行如下代码,分别对2个大查询解除限制:
-- 对query 解除resource control限制 RELEASE polar_resource_control rc_5 FOR query {connection_id_1}; RELEASE polar_resource_control rc_5 FOR query {connection_id_2};
大查询解除限制之后,集群整体CPU上升至原来水平:
以连接维度限制CPU资源
在长会话场景过程中,可以使用Resource Control按照Connection维度限制其中所有查询可以使用的资源。
执行如下代码,模拟大查询:
CREATE database rc_test; USE rc_test; CREATE TABLE t1(id INT NOT NULL auto_increment PRIMARY KEY, name VARCHAR(10)); INSERT INTO t1(name) VALUES('aaaaaaaaaa'); INSERT INTO t1(name) SELECT name FROM t1; -- 重复执行20次此SQL -- 在2个客户端分别同时执行,模拟产生2条大查询 SELECT COUNT(*) FROM t1 A JOIN t1 B ON a.name = B.name;
执行如下代码,获取2个大查询的Connection ID:
SHOW processlist;
执行如下代码,创建
rc_5
用来限制大查询:CREATE polar_resource_control rc_5 max_cpu 5; SET polar_resource_control rc_5 FOR connection {connection_id_1}; SET polar_resource_control rc_5 FOR connection {connection_id_2};
大查询进行限制之后,集群整体CPU使用率下降的统计图:
说明如上图所示,对2个Connection进行资源限制后,集群整体的CPU占用率有明显下降(15:28:25之后)。手动中断2个大查询后(15:30:35之后),再次执行2个大查询(15:31:40之后),集群整体的CPU占用率仍然受到限制。
执行如下代码,分别对2个大查询解除限制:
-- 对connection 解除resource control限制 RELEASE polar_resource_control rc_5 FOR connection {connection_id_1}; RELEASE polar_resource_control rc_5 FOR connection {connection_id_2};
大查询解除限制之后,集群整体CPU上升至原来水平: