资源管理使用示例

本文将通过操作示例向您介绍如何使用资源管理。

注意事项

说明

如有资源隔离的需求,可联系工作人员后台开启参数。目前资源隔离仅在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

    说明

    关于配置集群参数的具体操作,请参见参数配置

测试准备

重要

以下操作中的Sysbench测试相关内容均在ECS实例中执行。

以下操作中的数据库内容均为高权限账号登录数据库后执行。更多信息,请参见连接数据库账号管理

创建数据库用户和数据库

执行如下代码,创建2个用户user_1user_2,2个数据库database_1database_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_1database_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;

执行测试

重要

以下操作中的Sysbench测试相关内容均在ECS实例中执行。

以下操作中的数据库内容均为高权限账号登录数据库后执行。更多信息,请参见连接数据库账号管理

以数据库用户维度限制CPU资源

  1. 执行如下代码,分别启动2个Sysbench测试,使用user_1分别在database_1database_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
  2. 执行如下代码,在Sysbench测试过程中依次将user_1rc_1rc_2rc_3rc_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;
  3. 下图为Sysbench测试过程中,统计的RW节点和RO节点的CPU使用率和QPS的统计图:

    image

    image

    说明

    如上图所示CPU使用率以及QPS都随着user_1绑定的Resource Control的变化而变化(例如rc_1的CPU最大为20,rc_2的CPU最大为50)。通过绑定不同CPU资源的Resource Control可以对user_1所能使用的CPU资源进行有效控制。

以数据库维度限制CPU资源

  1. 执行如下代码,启动2个Sysbench测试,分别使用user_1user_2database_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
  2. 执行如下代码,在Sysbench测试过程中,依次将database_1rc_1rc_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;
  3. Sysbench测试过程中,统计的RW节点和RO节点的CPU使用率和QPS的统计图:

    image

    image

    说明

    如上图所示CPU使用率以及QPS都随着database_1绑定的Resource Control的变化而变化(例如rc_1的CPU最大为20,rc_2的CPU最大为50)。通过绑定不同CPU资源的Resource Control可以对database_1所能使用的CPU资源进行有效控制。

单条查询维度限制CPU资源

说明

使用Resource Control可以对单条查询进行资源限制,当这个查询执行结束后,限制会自动结束,后续同一个连接(Connection)中的查询不受影响。

  1. 执行如下代码,模拟大查询:

    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. 执行如下代码,获取2个大查询的Connection ID:

    SHOW processlist;
  3. 执行如下代码,创建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};
  4. 大查询进行限制之后,集群整体CPU使用率下降的统计图:

    image.png

  5. 执行如下代码,分别对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上升至原来水平:

    image

连接维度限制CPU资源

说明

在长会话场景过程中,可以使用Resource Control按照Connection维度限制其中所有查询可以使用的资源。

  1. 执行如下代码,模拟大查询:

    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. 执行如下代码,获取2个大查询的Connection ID:

    SHOW processlist;
  3. 执行如下代码,创建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};
  4. 大查询进行限制之后,集群整体CPU使用率下降的统计图:

    image

    说明

    如上图所示,对2个Connection进行资源限制后,集群整体的CPU占用率有明显下降(15:28:25之后)。手动中断2个大查询后(15:30:35之后),再次执行2个大查询(15:31:40之后),集群整体的CPU占用率仍然受到限制。

  5. 执行如下代码,分别对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上升至原来水平:

    image